비밀지도

김민석·2021년 2월 20일
0

오답노트 Lv.1

목록 보기
8/8

이 문제는 복잡해서 직접 읽어 봐야한다. (카카오에서 낸 문제들이 대부분 그런듯...)

나의 코드

내가 이 문제를 기록하고 싶어하는 이유는 바로 bin() 함수 때문이다.
아직 bin이 뭔지는 모른다. 우선 내가 푼 방식을 살펴보자.

def solution(n, arr1, arr2):

    def mapper(x):
        result = ''
        while x>0:
            result+= str(x%2)
            x=x//2
        while len(result) != n:
            result += '0'
        return list(result[::-1])

    arr1 = list(map(mapper,arr1))
    arr2 = list(map(mapper,arr2))

    for i in range(len(arr1)):
        for k in range(len(arr1[i])):
            if arr1[i][k] != '0' or arr2[i][k] != '0':
                arr1[i][k]= '#'
            else :
                arr1[i][k]= ' '


    return list(map(lambda x:''.join(x) , arr1))

우선 해당 문제는 list 내부의 10진수의 숫자를 2진수로 만드는 과정을 거쳐야 했다.
그 다음. 2진수가 n의 자리를 차지하도록 만들어야 했다.

예를 들면,
1001 = 9지만,
n이 5일 때는 01001로 만들어줘야했다.

나는 string의 형태로 붙여줬기 때문에 2진수가 반대로 나온다. 따라서 그것을 [::-1]을 이용하여 reverse 시켜주었다.

그 다음 두 개의 배열을 비교하여 문제에 맞게 return할 배열을 작성해주었다.


아래는 가장 좋아요를 많이 받은 풀이다.

def solution(n, arr1, arr2):
    answer = []
    for i,j in zip(arr1,arr2):
        a12 = str(bin(i|j)[2:])
        a12=a12.rjust(n,'0')
        a12=a12.replace('1','#')
        a12=a12.replace('0',' ')
        answer.append(a12)
    return answer

👉👈....

👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻👻

이번 오답노트는 위 코드를 잘게 분석하는 것으로 해야겠다.

우선 첫 번째, 내가 잘 사용하지 못하는 zip.

enumerate는 익숙해진 느낌이다. 그러나 행렬과 행렬을 묶는 zip은 아직도 익숙하지 않다.

위 코드는 zip을 이용하여 arr1과 arr2를 묶어서 for문을 돌린다.

두 번째, bin() 함수 ㄷㄷ..

깜짝 놀란 부분.

bin(i|j)에서 |는 비트 연산자라고 한다.

bin(4) ---> 0b100
bin(2) ---> 0b10
bin(4|2) ---> 0b110 => 5

bit단위로 어떤 연산을 하는 것이다.
연산을 할 때, 0은 거짓으로, 1은 참으로 연산하여 결과를 1과 0으로 반환하는 것이다.
종류는 다음과 같다.

& (Binary AND) : bit 단위로 and 연산
| (Binary OR) : bit 단위로 or 연산
^ (Binary XOR) : bit 단위로 xor연산
~ (Binary NOT) : bit 단위로 not연산 (1의 보수)
<< (Binary left Shift) : bit 단위로 왼쪽으로 비트단위 밀기 연산
>> (Binary right Shift) : bit 단위로 오른쪽으로 비트단위 밀기 연산

아마 2진수를 사용할 일이 있을 때 도움이 될것으로 보인다.
코드를 짠 사람은 bin()함수를 사용 했을 때,
숫자 앞에 0b1101 이런 식으로 나오기 때문에, string으로 변환 후, 앞의 두 개를 잘라준 것이다.

다만 원래 str함수를 사용 할 필요는 없다. bin()함수는 이진 문자열로 반환하기 때문이다.

세 번째, rjust(width, [fillchar])

rjust는 내가 정리한 것이 있다. 그러나 정리하면서 미처 알지 못한 것이 있었으니....

rjust가 문자를 오른쪽 정렬을 하고 width 값만큼을 space로 채운 문자를 반환한다고 알고 있었다. 그런데 fillchar 부분에 들어간 text로 space를 대체할 수 있다는 것을 배울 수 있었다.
따라서 rjust를 한 부분은 문자를 오른쪽 정렬 후에 왼쪽에 '0'을 넣은 모양새다.


이것은 빡쳐서 한줄로 만든 것
def solution(n, arr1, arr2):

        # 1) binary함수와 or연산자를 이용해서 2진수 화 후,
        # 2) rjust를 사용하여 왼쪽에 0채워주기.
        # 3) translate과 maketrans를 이용하여 replace 실행
        
        #1)            2)           3)
return [bin(x|y)[2:].rjust(n,'0').translate(str.maketrans('10','# ')) for x,y in zip(arr1,arr2)]

0개의 댓글