작심 365

[백준 2659번] 십자카드 문제 - (java) 본문

코테/백준

[백준 2659번] 십자카드 문제 - (java)

eunKyung KIM 2024. 12. 19. 23:29

문제 : https://www.acmicpc.net/problem/2659

📌 문제 탐색하기

 

먼저 주어진 카드에서 시계수를 어떻게 구하는지를 생각해보고, 그 카드로 만든 시계수가 1111 ~ 9999 까지의 숫자들 중에 시계수 중에서 몇번째로 작은 시계수인지를 구하면 된다.

시계수를 구하는 방법은 입력받은 숫자를 오른쪽 방향으로 돌면서 모든 가능한 만들 수 있는 수를 확인하면 된다. 항상 4자리 이므로 4번만 반복하면 된다. 시간 소요 x

 

다음은 해당 우리가 만든 시계수가 나올 수 있는 모든 수 중에서 몇번째로 작은지를 구하면 되는데 숫자의 범위가 1111 ~ 9999 로 그렇게 많지 않기때문에 수를 하나씩 확인해봐도 된다. 단 여기서 숫자 0은 없기때문에 0이 들어갔을 때만 카운트에서 제외시키면 된다.

 

📌 코드 설계하기

1. 입력받은 카드 정보로 시계수를 구한다. 

2. 위에서 구한 시계수보다 작은 범위 안에서 존재하는 시계수를 전부 구한다.

이때 시계수 인지를 판단하기 위한 함수를 하나 만들고, 0을 포함하는지도 확인해준다.

 

📌 코드

import java.util.Scanner;

// 십자카드 문제
public class Main {

	private static boolean checkClockNum(String str){ // 해당 숫자가 시계수인지 판별하는 함수
		StringBuilder tmp = new StringBuilder();
		int min_num = 9999;

		for(int i=0; i<4; i++){
			tmp.append(str.charAt(i));
			tmp.append(str.charAt((i+1)%4));
			tmp.append(str.charAt((i+2)%4));
			tmp.append(str.charAt((i+3)%4));


			if(Integer.parseInt(String.valueOf(tmp))<min_num){
				min_num = Integer.parseInt(String.valueOf(tmp));
			}

			tmp = new StringBuilder();

		}

		if(min_num == Integer.parseInt(str)){
			return true;
		}

			return false;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int[] nums = new int[4];

		for (int i = 0; i < 4; i++) {
			nums[i] = sc.nextInt();
		}

		int min_num = 9999;
		int num = 0;
		int count = 0;

		StringBuilder tmp = new StringBuilder();

		for (int i = 0; i < 4; i++) {
			tmp.append(nums[i]);
			tmp.append(nums[(i + 1) % 4]);
			tmp.append(nums[(i + 2) % 4]);
			tmp.append(nums[(i + 3) % 4]);

			num = Integer.parseInt(tmp.toString());
			if (min_num > num) {
				min_num = num;
			}
			tmp = new StringBuilder();
		}
		
		for(int i=1111; i<min_num; i++){
			if(String.valueOf(i).contains("0") || !checkClockNum(String.valueOf(i)))
				continue;

			count+=1;
		}
		System.out.println(count+1);
	}


}
Comments