알고리즘
[알고리즘|파이썬] 백준 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)