본문 바로가기

파이썬알고리즘/SW Expert Academy

[SW Expert Academy / 5658] 보물상자 비밀번호

1. 문제이해

입력값:
N (4의 배수, 8이상 28이하) , K (K번째로 큰 수)
N개의 숫자 (0이상 F이하 16진수)

유의해야 할 점:
보물 '상자' 이므로 4면이 존재하게 된다.
비밀번호는 시계방향으로 1칸씩 움직일수 있다.
N이 4의 배수인 이유!! 한 면에 N//4개의 숫자들이 위치해 있다!
따라서 0번 ~~ N//4-1번 움직이는 경우만 보아도 전체 비밀번호 가짓수를 구할 수 있다.
(이걸 몰라서 해맸음!)

출력값:
전체 비밀번호 중 오름차순으로 했을 때, K번째로 큰 수 ( 중복없이)

 

2. 문제 풀이 법

사용한 방법:
 16진수를 10진수로 바꾸는 방법

1. 시작을 한 칸씩 미루면서 시계방향으로 움직이는것처럼 하려고 처음에 입력받는 비밀번호를 2번 반복해서 받았다.  
2. 총 N//4 번 돌리게 된다.

solve 함수에서 하는 일:
보물상자의 각 면에있는 숫자를 10진수로 바꿔주고 저장해준다.

 

3. 어려웠던 점

16진수 계산이 어렵다 혹시 이것보다 더 쉬운 방법이 있을지 모르겠다. 찾아보고 내일 추가해야겠다!
그리고 인덱스도 조금 햇갈린다.
import sys
sys.stdin = open('5658.txt')
T = int(input())

def solve(r): # 회차별 나오는 결과
    for i in range(r,N+r,M):
        temp_16num = numbers[i:i+M]
        temp_num = 0
        for j in range(M):
            t = ord(temp_16num[j])
            if 48 <= t <= 57:
                temp_num += (ord(temp_16num[j])-48) * (16**(M-1-j))   

            else:
                temp_num += (ord(temp_16num[j])-55) * (16**(M-1-j))

        result.append(temp_num)
    # print('끝')


for tc in range(1,T+1):
    N, K = map(int,input().split())
    M = N // 4
    
    numbers = 2*input()
    result = []

    for i in range(M):
        solve(i)

    print('#{} {}'.format(tc,sorted(set(result))[-K]))

 

4. 배운 점

ord() 함수
'0' -> 48
'1' -> 49
...
'9' -> 57

'A' ->65

 

1시간 20분 걸렸습니다. 흑흑 

혹시 더 좋은 풀이나 조언이 있다면 댓글 달아주시거나 

nsk324@naver.com으로 메일 보내주십시오!