이 문제는 복잡해서 직접 읽어 봐야한다. (카카오에서 낸 문제들이 대부분 그런듯...)
내가 이 문제를 기록하고 싶어하는 이유는 바로 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
이번 오답노트는 위 코드를 잘게 분석하는 것으로 해야겠다.
enumerate는 익숙해진 느낌이다. 그러나 행렬과 행렬을 묶는 zip은 아직도 익숙하지 않다.
위 코드는 zip을 이용하여 arr1과 arr2를 묶어서 for문을 돌린다.
깜짝 놀란 부분.
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
는 내가 정리한 것이 있다. 그러나 정리하면서 미처 알지 못한 것이 있었으니....
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)]