[프로그래머스] 비밀지도 Python (카카오 기출)

2021. 9. 9. 14:51dev

https://programmers.co.kr/learn/courses/30/lessons/17681?language=python3 

 

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

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

programmers.co.kr

풀이과정 요약

비트연산자 or을 사용한 연산결과를 이진수로 표현해서 저장한다. 

이진수 결과를 하나씩 탐색하면서 1은 #으로, 0은 공백으로 문자열 치환을 해주었다. 

 

전체 코드

def solution(n, arr1, arr2):
    answer = []
     
    dec_arr = list(zip(arr1, arr2))
    
    bin_arr = []
    for first, second in dec_arr:
        result = first | second
        bin_arr.append(bin(result)[2:].zfill(n))   
    
    for element in bin_arr:
        tmp = element.replace("1", "#").replace("0", " ")
        answer.append(tmp)
    return answer

 

 Line 4: arr1과 arr2의 원소를 인덱스별로 각각 뽑아서 묶어주기 위해 zip()함수를 사용했다. 

입력이 arr1 = [9, 20, 28, 18, 11], arr2 = [30, 1, 21, 17, 28] 이라고 주어진다면 다음과같이 dec_arr 리스트에 저장될 것이다. 

dec_arr 출력결과

Line 6~9: dec_arr 리스트를 순회하면서 각 원소들에 대해 OR 비트연산을 진행한다. 문제에서 보면 겹치는 부분이 하나만 1이어도 1로 나타냈기 때문에 or연산을 돌려보면 결과가 바로 나오는걸 확인할수있다. 우리가 원하는건 이진수 형태이기 때문에 result를 binary형태로 바꿔준다음, 앞에 0b를 지우기 위해서 문자열 슬라이싱을 해주었다. 

그리고 zfill() 함수를 사용하여 문자열을 n길이로 만들기 위해 앞을 0으로 채워준다.  

bin_arr 출력결과

Line 11~13: 마지막으로, 모든 원소들에 대해 문자열 "1"을 "#"으로, "0"은 " " 으로 치환해주기 위해 문자열 치환하는 함수 replace()를 사용해주었다.