KEEP GOING

[python] 프로그래머스 17681번 : 비밀지도(bin, zip, replace) 본문

code review/implementation

[python] 프로그래머스 17681번 : 비밀지도(bin, zip, replace)

jmHan 2022. 4. 1. 11:51
반응형

https://programmers.co.kr/learn/courses/30/lessons/17681

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

[풀이]

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(~) 처럼

반드시 해당 변수에 반환한 값을 다시 받아주어야 한다.

 

 

 

반응형
Comments