[SWEA] 5658. 보물상자 비밀번호(Python)

냐항·2021년 12월 6일
0

🥑 간만에 16진수, 10진수를 봐서 꿈뻑꿈뻑

🧃 비트랑 진수 문제 굉장히 헷갈렸는데 잊고 살았다. 다시 봐야징

  1. 16진수를 리스트 형태로 받아오기
  2. 주어진 n을 4번 나눈 수만큼 회전을 해야 함.
  3. 회전 때마다 16진수의 제일 뒷자리를 없애고 그것을 앞에다 붙여줌.
  4. for문을 돌며 16진수를 4등분한 숫자들을 nums라는 set에 담아줌.
  5. nums를 리스트로 변환 후 내림차순 정렬함.
  6. k번째로 큰 수를 골라서 10진수로 변경하기
## ☘16진수를 10진수로 변경하는 방법
int(nums[k-1], 16)
첫번째 인자는 변경하고 싶은 16진수의 숫자, 
두번째 인자는 첫번째 인자가 16진수라는 것을 알려줌
for tc in range(1, int(input())+1):
    n, k = map(int, input().split())
    hexa = list(input())
    
    ## 회전 횟수
    rotate = (n//4)
    ## 받아오는 아이들은 중복이 없어야 함. 
    nums = set()
    ## 해당 횟수만큼 회전을 할 것임 
    for i in range(rotate):
        ## 첫번째 회전을 제외하고서는 숫자 리스트가 한 칸씩 미렬야 함. 
        if i != 0:
            ## 끝을 pop하고 다시 앞에다 insert 해줌.
            a = hexa.pop()
            hexa.insert(0, a)
        for j in range(4):
            ### 리스트 형태로 받아왔기 때문에 join으로 문자열로 바꿔준 후 nums라는 set에 추가해줌. 
            hexa_component = ''.join(hexa[j*rotate:(j+1)*rotate])
            nums.add(hexa_component)
    ## set이기 때문에 다시 list로 변경 후 내림차순 정렬 
    nums = list(nums)
    nums.sort(reverse=True)
    ## k번째 수를 골라 10진수로 변환 
    print('#{} {}'.format(tc, int(nums[k-1], 16)))

16진수 -> 10진수 변환 방법을 잊은 덕에 무려 2시간이나 걸렸다,,
그래도 옛날보다 알고리즘 실력이 훨 나아진 것이 느껴지기 때문에 좋다 아주

0개의 댓글