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 clock_num(n):
s = str(n)
rotations = [int(s[i:] + s[:i]) for i in range(4)]
return min(rotations)
clock_number = set(clock_num(i) for i in range(1111, 10000) if '0' not in str(i))
clock_number = sorted(clock_number)
n = input().split()
n = int("".join(n))
result = clock_num(n)
print(clock_number.index(result)+1)
풀이
1. clock_num 함수: 주어진 4자리 수에서 가능한 회전값을 생성하고, 그 중 가장 작은 값을 반환함.
2. clock_number 변수에 1111~9999 범위에서의 각 시계수를 저장하고 중복을 제거한 후 정렬함.
3. 입력받은 수의 시계수를 구하고, clock_number 리스트에서 몇 번째인지 확인함.
'Program Solving > Python' 카테고리의 다른 글
[BOJ/Python] 2133번: 타일 채우기 | DP bottom-up (0) | 2025.03.30 |
---|---|
[BOJ/Python] 11054번: 가장 긴 바이토닉 부분 수열 | LBS (0) | 2025.03.28 |
[BOJ/Python] 11444번: 피보나치 수 6 | 도가뉴 항등식 (0) | 2025.02.08 |
[BOJ/Python] 4948번: 베르트랑 공준 | 에라토스테네스의 체 (0) | 2025.02.06 |
[BOJ/Python] 1934: 최소공배수 | 유클리드 호제법 (Euclidean Algorithm) (0) | 2025.02.03 |