[Programmers] - [1차] 비밀지도

오동훈·2021년 4월 28일
0

Programmers

목록 보기
30/64
post-thumbnail

1. Problem 📃

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

다음 문제는, 각각 두개의 배열의 같은 인덱스끼리의 비트연산을 해 n X n의 암호화 된 지도를 찾아 나가는 문제입니다.

2. Logic 👨‍🏫

  1. 각각 arr1, arr2의 같은 index의 값끼리 2진수 비트연산을 해줘 answer에 추가합니다.
  2. n의 자릿수가 되지 않는다면 될때까지 앞에 0을 추가합니다.
  3. 1이라면 #으로, 0이라면 공백으로 치환해줍니다.

3. Code 💻

1. 내가 푼 코드

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

2. 다른 사람이 푼 코드

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

4. Feedback 📚

1. 진수 변환

기본적으로 파이썬은 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. 비트 쉬프트

>>> 2<<1    #0010에서 0100으로 변경, #결과는 4
>>> 2<<2    #0010에서 1000으로 변경, #결과는 8
>>> 8>>2    #1000에서 0010으로 변경, #결과는 2

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을 사용했는데 |가 아니라면 인식이 안되는 것 같았다. 이 부분은 조금 더 찾아봐야 될 것 같다.

3. 비트 연산자 목록

연산자기능문법설명
&비트 ANDa & ba와 b의 비트를 AND 연산
|비트 ORa | ba와 b의 비트를 OR 연산
^비트 XORa ^ ba와 b의 비트를 XOR 연산(배타적 OR, Exclusive OR)
~비트 NOT~xx의 비트를 뒤집음
<<비트 왼쪽 시프트a << ba의 비트를 b번 왼쪽으로 이동시킴
>>비트 오른쪽 시프트a >> ba의 비트를 b번 오른쪽으로 이동시킴
&=비트 AND 연산 후 할당a &= ba와 b의 비트를 AND 연산한 후 결과를 a에 할당
|=비트 OR 연산 후 할당a |= ba와 b의 비트를 OR 연산한 후 결과를 a에 할당
^=비트 XOR 연산 후 할당a ^= ba와 b의 비트를 XOR 연산한 후 결과를 a에 할당
<<=비트 왼쪽 시프트 후 할당a <<= ba의 비트를 b번 왼쪽으로 이동시킨 후 결과를 a에 할당
>>=비트 오른쪽 시프트 후 할당a >>= ba의 비트를 b번 오른쪽으로 이동시킨 후 결과를 a에 할당

3. zip

- 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')]
profile
삽질의 기록들🐥

0개의 댓글