티스토리 뷰

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


1. 접근 방식

  • 암호화된 두 지도가 겹쳐져야 비밀 지도를 얻을 수 있으므로, for문의 zip( ) 함수를 사용하자.

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