[Problem Solving] SWEA_2659. 십자카드

do_it·2025년 8월 10일

problem-solving

목록 보기
8/14

🧐 문제 분석

주어진 카드의 시계수를 계산하고, 해당 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인가?

0. 문제 이해

  • 시계수 ?
    4개의 숫자를 시계방향으로 회전시켜 만들 수 있는 수 중 가장 작은 수

1. 입력

// 입력
2 1 1 2 

// 시계수
1122

// 출력
10
  • 네 자리 숫자가 공백으로 구분되어 입력됨
  • 1 <= 각 숫자 <= 9 (중복 허용)

2. 로직

1) 4개의 숫자를 입력받고, 회전조합(시계방향)으로 시계수 찾기

  • 4개의 숫자의 회전 조합 만들기
  • 가장 작은 수 => 시계수

2) 몇 번째 시계수인가? : 시계수 순위 계산

  • 1111 ~ 9999 까지의 수 순회: 모든 4자리 수 탐색
  • 0이 포함된 숫자 제외: 문제의 조건 (0 ~ 9)
  • 생성된 시계수들을 중복 없이 배열에 저장: 9999를 포함하는 배열을 만들고 counted(boolean)타입의 변수로 중복을 제거하며 시계수를 카운트
  • 순위: 입력된 숫자의 시계수가 몇 번째의 위치하는가? => 카운트 값

3. 출력

  • 입력된 숫자의 시계수 순위를 출력 (count)

💭 수도 코드

[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);
	}
}

3. 🤯 ??? & !!!

1) 시계수 순서 계산, 왜 9999까지 다 순회해야 하지??
처음에 이 문제를 풀 때, "왜 9999까지 모두 순회해야 하지? 찾는 clockNum이 나오면 바로 끝내고 출력하면 되는 거 아닌가?"라는 의문
저도 이 부분에서 잠시 혼란이 있었다.
하지만 시계수는 입력값 자체의 순서가 아니라, 입력값의 시계수의 순서를 순회하면서 비교해야 하는 것을 gpt를 통해 깨달았다.
2) 시계수의 순서에서 중복은 어떻게 처리해야 하지??

0개의 댓글