본문 바로가기
Algorithm/프로그래머스(Programmers)

[ 파이썬(python) ] 프로그래머스 level1 - 비밀지도

by YWTechIT 2021. 4. 7.
728x90

📌 비밀지도

문제 설명


💡 나의 풀이

비밀지도 문제의 핵심은 다음과 같다.

  1. 벽 부분은 1, 공백 부분은 0으로 부호화한다.
  2. 지도 1과 2를 겹쳤을 때 어느 하나라도 벽이면 전체 지도에서도 벽이다.
  3. 출력 시 벽은 #, 공백은 ' '으로 설정하자.
  4. 각각의 배열을 이진수로 변경하고 논리 연산자 or를 사용해 겹치는 부분을 판단한다.

 

배열로 선언된 10진수의 값을 2진수로 바꿨다.

format함수를 사용했는데 '{0:>0{1:}b}'.format(i, n)의 해석은 다음을 참고하자.

 

 

  1. {0:}, {1:}: format함수의 인자 순서
  2. >: 오른쪽 정렬
  3. 0: 자리수만큼 정렬 후 남은 공간은 0으로 채움(미 사용 시 공백으로 채움)
  4. b: 이진수(bin) 형태로 반환

 

zfill함수로도 동일하게 사용할 수 있다. (bin(i)[2:].zfill(n)))

 

또, 문제에서 지도 1과 지도 2를 합쳤을 때 값이 1이면 #으로 출력하라고 했었다. 그렇다면 둘 중 하나라도 벽으로 설정하는 방법은 무엇일까?

 

여러 가지 방법이 있겠지만 나는 논리 연산자인 or를 사용했다.

 

이전에 논리 연산자와 단락 평가를 공부할 때 배웠던 내용인데,

A or B: A가 True일 때는 B의 값을 보지 않고 A를 리턴하고, A가 False일 때는 B의 값을 리턴한다고 배웠다.

출력은 0(False)1(True)뿐이니까 or를 사용하면 나올 수 있는 경우의 수는 다음과 같다.

 

 

이후, zip함수를 사용하여 index를 하나씩 꺼내 준 다음 논리연산자(or)를 사용하여 서로의 값을 비교하여 새로운 배열에 담았다.

그리고 값이 1이면 #을 출력하고 0이면 공백을 출력하는 값을 return해줬다.


 

정답을 제출하고 다른 사람의 코드를 보니까 map함수로 zip을 비교하고 비트 or연산(|)을 사용해서 쉽게 작성한 코드가 있었다.

또, replace함수를 사용해 10을 쉽게 변경했다.

# 나의 코드
def solution(n, arr1, arr2):
    arr1_bin = ['{0:>0{1:}b}'.format(i, n) for i in arr1]
    arr2_bin = ['{0:>0{1:}b}'.format(i, n) for i in arr2]
    secret_map = [[int(k) or int(m) for k, m in zip(i, j)] for i, j in zip(arr1_bin, arr2_bin) ]

    return [''.join(['#' if j == 1 else ' ' for j in i]) for i in secret_map]

# zfill을 사용한 코드
def solution(n, arr1, arr2):
    arr1_bin = [bin(i)[2:].zfill(n)) for i in arr1]
    arr2_bin = [bin(i)[2:].zfill(n)) for i in arr2]
    secret_map = [[int(k) or int(m) for k, m in zip(i, j)] for i, j in zip(arr1_bin, arr2_bin) ]

    return [''.join(['#' if j == 1 else ' ' for j in i]) for i in secret_map]

# 다른사람의 코드 + zfill
def solution(n, arr1, arr2):
    arr = list(map(lambda x: x[0] | x[1], zip(arr1, arr2)))
    arr = list(map(lambda x: bin(x)[2:].zfill(n), arr))
    result = []

    for i in arr:
        i = i.replace('1', '#')
        i = i.replace('0', ' ')
        result.append(i)
    return result
반응형

댓글