김두두의 블로그

파이썬-비트 반전하기 본문

it

파이썬-비트 반전하기

두두100 2021. 5. 12. 02:26

이 블로그는 제가 시행착오를 겪은 것에 대한 블로그입니다!

정확한 코딩이 아닐 수도 있습니다.

 

a=[1,0,0,0,1,....] 의 list와 b=[0,0,0,0,...1]의 list 가 있다고 하자.

둘을 merge하거나 둘 중 하나를 반전 시킨 list c를 구하고 싶다.

 

리스트 크기가 큰 걸 시도하기 전에, 쉬운 예시로 해보자.

a=[1,0,0] 

b=[1,1,1] 의 두 list가 있다하자.

 

오류 1)

>>> c=a^b
Traceback (most recent call last):
  File "<pyshell#9>", line 1, in <module>
    c=a^b
TypeError: unsupported operand type(s) for ^: 'list' and 'list'

 

먼저 c가 뭔지 지정해줘야 한다. 그냥 c=a^b로 구하는 것은 안된다. 더욱이 비트 연산자는 list 통째로는 연산이 안되는 듯 하다.

 

 

오류2)

>>> c=[]
>>> for i in range(1,4):
 c[i]=a[i]^b[i]


Traceback (most recent call last):
  File "<pyshell#13>", line 2, in <module>
    c[i]=a[i]^b[i]
IndexError: list assignment index out of range

 

파이썬 수업 들을 때 어렴풋이 range 쓸 때 (1,n)을 쓰면 1부터 n-1까지라는 기억이 나서 for 문을 적어주었다. ->틀릴 수도 있음: 추후 확인.

난 range를 잘못써서 계속 오류가 나는 줄 알았다. 

그런데 구글링해보니 list assignment index out of range는 빈 리스트일 때 많이 일어나는 것 같다. 빈 리스트인데 어떻게 i 번째의 index를 정해줄 수 있냐 이 말인 것 같다. 그럴 듯 하다.

 

>>> c=[0]*3
>>> c
[0, 0, 0]

 

그래서 먼저 c를 크기 3인 0으로만 이루어진 리스트로 만들어 주었다.

만약 a, b의 리스트 크기가 크다면 len()를 통해 리스트의 크기를 알 수 있다.

 

>>> for i in range(1,3):
c[i]=a[i]^b[i]


>>> c
[0, 1, 1]

 

그랬더니 잘 실행되었다.

 

 

근데 과연 이 값이 내가 원하는 c 값이 맞을 지 확인해 볼 필요가 있다.

^ 연산자는 XOR을 뜻한다. 즉, 두 값이 같으면 0, 두 값이 다르면 1이다.

^ 0 1
(=XOR) 두 값이 같을 때 두 값이 다를 때

 

처음에 a=[1,0,0], b=[1,1,1]로 뒀으므로 ^연산자를 하면 XOR의 정의에 의해 [0,1,1]이 나올 것이고 이는 c와 같다.

성공했다!

 

 

 

 

 

 

 

 

 

반전은 뇌를 좀 식히고 생각해봐야겠다..

 

머리를 좀 식혔다

 

>>> a=[1,0,0]
>>> d=not(a)
>>> d
False

역시 그냥 이렇게 하는 건 답이 아닌 것 같다.


>>> d=[0]*3
>>> d
[0, 0, 0]
>>> for i in range(0,2):
d[i]=not a[i]


>>> d
[False, True, 0]

이게 왜이러는 지 모르겠다...라고 치는 순간 생각났다. 또 range문제다...하 진짜 R쓰다가 파이썬 쓰니까 숫자 감각이 사라진 것 같다. 파이썬은 왜 이렇게 index를 설정한건지 참 하여튼 다시 d에 0들을 채워줬다.

 

>>> d=[0]*3

>>> for i in range(0,3):
d[i]=not a[i]


>>> d
[False, True, True]

 

range를 (0,2)에서 (0,3)으로 바꿔주니 일단 d가 뭔가 나오긴 했다.

근데 솔직히 이 반전 문제는 not 연산자 사용하는 것(이렇게 쓸 수 있을지도 의문이긴 하다..)보다 if 조건문 쓰는 게 더 나을 것 같다. 그래서 if 를 쓰기로 했다.

 

>>> d=[0]*3

>>> for i in range(0,3):
          if a[i]==1:
             d[i]==0
          else:
             d[i]==1


True
False
False

 

>>> d
[0, 0, 0]

 

생각해보니 ==로 적어줘서 오류가 났다.

>>> for i in range(0,3):
if a[i]==0:
d[i]=1
else:
d[i]=0


>>> d
[0, 1, 1]

 

잘 구해졌다. 끝

 

*가끔씩은 쉽게 돌아가려기보다는 정공법이 통하는 것 같다.

(음..이건 쉬운 문제였긴 하지만)