-
[SWEA] 보물상자 비밀번호Algorithm Study/Python 2021. 10. 5. 23:28
https://swexpertacademy.com/main/main.do
위 그림처럼 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