개발 기록

[알고리즘|파이썬] 백준 2659 십자카드 문제 본문

알고리즘

[알고리즘|파이썬] 백준 2659 십자카드 문제

따오잉 2025. 2. 20. 23:28

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

 

📌 문제 탐색하기

시간 제한: 1초
메모리 제한: 128 MB

📌 풀이하기 

입력으로 주어진 카드의 시계수를 계산하여, 그 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 알아내시오

시계수: 카드의 숫자들을 시계 방향으로 읽어서 만들어지는 네 자리 수들 중에서 가장 작은 수

주어지는 4개의 숫자는 1 이상 9 이하의 숫자


📌 코드 설계하기

1. 입력된 숫자들의 시계수 계산

4개의 숫자로 만들 수 있는 4가지 회전 형태를 구한다.

그중 가장 작은 값(시계수) 을 선택한다.

 

2. 모든 가능한 시계수를 구하고 정렬

1111부터 9999까지 가능한 모든 4자리 조합을 만들고,

각 조합의 시계수를 계산한 후, 중복을 제거하여 저장한다.

저장한 시계수 리스트를 오름차순 정렬한다.

 

3. 입력된 시계수의 순위 찾기

정렬된 시계수 리스트에서 입력된 시계수의 위치(index + 1) 를 출력한다.


📌 시도 회차 수정 사항

1회차: 틀렸습니다

처음 구현할때 시계수가 _ _ _ _ 4 자리 수라고 할때

첫째자리는 둘째자리보다 작거나 같고,

둘째자리는 셋째자리보다 작거나 같고,

셋째자리는 넷째자리보다 작거나 같다

라고 생각을 잘못했다.

a, b, c, d = 1, 1, 1, 1
clock_number = list()
for a in range(1, 10):
    for b in range(a, 10):
        for c in range(b, 10):
            for d in range(c, 10):
                clock_number.append(int(str(a)+str(b)+str(c)+str(d)))

이렇게 시계수를 구하는 경우에는 3 2 2 7 이 주어졌을 때 2 2 7 3 이 시계수이지만,

정렬 후 구하게 되면, 2 2 3 7이 시계수가 된다.

즉 내가 빠트린 조건은 4개의 숫자의 순서를 지켜야한다는 것이다.

이 부분을 고려하여 다시 시계수 리스트를 구하여 풀었다. 


📌 정답 코드

def get_clock_number(numbers):
    rotations = [
        int("".join(map(str, numbers))),
        int("".join(map(str, numbers[1:] + numbers[:1]))),
        int("".join(map(str, numbers[2:] + numbers[:2]))),
        int("".join(map(str, numbers[3:] + numbers[:3]))),
    ]
    return min(rotations)

input_list = list(map(int, input().split()))

clock_number = get_clock_number(input_list)

unique_clock_numbers = set()
for a in range(1, 10):
    for b in range(1, 10):
        for c in range(1, 10):
            for d in range(1, 10):
                unique_clock_numbers.add(get_clock_number([a, b, c, d]))

sorted_clock_numbers = sorted(unique_clock_numbers)
print(sorted_clock_numbers.index(clock_number) + 1)