알고리즘(algorithm)

[백준][Python] 2659 십자카드 문제 - Python

rimrimi 2025. 3. 23. 01:03

문제링크

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

 

 

# 문제

위와 같은 십자모양의 한 장의 카드에서, 네 모서리에 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개가 시계 방향으로 입력된다. 각 숫자 사이에는 빈칸이 하나 있다.

 

# 출력

입력된 카드의 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 출력한다.

 

# 풀이

def change_clock_number(n1, n2, n3, n4) :
    # 시계방향으로 수를 읽으므로, 정렬 함수를 쓰면 안 됨
    clock_num1 = n1 * 1000 + n2 * 100 + n3 * 10 + n4
    clock_num2 = n2 * 1000 + n3 * 100 + n4 * 10 + n1
    clock_num3 = n3 * 1000 + n4 * 100 + n1 * 10 + n2
    clock_num4 = n4 * 1000 + n1 * 100 + n2 * 10 + n3
    clock_nums = [clock_num1, clock_num2, clock_num3, clock_num4]
    return min(clock_nums)

i1, i2, i3, i4 = map(int, input().split())
input_clock = change_clock_number(i1, i2, i3, i4)

is_clock_num = set()
# 0 미포함 주의 할 것
for num1 in range(1, 10) :
    for num2 in range(1, 10) :
        for num3 in range(1, 10) :
            for num4 in range(1, 10) :
                clock_number = change_clock_number(num1, num2, num3, num4)
                is_clock_num.add(clock_number)

sort_clock_num = sorted(is_clock_num)
print(sort_clock_num.index(input_clock) + 1)

1000부터 9999까지 0이 들어가지 않은 숫자의 시계수를 구해야 한다. 위, 오른, 아래, 왼 방향으로 숫자로 읽고 가장 작은 값을 찾아 시계수를 구한다. 겹치는 경우를 제외해야 하므로, set 구조를 이용하였다. 모든 시계수를 담은 set을 오름차순 정렬하여, 입력한 시계수가 몇 번째 시계수인지 index함수로 구한다.