문제

위와 같은 십자모양의 한 장의 카드에서, 네 모서리에 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개가 시계 방향으로 입력된다. 각 숫자 사이에는 빈칸이 하나 있다.
출력
입력된 카드의 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 출력한다.
출처
Olympiad > 한국정보올림피아드 > KOI 1997 > 초등부 2번
! 문제 생각&풀이 !
카드의 번호들을 입력받고 로테이션을 돌렸다. 로테이션을 돌리면서 4번째자리, 3번째자리, 2번째자리, 1번째자리 숫자들을 각각 업데이트 해주었고 그 중에 가장 작은 수를 뽑아내는 모든 경우의 수를 생각했다.
cnt를 증가시킬 때는 1111부터 뽑아낸 가장작은수(for i in range(1111,reulst+1))에서 0은 포함될 수 없으므로 0이 없는 경우 + 현재의 숫자 i에 대해 solve 함수를 호출하여 반환된 값이 원래의 숫자 i와 일치하는지를 확인하고, 일치하면 cnt 값을 증가시켰다.
8번의 트라이 끝에 통과했다. 처음에 틀렸을 때 답은 맞는데 어디 부분이 틀렸는지 찾는데 한참 헤맸다.... 브루트포스 문제는 좀 잘푼다고 생각했는데 다시 초심을 되찾아야겠다..
! Code !
# 십자카드 문제 S3
def solve(r):
Sigyesu = list(map(int, str(r)))
# print(Sigyesu)
rotation = [0, 1, 2, 3] * 4
# print(rotation)
for i in range(4):
update_min = int(Sigyesu[rotation[i+1]]*1000 \
+ Sigyesu[rotation[i+2]]*100 \
+ Sigyesu[rotation[i+3]]*10 \
+ Sigyesu[rotation[i]])
if r > update_min:
r = update_min
return r
# 입력
numbers = int(''.join(input().split()))
# print(numbers)
result = solve(numbers)
# print(result)
cnt = 0
for i in range(1111, result+1): # 1111부터 1122까지
check = list(map(int, str(i)))
# print(check)
if 0 not in check:
if solve(i) == i:
cnt += 1
print(cnt)
'Algorithm' 카테고리의 다른 글
[백준] 새로운 게임 17780번 Python (0) | 2024.07.14 |
---|---|
[백준] 낚시 30461번 Python (0) | 2024.01.16 |
[백준] 옥상 정원 꾸미기 6198번 Python (0) | 2024.01.11 |
[백준] 트리의 부모 찾기 11725번 Python (0) | 2024.01.11 |
[백준] 치킨 배달 15686번 Python (0) | 2024.01.08 |