코딩문제풀이/Baekjoon

[Java] 백준 7490번 : 0 만들기*

코딩하는 포메라니안 2022. 12. 5. 22:36

1. 문제

https://www.acmicpc.net/problem/7490

 

7490번: 0 만들기

각 테스트 케이스에 대해 ASCII 순서에 따라 결과가 0이 되는 모든 수식을 출력한다. 각 테스트 케이스의 결과는 한 줄을 띄워 구분한다.

www.acmicpc.net

 

 

2. 풀이과정

방법1. 연산자를 N-1개 고르고, 연산 결과 0이면 StringBuilder로 합치기

더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

    static int N;
    static StringBuilder sb;
    static char operation[] = {' ', '+','-'}, selected[];
    
    public static void make(int cnt){
        if(cnt >= N-1){
            if(calculate() == 0){
                for(int i=1; i<N; i++){
                    sb.append(i).append(selected[i-1]);
                }
                sb.append(N).append('\n');
            }
            return;
        }

        for(int i=0; i<3; i++){
            selected[cnt] = operation[i];
            make(cnt+1);
        }

    }

    public static int calculate(){
        int result = 0, temp = 0, order = 1;
        for(int i=N; i>1; i--){
            temp += i*order;
            switch (selected[i-2]){
                case '+':
                    result += temp;
                    temp = 0;
                    order = 1;
                    break;
                case '-':
                    result -= temp;
                    temp = 0;
                    order = 1;
                    break;
                case ' ':
                    order *= 10;
                    break;
            }

        }
        result += order + temp;
        return result;
    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        sb = new StringBuilder();
        int T = Integer.parseInt(br.readLine());
        while(T-- > 0){
            N = Integer.parseInt(br.readLine());
            selected = new char[N-1];
            make(0);
            sb.append('\n');
        }
        System.out.println(sb.toString());
    }
}

 

결과

 

방법2. 재귀로 바로 계산하면서 문자열 합치기

더보기
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

    static int N;
    static StringBuilder sb;

    public static void make(int now, int sign, int result, int temp, String exp){
        if(now >= N){
            result += sign*temp;
            if(result==0){
                sb.append(exp).append('\n');
            }
            return;
        }
        make(now+1, sign, result, temp*10 + (now+1), exp+' '+(now+1));
        make(now+1, 1, result+sign*temp, now+1, exp+'+'+(now+1));
        make(now+1, -1, result+sign*temp, now+1, exp+'-'+(now+1));

    }

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        sb = new StringBuilder();
        int T = Integer.parseInt(br.readLine());
        while(T-- > 0){
            N = Integer.parseInt(br.readLine());
            make(1, 1, 0, 1, "1");
            sb.append('\n');
        }
        System.out.println(sb.toString());
    }
}

 

결과