https://programmers.co.kr/learn/courses/30/lessons/17681
다음 문제는, 각각 두개의 배열의 같은 인덱스끼리의 비트연산을 해 n X n의 암호화 된 지도를 찾아 나가는 문제입니다.
- 각각 arr1, arr2의 같은 index의 값끼리 2진수 비트연산을 해줘 answer에 추가합니다.
- n의 자릿수가 되지 않는다면 될때까지 앞에 0을 추가합니다.
- 1이라면 #으로, 0이라면 공백으로 치환해줍니다.
def solution(n, arr1, arr2):
answer = []
for i in range(n):
answer.append(format(arr1[i] | arr2[i], 'b'))
while len(answer[i]) != n:
answer[i] = "0" + answer[i]
for i in range(n):
answer[i] = answer[i].replace("1", "#")
answer[i] = answer[i].replace("0", " ")
return answer
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
기본적으로 파이썬은 10진수이기 때문에 다른 진수는 아래와 같이 접두어가 붙습니다.
- 2진수: 0b
- 8진수: 0o
- 16진수: 0x
- bin(), oct(), hex() 내장함수 사용
value = 60
b = bin(value)
o = oct(value)
h = hex(value)
print(b)
print(o)
print(h)
# 0b111100
# 0o74
# 0x3c
>> 결과는 전부 문자열 타입입니다.
- format() 내장함수 사용
value = 60
b = format(value, '#b')
o = format(value, '#o')
h = format(value, '#x')
print(b)
print(o)
print(h)
# 0b111100
# 0o74
# 0x3c
- format() 내장함수 내 두번째 인자에서 #을 제거하면 접두어가 빠진 결과로 나오게 됩니다.
value = 60
b = format(value, 'b')
o = format(value, 'o')
h = format(value, 'x')
print(b)
print(o)
print(h)
# 111100
# 74
# 3c
>>> 2<<1 #0010에서 0100으로 변경, #결과는 4
>>> 2<<2 #0010에서 1000으로 변경, #결과는 8
>>> 8>>2 #1000에서 0010으로 변경, #결과는 2
>>> 6^4 #0110 + 0100, xor 연산
2 #0010, 둘 중 한 쪽만 1이 있는 경우만 참
>>> 2|4 #0010 + 0100, or 연산
6 #0110, 둘 중 한 쪽에 1이 있기만 하면 참
>>> 2&6 #0010 + 0110, and 연산
2 #0010, 양 쪽 모두 1이 있는 경우 참
>>> ~2 #10, not 연산
-3 #-11
비트 연산자중 or을 사용하고 싶어 or을 사용했는데 |가 아니라면 인식이 안되는 것 같았다. 이 부분은 조금 더 찾아봐야 될 것 같다.
연산자 | 기능 | 문법 | 설명 |
---|---|---|---|
& | 비트 AND | a & b | a와 b의 비트를 AND 연산 |
| | 비트 OR | a | b | a와 b의 비트를 OR 연산 |
^ | 비트 XOR | a ^ b | a와 b의 비트를 XOR 연산(배타적 OR, Exclusive OR) |
~ | 비트 NOT | ~x | x의 비트를 뒤집음 |
<< | 비트 왼쪽 시프트 | a << b | a의 비트를 b번 왼쪽으로 이동시킴 |
>> | 비트 오른쪽 시프트 | a >> b | a의 비트를 b번 오른쪽으로 이동시킴 |
&= | 비트 AND 연산 후 할당 | a &= b | a와 b의 비트를 AND 연산한 후 결과를 a에 할당 |
|= | 비트 OR 연산 후 할당 | a |= b | a와 b의 비트를 OR 연산한 후 결과를 a에 할당 |
^= | 비트 XOR 연산 후 할당 | a ^= b | a와 b의 비트를 XOR 연산한 후 결과를 a에 할당 |
<<= | 비트 왼쪽 시프트 후 할당 | a <<= b | a의 비트를 b번 왼쪽으로 이동시킨 후 결과를 a에 할당 |
>>= | 비트 오른쪽 시프트 후 할당 | a >>= b | a의 비트를 b번 오른쪽으로 이동시킨 후 결과를 a에 할당 |
- zip() 함수는 여러 개의 순회 가능한 객체를 인자로 받고, 각 객체가 담고 있는 원소를 튜플의 형태로 차례로 접근할 수 있는 반복자를 반환합니다.
numbers = [1, 2, 3]
letters = ["A", "B", "C"]
for pair in zip(numbers, letters):
print(pair)
(1, 'A')
(2, 'B')
(3, 'C')
----- 다음의 코드와 같은 동작 원리입니다-----
numbers = [1, 2, 3]
letters = ["A", "B", "C"]
for i in range(3):
pair = (numbers[i], letters[i])
print(pair)
(1, 'A')
(2, 'B')
(3, 'C')
- zip 함수는 병렬처리를 이용할 때 유용합니다.
for number, upper, lower in zip("12345", "ABCDE", "abcde"):
print(number, upper, lower)
1 A a
2 B b
3 C c
4 D d
5 E e
🔔 주의 사항
zip() 함수로 넘기는 인자의 길이가 다를 때는 주의를 해야 합니다. 왜냐하면 가장 짧은 인자를 기준으로 데이터가 엮이고, 나머지는 버려지기 때문입니다.
numbers = ["1", "2", "3"]
letters = ["A"]
list(zip(numbers, letters))
[('1', 'A')]