보물창고 블로그

SW Expert Academy 5658. [모의 SW 역량테스트] 보물상자 비밀번호 풀이 With Python 본문

알고리즘 풀이/SW Expert Academy

SW Expert Academy 5658. [모의 SW 역량테스트] 보물상자 비밀번호 풀이 With Python

홋 메 2020. 3. 26. 14:03
728x90

문제 링크: https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo&categoryId=AWXRUN9KfZ8DFAUo&categoryType=CODE

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com

이 문제의 핵심은 총 4번 회전시키되, 처음에 주어진 숫자들을 4로 나눈 값만큼을 16진수 수로 변환해야한다. 나는 A~F는 예외처리하고 나머지는 int로 변환하여 값을 더하였다. 이번 문제의 핵심은 16진수인 수를 10진수 수로 변환하는 것이 핵심이다. 문제를 풀고 나중에 알게 되었지만, 16진수로 변환하려면 int('0x16진수',16)을 사용하면 쉽게 16진수를 10진수로 변환할 수 있다는 것을 알게 되었다. 다음은 내가 해결한 코드이다.

from collections import deque


def solution(numbers, k, number):
    list1 = []
    # number만큼 로테이트
    for _ in range(number):
        s = ''.join(numbers)
        for i in range(4):
            sub = s[i * number:(i + 1) * number]
            l = len(sub)
            num = 0
            for j in range(l - 1, -1, -1):
                if sub[j] == 'A':
                    num += 10 * pow(16, l - j - 1)
                elif sub[j] == 'B':
                    num += 11 * pow(16, l - j - 1)
                elif sub[j] == 'C':
                    num += 12 * pow(16, l - j - 1)
                elif sub[j] == 'D':
                    num += 13 * pow(16, l - j - 1)
                elif sub[j] == 'E':
                    num += 14 * pow(16, l - j - 1)
                elif sub[j] == 'F':
                    num += 15 * pow(16, l - j - 1)
                else:
                    num += int(sub[j]) * pow(16, l - j - 1)
            list1.append(num)
        numbers.rotate(1)
    list1 = set(list1)
    list1=sorted(list1,reverse=True)
    return list1[k-1]


t = int(input())
for test in range(1, t + 1):
    n, k = map(int, input().split())
    number = n // 4
    numbers = deque(input())
    answer=solution(numbers,k,number)
    print('#{} {}'.format(test,answer))

 

Comments