알고리즘(Algorithm)/백준(Baekjoon)

[백준 Baekjoon] 2659번 십자카드 문제 - JAVA

나아가는중 2021. 12. 13. 23:24
반응형

문제 풀이

십자모양의 카드의 네 모서리 숫자의 시계수가 모든 시계수 중에서 몇 번째로 작은 시계수인지 출력하는 문제이다.

 

시계수란 카드의 모서리 숫자를 시계 방향으로 읽어 만들어지는 네 자리 수들 중에서 가장 작은 수이다.

getMin() 함수가 시계수를 구하는 함수이다. 각 모서리에서 읽어 만드는 수 중에서 가장 작은 수를 리턴한다.

 

다음으로 모든 시계수 숫자를 찾는다. 0이 나타날 수 없으므로 1111 ~ 9999를 한번에 탐색하는 것이 아닌 각 자리수를 1 ~ 9까지 순회하며 시계수를 찾는다.

 

찾은 모든 시계수 중에 입력으로 주어진 숫자의 시계수 보다 작은 수를 카운트하여 출력한다.

 

소스 코드

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

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

        StringTokenizer st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        int c = Integer.parseInt(st.nextToken());
        int d = Integer.parseInt(st.nextToken());

        int min = getMin(a, b, c, d);

        boolean[] clock_num = getClockNum();

        int answer = 0;
        for (int i = 1111; i <= min; i++) {
            if (clock_num[i]) {
                answer++;
            }
        }

        System.out.println(answer);
    }

    public static boolean[] getClockNum() {
        boolean[] visit = new boolean[10000];

        for (int a = 1; a < 10; a++) {
            for (int b = 1; b < 10; b++) {
                for (int c = 1; c < 10; c++) {
                    for (int d = 1; d < 10; d++) {
                        int n = getMin(a, b, c, d);

                        if (!visit[n]) {
                            visit[n] = true;
                        }
                    }
                }
            }
        }

        return visit;
    }

    public static int getMin(int a, int b, int c, int d) {
        int min = Integer.MAX_VALUE;

        min = Math.min(min, a * 1000 + b * 100 + c * 10 + d);
        min = Math.min(min, b * 1000 + c * 100 + d * 10 + a);
        min = Math.min(min, c * 1000 + d * 100 + a * 10 + b);
        min = Math.min(min, d * 1000 + a * 100 + b * 10 + c);

        return min;
    }
}

 

반응형