Algorithm/baekjoon

맞춰봐

마닐라 2022. 2. 6. 15:00

📍 문제 설명

 

💡 접근

1.주어진 문자열을 S[i][j]의 위치에 맞게 넣는다.

2.규현이가 아는 숫자 -10 ~ 10을 탐색한다.

3.현재 인덱스에 사용할 숫자를 기록한다.

4.현재까지의 인덱스까지의 합이 S[i][j]의 값과 맞는지 비교한다.

5.여기까지 통과하면 다음 인덱스 숫자를 구해본다.

6.N개의 숫자를 구했으면 답을 하나만 출력하기 위해 바로 종료시킨다.

 

 

👩‍💻 코드

import java.util.*;

public class Main {
    static int n, m, sum, answer;
    static char[][] board,clone;
    static char[] c;
    static int[] arr;
    static boolean[] visited;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    public static void main(String[] args) {
        Scanner kb = new Scanner(System.in);
        Main T = new Main();
        n = kb.nextInt();
        kb.nextLine();
        c = kb.nextLine().toCharArray();
        int idx = 0;
        board = new char[n][n];

        //문자열로 주어진 S[i][j]를 기록
        for(int i = 0; i < n; i++) {
            for(int j = i; j < n; j++) {
                board[i][j] = c[idx++];
            }
        }
        //수열의 원소 담을 배열
        arr = new int[n];
        T.solution(0);
    }

    private void solution(int L) {
        //올바른 숫자 4개 뽑음
        if(L == n) {
            for(int x : arr) System.out.print(x + " ");
            System.out.println();
        }
        else {
            //규현이가 아는 모든 숫자에 대해서 탐색
            for(int i = -10; i <= 10; i++) {
                //현재 인덱스의 숫자를 기록
                arr[L] = i;
                //기록한 인덱스까지 올바른 부호를 가지고 있는지 확인
                if(check(L)) solution(L+1);
            }
        }
    }

    private boolean check(int L) {
        for(int i = 0; i <= L; i++) {
            int sum = 0;
            for(int j = i; j <= L; j++) {
                sum += arr[j];
                //board에 담겨있는 부호와 다르면 false
                if(board[i][j] != (sum == 0 ? '0' : (sum > 0 ? '+' : '-'))) {
                    return false;
                }
            }
        }
        return true;
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

외판원 순회 2  (0) 2022.02.06
차이를 최대로  (0) 2022.02.06
부등호  (0) 2022.02.06
링크와 스타트  (0) 2022.02.06
퇴사  (0) 2022.02.05