[백준 | Java] 2529 부등호

알린·2024년 3월 30일

baekjoon

목록 보기
42/68

내 풀이

브루트포스의 순열을 활용했다.
풀이과정은 다음과 같다.

  1. idx가 k+1이 될 때 까지 백트래킹을 통해
  2. 부등호에 따른 숫자가 맞는지 판별하여 sb에 문자열로 받기
  3. sb에서 0번째는 가장 작은 수, result.size()-1번째는 가장 큰 수로 출력
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;

public class Main {
    static int k;
    static char[] A;
    static int[] src = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
    static int[] tgt;
    static boolean[] checked = new boolean[src.length];
    static ArrayList<String> result = new ArrayList<>();

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        k = Integer.parseInt(br.readLine());
        A = new char[k];
        tgt = new int[k+1];

        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < k; i++) {
            A[i] = st.nextToken().charAt(0);
        }

        perm(0);

        Collections.sort(result);
        StringBuilder sb = new StringBuilder();
        sb.append(result.get(result.size()-1)).append('\n').append(result.get(0));
        System.out.println(sb);
    }
    static void perm(int idx) {
        if (idx == tgt.length) {
            result.add(makeNum());
            return;
        }
        for (int i = 0; i < src.length; i++) {
            if (idx > 0 && !check(idx, src[i])) {  // 부등호에 따른 순서 틀리면 continue
                continue;
            }
            if (!checked[i]) {
                checked[i] = true;
                tgt[idx] = src[i];
                perm(idx+1);
                checked[i] = false;
            }
        }
    }
    static boolean check(int idx, int num) {  // 부등호 판별
        // 숫자 순서가 맞으면 true, 틀리면 false
        if (A[idx-1] == '<')
            return tgt[idx-1] < num;
        else
            return tgt[idx-1] > num;
    }
    static String makeNum() {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < tgt.length; i++) {
            sb.append(tgt[i]);
        }
        return sb.toString();
    }
}
profile
짱이 되고싶은 개발 기록

0개의 댓글