KEEP GOING
[python] 프로그래머스 17681번 : 비밀지도(bin, zip, replace) 본문
반응형
https://programmers.co.kr/learn/courses/30/lessons/17681
[풀이]
def findK(D):
K = 1
while K <= D:
K <<= 1
K >>= 1
return K
def to_binary(K, D):
global N
tmp = []
while K > 0:
if D >= K:
tmp.append(1)
D -= K
else:
tmp.append(0)
K >>= 1
while len(tmp) != N:
tmp.insert(0, 0)
return tmp
def solution(n, arr1, arr2):
global N
N = n
answer = []
f_arr1, f_arr2 = [], []
for data in arr1:
k = findK(data)
f_arr1.append(to_binary(k, data))
for data in arr2:
k = findK(data)
f_arr2.append(to_binary(k, data))
for i in range(N):
s = ''
for j in range(N):
if f_arr1[i][j] == 1 or f_arr2[i][j] == 1:
s += '#'
else:
s += ' '
answer.append(s)
return answer
to_binary라는 함수를 통해 배열 arr1, arr2 내 원소들을 2진법으로 표현해주었다.
그리고 주어진 지도 한 변의 크기만큼 2진법으로 나타낸 수의 사이즈를 맞춰줘야 하기 때문에
while len(tmp) != N:
tmp.insert(0, 0) 를 추가해주었다.
잘 풀긴했지만 코드가 너무 길어서 코드 개선을 해보았다.
[개선된 풀이]
def solution(n, arr1, arr2):
answer = []
for num1, num2 in zip(arr1, arr2):
tmp = bin(num1|num2)[2:]
while len(tmp) < n:
tmp = '0' + tmp
tmp = tmp.replace('1', '#')
tmp = tmp.replace('0', ' ')
answer.append(tmp)
return answer
아니나 다를까... ^^ 2진법을 처리하는 내장함수로 bin()이 있었다.
zip함수와 bin을 사용하면 위 코드와 같이 깔끔하게 단 몇 줄로 문제를 풀 수 있었다.
(zip 함수는 두 배열의 같은 인덱스에 위치하는 원소를 차례대로 꺼내와줌)
bin 함수를 사용하면bin(21|30) = '0b11111'
이런 식으로 이진값을 0b가 붙은 문자열로 받아오기에 slicing을 통해 0b는 제거해준다.
replace 함수의 경우, return 값이 존재하기 때문에 (정렬 내장함수인 sorted()처럼)
tmp = tmp.replace(~) 처럼
반드시 해당 변수에 반환한 값을 다시 받아주어야 한다.
반응형
'code review > implementation' 카테고리의 다른 글
[python] 백준 3048번 : 개미 (0) | 2022.04.25 |
---|---|
[python] 프로그래머스 64061번 : 크레인 인형뽑기 게임 (slicing) (0) | 2022.04.03 |
[python] 프로그래머스 17682번 : 다트게임 (ord, isnumeric) (0) | 2022.04.01 |
[python] 프로그래머스 12930번 : 이상한 문자 만들기 (0) | 2022.03.29 |
[python] 3진법 뒤집기 (strip) (0) | 2022.03.18 |
Comments