티스토리 뷰
https://school.programmers.co.kr/learn/courses/30/lessons/17681
1. 접근 방식
- 암호화된 두 지도가 겹쳐져야 비밀 지도를 얻을 수 있으므로, for문의 zip( ) 함수를 사용하자.
for문에서 zip( ) 함수를 사용하면 서로 다른 2개 이상의 리스트 같은 iterable 객체를 순회할 수 있기 때문이다.
- 10진수를 2진수로 바꾸기 위해 bin( ) 함수를 사용하자.
이때 총 비트 수를 n 비트로 맞추기 위해 필요한 개수만큼 '0'을 2진수 앞에 추가한다.
- 첫 번째 지도와 두 번째 지도에서 구한 각각의 2진수(문자열)을 zip( ) 함수를 통해 함께 for문을 돌리자.
두 암호화된 지도를 통해 얻을 최종 지도의 행을 담기 위한 row 변수를 for문 바깥에 선언한다. 그리고 이 row 변수에 첫 번째 지도의 비트 값 b1과 두 번째 비트 값 b2 값이 모두 0일 때만 ' ' 공백을, 나머지는 '#'을 추가한다.
2. 정답 코드
def solution(n, arr1, arr2):
maps = []
for x, y in zip(arr1, arr2):
bin1, bin2 = bin(x)[2:], bin(y)[2:]
bin1 = '0' * (n - len(bin1)) + bin1
bin2 = '0' * (n - len(bin2)) + bin2
row = ''
for b1, b2 in zip(bin1, bin2):
if b1 == '0' and b2 == '0':
row += ' '
else:
row += '#'
maps.append(row)
return maps
3. 개선 사항
- 비트 연산자 사용
비트 연산자의 OR를 사용함으로써 최종 지도의 2진수를 구할 수 있다. 즉, zip( ) 함수로 bin1과 bin2를 동시에 순회할 필요 없이 단순 for문으로 row를 구할 수 있다.
def solution(n, arr1, arr2):
maps = []
for x, y in zip(arr1, arr2):
binary = '0' * (n - len(bin(x|y)[2:])) + bin(x|y)[2:]
row = ''
for b in binary:
if b == '1':
row += '#'
else:
row += ' '
maps.append(row)
return maps
728x90
'코딩 테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 두 큐 합 같게 만들기 파이썬 정답 코드 (0) | 2023.06.17 |
---|---|
[프로그래머스] 개인정보 수집 유효기간 파이썬 정답 코드 (0) | 2023.06.17 |
[프로그래머스] 수식 최대화 파이썬 정답 코드 (0) | 2023.06.16 |
[프로그래머스] 오픈채팅방 파이썬 정답 코드 (0) | 2023.06.15 |
[프로그래머스] [1차] 캐시 파이썬 정답 코드 (0) | 2023.06.15 |