백준 2529번 - 부등호 [JAVA]

TaeBong·2023년 1월 12일
1

알고리즘 풀이

목록 보기
14/14

🧩 문제


▶ 백준 2529 부등호 바로가기

두 종류의 부등호 기호 ‘<’와 ‘>’가 k개 나열된 순서열 A가 있다. 우리는 이 부등호 기호 앞뒤에 서로 다른 한 자릿수 숫자를 넣어서 모든 부등호 관계를 만족시키려고 한다. 예를 들어, 제시된 부등호 순서열 A가 다음과 같다고 하자.

A ⇒ < < < > < < > < >

부등호 기호 앞뒤에 넣을 수 있는 숫자는 0부터 9까지의 정수이며 선택된 숫자는 모두 달라야 한다. 아래는 부등호 순서열 A를 만족시키는 한 예이다.

3 < 4 < 5 < 6 > 1 < 2 < 8 > 7 < 9 > 0

이 상황에서 부등호 기호를 제거한 뒤, 숫자를 모두 붙이면 하나의 수를 만들 수 있는데 이 수를 주어진 부등호 관계를 만족시키는 정수라고 한다. 그런데 주어진 부등호 관계를 만족하는 정수는 하나 이상 존재한다. 예를 들어 3456128790 뿐만 아니라 5689023174도 아래와 같이 부등호 관계 A를 만족시킨다.

5 < 6 < 8 < 9 > 0 < 2 < 3 > 1 < 7 > 4

여러분은 제시된 k개의 부등호 순서를 만족하는 (k+1)자리의 정수 중에서 최댓값과 최솟값을 찾아야 한다. 앞서 설명한 대로 각 부등호의 앞뒤에 들어가는 숫자는 { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }중에서 선택해야 하며 선택된 숫자는 모두 달라야 한다.

입력


첫 줄에 부등호 문자의 개수를 나타내는 정수 k가 주어진다. 그 다음 줄에는 k개의 부등호 기호가 하나의 공백을 두고 한 줄에 모두 제시된다. k의 범위는 2 ≤ k ≤ 9 이다.

출력


여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력에 답은 항상 존재하며 출력 정수는 하나의 문자열이 되도록 해야 한다.

예제


입력

9
> < < < > > > < <

출력

9567843012
1023765489

🎯 풀이


메모리시간코드길이
46592 KB232 ms2420 B
  1. 재귀를 통해서 부등호 개수(K)보다 하나 더 큰 숫자의 배열을 구한다.
  2. isUsed 배열을 통해 숫자가 쓰였는지 확인하는 동시에 isPossible() 함수를 통해서 부등호 이전 숫자와 이후 숫자가 성립하는지 확인한다.
  3. min, max와 비교하여 해당하는 값일 시에 저장한다. 단, 출력결과는 021 같은 형식이므로 String 형식으로 출력한다. 또한 부등호가 9개가 될 경우 숫자가 int의 범위가 넘어갈 수 있으므로 long을 사용한다.

⭐️ 전체 풀이 코드


package S1;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class BJ2529_부등호 {
    private static Long min = Long.MAX_VALUE;
    private static String minString = "";

    private static Long max = Long.MIN_VALUE;
    private static String maxString = "";
    private static String[] inequality; //부등호 저장
    private static int[] num;   //숫자 저장
    private static boolean[] isUsed = new boolean[10];  //숫자가 사용됐는지

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

        int K = Integer.parseInt(st.nextToken());
        inequality = new String[K];
        num = new int[K+1];

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

        for(int i = 0; i < 10; i++) {
            Arrays.fill(isUsed, false);
            isUsed[i] = true;
            num[0] = i;
            go(1);
        }

        System.out.println(maxString);
        System.out.println(minString);

    }

    private static void go(int index) {
        if(index == num.length) {
            String stringNum = "";
            for(int i = 0; i < num.length; i++) {
                stringNum += String.valueOf(num[i]);
            }
            Long longNum = Long.parseLong(stringNum);

            if(min > longNum) {
                min = longNum;
                minString = stringNum;
            }
            if(max < longNum) {
                max = longNum;
                maxString = stringNum;
            }

            return;
        }

        for(int i = 0; i < 10; i++) {
            if(!isUsed[i] && isPossible(num[index-1], inequality[index-1], i)) {
                isUsed[i] = true;
                num[index] = i;
                go(index+1);
            } else {
                continue;
            }
            isUsed[i] = false;
        }

    }

    private static boolean isPossible(int num1, String arrow, int num2) {
        if(arrow.equals(">")) {
            if(num1 > num2) return true;
            else return false;
        }
        else {
            if(num1 < num2) return true;
            else return false;
        }

    }
}
profile
봉다리

0개의 댓글