주어진 카드의 시계수를 계산하고, 해당 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인가?
// 입력
2 1 1 2
// 시계수
1122
// 출력
10
[getClockNum(x1, x2, x3, x4) 함수]
: 4개의 숫자를 입력받아 시계수를 반환하는 함수
입력된 네 자리 숫자를 회전시켜 만들 수 있는 4개의 수를 배열에 저장
배열에서 가장 작은 값(시계수 반환)
[containsZero(num) 함수]
: 숫자가 0을 포함하는지 체크하는 함수
num의 각 자릿수를 추출하여 이 중 하나라도 0이면 true를 반환하고, 아니면 false를 반환
[main 함수]
1) 4개의 숫자 입력받기
2) 시계수 구하기
// 4개의 숫자 전달호출
getClockNum(x1, x2, x3, x4)
3) 시계수는 몇번째인가? (count변수)
for루프: 1111 ~ 9999 {
// 0이 들어있으면 시계수 안 구함
containsZero(num)
// 나머지 숫자: 시계수 찾기
// 각 자리수 분리해서 시계수 구하는 함수로 전달
getClockNum(y1, y2, y3, y4)
// 중복되는 시계수는 counted(boolean)[]로 체크
// 처음 나온 시계수면 count ++;
// 시계수가 이미 카운트 되었으면 카운트하지 않고 넘어가기
}
4) 출력
import java.util.Scanner;
public class Solution2 {
// num에 0이 포함되어 있는지 확인
public static boolean containsZero(int num) {
int x1 = num / 1000;
int x2 = (num / 100) % 10;
int x3 = (num / 10) % 10;
int x4 = num % 10;
return x1 == 0 || x2 == 0 || x3 == 0 || x4 == 0;
}
// 가장 작은 시계수 반환
public static int getClockNum(int x1, int x2, int x3, int x4) {
int[] arr = {
x1 * 1000 + x2 * 100 + x3 * 10 + x4,
x2 * 1000 + x3 * 100 + x4 * 10 + x1,
x3 * 1000 + x4 * 100 + x1 * 10 + x2,
x4 * 1000 + x1 * 100 + x2 * 10 + x3
};
int min = arr[0];
for (int i = 1; i < 4; i++) {
if (arr[i] < min) min = arr[i];
}
return min;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 사용자 입력받기
int x1 = sc.nextInt();
int x2 = sc.nextInt();
int x3 = sc.nextInt();
int x4 = sc.nextInt();
// 가장 작은 시계수 반환
int clockNum= getClockNum(x1, x2, x3, x4);
//System.out.println(clockNum);
// 시계수 순서구하기
boolean[] counted = new boolean[10000];
int count = 0;
for(int i =1111; i<=9999; i++) {
// 0 포함 x
if(containsZero(i)) continue;
// 시계수인가?
int y1 = i / 1000;
int y2 = (i/100) % 10;
int y3 = (i/10) % 10;
int y4 = i % 10;
int currentClockNum = getClockNum(y1, y2, y3, y4);
if(!counted[currentClockNum]) {
counted[currentClockNum] = true;
count ++;
}
if(currentClockNum == clockNum) break;
}
System.out.println(count);
}
}
1) 시계수 순서 계산, 왜 9999까지 다 순회해야 하지??
처음에 이 문제를 풀 때, "왜 9999까지 모두 순회해야 하지? 찾는 clockNum이 나오면 바로 끝내고 출력하면 되는 거 아닌가?"라는 의문
저도 이 부분에서 잠시 혼란이 있었다.
하지만 시계수는 입력값 자체의 순서가 아니라, 입력값의 시계수의 순서를 순회하면서 비교해야 하는 것을 gpt를 통해 깨달았다.
2) 시계수의 순서에서 중복은 어떻게 처리해야 하지??