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
혹시 더 좋은 풀이나 조언이 있다면 댓글 달아주시거나
nsk324@naver.com으로 메일 보내주십시오!
'파이썬알고리즘 > SW Expert Academy' 카테고리의 다른 글
[ SW Expert Academy / 2819] 격자판의 숫자 이어 붙이기 (0) | 2020.03.05 |
---|---|
[ SW Expert Academy / 1865] 동철이의 일 분배 (0) | 2020.03.04 |
[ SW Expert Academy / 1861] 정사각형 방 (0) | 2020.03.03 |
[ SW Expert Academy / 1949 ] 등산로 조성 (0) | 2020.01.08 |
[SW Expert Academy / 5658] 벽돌 깨기 (0) | 2020.01.05 |