[BOJ] 2659 십자카드 문제(python)
문제
위와 같은 십자모양의 한 장의 카드에서, 네 모서리에 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개가 시계 방향으로 입력된다. 각 숫자 사이에는 빈칸이 하나 있다.
출력
입력된 카드의 시계수가 모든 시계수들 중에서 몇 번째로 작은 시계수인지를 출력한다.
풀이
처음에는 입력된 4개의 숫자 중 가장 작은 값의 위치를 찾고, 그 위치에서부터 쭉 받아 4자리 수를 만들어 문제를 풀고자 했다.
def get_clock_num(n):
start_idx = n.index(min(n)) # 최소값 index 받아옴
clock_num = ''.join(map(str, n[start_idx:])) # 최소값 위치부터 끝까지 합치기
# 최소값 위치 앞에도 숫자가 있으면 순서대로 받아와서 연결
if n[:start_idx]:
clock_num += ''.join(map(str, n[:start_idx]))
return int(clock_num)
위와 같이 풀어봤을 때 계속 틀렸었는데, 디버깅을 해보니 입력으로 [2, 1, 1, 2]
가 들어왔을 때 시계수에 포함이 안되는 1121을 포함시키고 있었다.
최소값인 1의 인덱스가 0이라서 1, 1, 2, 1
순으로 숫자를 연결하고 1121도 시계수로 인식해버리는 상황이였다.
그래서 고민을 좀 해본 결과 숫자 4개가 입력되고, 시계수를 만들 수 있는 경우는 해봐야 4 종류밖에 안되었다. 입력된 순서 그대로 만드는 경우를 제외하면 3번 밖에 안되니 그냥 무식한 방법으로 시계수를 찾게 구현했다.
(아마 좀 더 깔끔한 방법이 있긴 할 것 같은데 요즘 잠을 4시간 정도 밖에 못자다보니 머리가 안굴러간다...)
import sys
# 숫자 입력
nums = list(map(int, sys.stdin.readline().split()))
# 시계수 찾기
def get_clock_num(n):
min = int(''.join(map(str, n)))
for i in range(1,4):
tmp = int(''.join(map(str, n[i:]+n[:i])))
if min > tmp:
min = tmp
return min
clk_num = get_clock_num(nums)
cnt = 1
# 1111부터 clk_num까지의 시계수 갯수 count
for i in range(1111, clk_num):
if '0' not in list(str(i)) and i == get_clock_num(list(map(int, str(i)))):
cnt += 1
print(cnt)
Author And Source
이 문제에 관하여([BOJ] 2659 십자카드 문제(python)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@mooncy0421/BOJ-2659-십자카드-문제python저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)