카테고리 없음

백준 [2659 십자카드 문제] 파이썬 풀이

oopt1234 2025. 2. 20. 19:07

📌 문제 탐색하기

  • 십자 모양의 카드의 모서리에 1~9까지 숫자가 쓰여져있을 때, 한 숫자를 기점으로 시계 방향으로 돌렸을 때 얻어지는 수들 중에서 가장 작은 수를 시계수라고 한다.
  • 주어진 입력에 대해서 구할 수 있는 시계수가 모든 시계수 중에서 몇 번째로 작은지 확인해야 한다.
  • 만들 수 있는 시계수를 모두 구해서 리스트에 정렬해두고, 입력으로 받은 값에서 시계수를 찾아 몇 번째로 작은지 구하면 될 것 같다.

💡 알고리즘 선택

  • 브루트포스를 활용하여 1111부터 입력된 값의 시계수까지 시계수를 모두 구해서 리스트로 만들어야 한다.
  • 주어진 값의 시계수를 구하기 위해 각각의 자릿수부터 시계 방향으로 4자리 숫자를 구성한다.
  • 그렇게 구해진 4자리 숫자 4개 중에서 가장 작은 값을 시계수라 판단하고, 시계수를 저장하는 리스트에 추가한다.

📌 코드 설계하기

1. 문제의 input을 받고 join()을 통해 string 형태로 값을 저장한다.

2. input 값의 0, 1, 2, 3번 인덱스부터 각각 시계 방향으로 값을 구해서 inputClock 리스트에 저장한다.

3. inputClock 리스트에서 가장 작은 값이 입력 값에 대한 시계수가 된다.

4. 1111부터 입력 값의 시계수까지 위 과정을 반복하여 각각의 숫자에 대한 시계수를 구하고 clockNum 리스트에 저장한다.

5. clockNum 리스트에서 입력 값의 시계수의 인덱스를 찾아서 출력한다.

📌 시도 회차 수정 사항 (Optional)

1회차

전체 시계수 리스트를 만들 때, 1111~9999까지 모든 네 자리 수에 대한 시계수를 구하게 했었는데

생각해보니 모든 값을 찾을 필요 없이, 입력 값의 시계수까지만 구하면 됐었다.

(사실 9999까지 구해도 시간 초과 에러는 발생하지 않는다..)

 

아무튼 실행 시간을 줄이기 위해서 for i in range(1111, 10000) 에서 for i in range(1111, min(inputClock)+1)로 코드를 수정해줬다.

📌 정답 코드

inputNum = ''.join(input().split())
inputClock = []
for i in range(4):
    temp = int(inputNum[i:] + inputNum[:i])
    inputClock.append(temp)

clockNum = []
for i in range(1111, min(inputClock)+1):
    i = str(i)
    if '0' not in i:
        check = []
        for j in range(4):
            temp = int(i[j:] + i[:j])
            check.append(temp)
        if min(check) not in clockNum:
            clockNum.append(min(check))


print(clockNum.index(min(inputClock)) + 1)