728x90
📌 비밀지도
💡 나의 풀이
비밀지도 문제의 핵심은 다음과 같다.
- 벽 부분은
1
, 공백 부분은0
으로 부호화한다. - 지도 1과 2를 겹쳤을 때 어느 하나라도 벽이면 전체 지도에서도 벽이다.
- 출력 시 벽은
#
, 공백은' '
으로 설정하자. - 각각의 배열을 이진수로 변경하고 논리 연산자
or
를 사용해 겹치는 부분을 판단한다.
배열로 선언된 10진수의 값을 2진수로 바꿨다.
format
함수를 사용했는데 '{0:>0{1:}b}'.format(i, n)
의 해석은 다음을 참고하자.
{0:}, {1:}
: format함수의 인자 순서>
: 오른쪽 정렬0
: 자리수만큼 정렬 후 남은 공간은 0으로 채움(미 사용 시 공백으로 채움)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
함수를 사용해 1
과 0
을 쉽게 변경했다.
# 나의 코드
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
반응형
'Algorithm > 프로그래머스(Programmers)' 카테고리의 다른 글
[ 파이썬(python) ] 프로그래머스 level1 - 소수만들기 (0) | 2021.04.12 |
---|---|
[ 파이썬(python) ] 프로그래머스 level1 - 실패율 (0) | 2021.04.12 |
[ 자바스크립트(JS), 파이썬(python) ] 프로그래머스 level1 - x만큼 간격이 있는 n개의 숫자 (0) | 2021.04.05 |
[ 자바스크립트(JS), 파이썬(python) ] 프로그래머스 level1 - 최대공약수와 최소공배수 (0) | 2021.04.05 |
[ 파이썬(python) ] 프로그래머스 level1 - 이상한 문자 만들기 (0) | 2021.04.02 |
댓글