ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SWEA] 보물상자 비밀번호
    Algorithm Study/Python 2021. 10. 5. 23:28

    https://swexpertacademy.com/main/main.do

     

    SW Expert Academy

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

    swexpertacademy.com

    위 그림처럼 4가지로 나눈 뒤 1칸씩 회전시키며 나올 수 있는 문자열을 구하면 된다.

    다음과 같은 기능이 필요하다.

    1. 문자열 회전
    2. 회전된 배열 나눈 후 저장, 중복 체크
    3. 정렬
    4. 16진수 -> 10진수

    풀이

            password = deque(password)
            password.appendleft(password.pop())
            password = list(password)

    문자열 회전은 deque를 이용하여 구현하였다. 마지막 값을 pop한 뒤 맨 앞에 append하면 된다.
    이동한 뒤 문자열 slice를 위해 다시 list로 변환하였다.

     

        numbers = set()
    
        length = N//4
    	for j in range(4):
    		numbers.add(''.join(map(str, password[j*length:j*length+length])))

    set을 이용하여 중복처리를 하였다.
    join을 사용하여 문자열을 구성하고 length값을 이용하여 slice할 기준을 정했다.

    첫 문자열은 0 ~ length-1까지, 2번째 문자열은 length ~ 2*length-1,
    3번째 문자열은 2*length ~ 3*length-1까지, 마지막 문자열은 3*length ~ 끝까지로 구성된다.

     

        numbers = sorted(list(numbers), reverse=True)
        print(f"#{test_case} {int(numbers[K-1], 16)}")

    정렬하고 변환하는 것은 파이썬 내장 기능인 sort와 int format을 이용하여 구현하였다.

     

    전체 코드

    from collections import deque
    
    T = int(input())
    
    for test_case in range(1, T+1):
        N, K = map(int, input().split())
        password = list(input())
        numbers = set()
    
        length = N//4
    
        for i in range(length):
            for j in range(4):
                numbers.add(''.join(map(str, password[j*length:j*length+length])))
    
            password = deque(password)
            password.appendleft(password.pop())
            password = list(password)
    
        numbers = sorted(list(numbers), reverse=True)
        print(f"#{test_case} {int(numbers[K-1], 16)}")

    파이썬으로 구현하기엔 단순한 문제였지만 기본이 중요한 문제였다.

     

    >>> bin(42)
    '0b101010'
    >>> oct(42)
    '0o52'
    >>> hex(42)
    '0x2a'
    
    #### 2진수에서 변환
    >>> bin(0b101010)
    '0b101010'
    >>> oct(0b101010)
    '0o52'
    >>> hex(0b101010)
    '0x2a'
    >>> str(0b101010)
    '42'

    기본적인 진법 변환

     

    >>> int('0b101010', 2)
    42
    >>> int('0o52', 8)
    42
    >>> int('0x2a', 16)

    int 캐스팅을 이용하여 다른 진법에서 다시 10진법으로 변환할 수 있다.

     

    >>> format(42, 'b')
    '101010'
    >>> format(42, 'o')
    '52'
    >>> format(42, 'x')
    '2a'
    >>> format(42, 'X')
    '2A'
    >>> format(42, 'd')
    '42'
    
    >>> format(42, '#b')
    '0b101010'
    >>> format(42, '#o')
    '0o52'
    >>> format(42, '#x')
    '0x2a'
    >>> format(42, '#X')
    '0X2A'

    format을 이용하여 간단하게 변환시키는 방법도 있다.
    기본적으로 제공되는 진법 변환 기능은 익혀두는 것이 좋을 것 같다.

    'Algorithm Study > Python' 카테고리의 다른 글

    [SWEA] 핀볼 게임  (0) 2021.10.10
    [SWEA] 원자 소멸 시뮬레이션  (0) 2021.10.08
    [백준] 18808 스티커 붙이기  (0) 2021.09.28
    [백준] 16236번 아기 상어  (0) 2021.09.24
    [백준] 18428번 감시 피하기  (0) 2021.09.23

    댓글

From BlackHair