[Silver III] 십자카드 문제 - 2659
성능 요약
메모리: 11584 KB, 시간: 80 ms
분류
브루트포스 알고리즘, 구현, 정렬
제출 일자
2023년 12월 13일 15:02:37
문제 설명
위와 같은 십자모양의 한 장의 카드에서, 네 모서리에 1 이상 9 이하의 숫자가 하나씩 씌여 있다. 이 네 개의 숫자 중에는 같은 숫자도 있을 수 있다.
모든 가능한 십자 카드가 주어질 때, 각각의 카드는 다음과 같은 '시계수'라는 번호를 가진다. 시계수는 카드의 숫자들을 시계 방향으로 읽어서 만들어지는 네 자리 수들 중에서 가장 작은 수이다. 위 그림의 카드는 시계방향으로 3227, 2273, 2732, 7322로 읽을 수 있으므로, 이 카드의 시계수는 가장 작은 수인 2273이다.
입력으로 주어진 카드의 시계수를 계산하여, 그 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 알아내는 프로그램을 작성하시오.
예를 들어서, 다음과 같은 십자 카드의 시계수는 1122이며, 이 시계수보다 작은 시계수들은 1111, 1112, 1113, 1114, 1115, 1116, 1117, 1118, 1119 뿐이므로 1122는 10번째로 작은 시계수다. (여기서 십자카드는 0 이 나타날 수 없으므로 1120은 시계수가 될 수 없다. 또한 1121 이 적혀있는 카드의 시계수는 1112이므로, 1121은 시계수가 될 수 없다.
입력
입력은 한 줄로 이루어지며, 이 한 줄은 카드의 네 모서리에 씌여있는 1 이상 9 이하의 숫자 4개가 시계 방향으로 입력된다. 각 숫자 사이에는 빈칸이 하나 있다.
출력
입력된 카드의 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 출력한다.
풀이 방법
1. 주어진 숫자의 최소 시계값을 먼저 구한다.
2. 네자리수가 최대이기때문에 10000밖에 안걸리기때문에 직접 구해줌(1111 ~ 9999까지의 시계 수)
3. 시계수를 구한 뒤 1111부터 최소 시계값까지 범위를 구하고 count를 증가(포함하는 이유는 순서를 구해야하기 때문에)
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int[] nums = new int[4];
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i = 0; i < nums.length; i++){
nums[i] = Integer.parseInt(st.nextToken());
}
// 주어진 숫자의 최소 시계값 구하기
int min = getMin(nums[0], nums[1], nums[2], nums[3]);
// 1111 ~ 9999 시계값 구하기
boolean[] visit = getClockNum();
int count = 0;
// 111부터 최소 시계값까지 시계값이 존재하면 count증가
// min을 포함하는 이유는? 순서를 구해야하기 때문에
for(int i = 1111; i <= min; i++){
if(visit[i]){
count++;
}
}
System.out.println(count);
}
private static boolean[] getClockNum() {
boolean[] visit = new boolean[10000];
// 1111 ~ 9999까지 시계값을 구한 뒤 방문처리
for(int a = 1; a <= 9; a++){
for(int b = 1; b <= 9 ; b++){
for(int c= 1; c <= 9; c++){
for (int d = 1; d <= 9; d++) {
int n = getMin(a, b, c, d);
if(!visit[n]){
visit[n] = true;
}
}
}
}
}
return visit;
}
private static int getMin(int a, int b, int c, int d){
int answer = Integer.MAX_VALUE;
// 경우의 수를 계산해줌
answer = Math.min(answer, a * 1000 + b * 100 + c * 10 + d);
answer = Math.min(answer, b * 1000 + c * 100 + d * 10 + a);
answer = Math.min(answer, c * 1000 + d * 100 + a * 10 + b);
answer = Math.min(answer, d * 1000 + a * 100 + b * 10 + c);
return answer;
}
}
'알고리즘 - Baekjoon > Silver' 카테고리의 다른 글
[백준] 18111번 : 마인크래프트 Silver2(실버2) - JAVA[자바] (0) | 2023.12.15 |
---|---|
[백준] 1676번 : 팩토리얼 0의 개수 Silver5(실버5) - JAVA[자바] (0) | 2023.12.13 |
[백준] 2630번 : 색종이 만들기 Silver2(실버2) - JAVA[자바] (0) | 2023.12.12 |
[백준] 14940번 : 쉬운 최단거리 Silver1(실버1) - JAVA[자바] (0) | 2023.12.12 |
[백준] 10431번 : 줄세우기 Silver5(실버5) - JAVA[자바] (1) | 2023.12.11 |