데이터 놀이터
비밀지도 본문
728x90
1. 문제
- 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
- 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
- "지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
- 암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
2. 문제 조건
- 10진수를 2진수 형태로 변환
- 두 정수 배열을 zip 형태로 묶어 원소 하나하나 비교할 것
- 비트연산 활용
3. 코드 작성
def solution(n, arr1, arr2):
answer = []
for a1, a2 in zip(arr1, arr2):
temp = bin(a1 | a2)[2:] #ob 제거
temp = temp.zfill(n)
temp = temp.replace('1', '#').replace('0', ' ')
answer.append(temp)
4. 회고
- 비트연산에 대해 익숙하지 않아 처음에 for문을 썼더니 시간초과가 났다.
# 시간 초과 답안
def solution(n, arr1, arr2):
temp1 = []
temp2 = []
def make_binary(arr, temp):
for num in arr:
string = ''
while num != 1:
if num % 2 == 0:
string = '0' + string
else:
string = '1' + string
num //= 2
string = '1' + string
string.zfill(n)
temp.append(string)
return temp
make_binary(arr1, temp1)
make_binary(arr2, temp2)
temp = [int(x)+int(y) for x, y in zip(temp1, temp2)]
for ans in temp:
ans_str = str(ans)
if len(ans_str) < n:
ans_str = ans_str.zfill(n)
ans_str = ans_str.replace('1', '#')
ans_str = ans_str.replace('2', '#')
ans_str = ans_str.replace('0', ' ')
answer.append(ans_str)
이후 검색을 통해 이진법 함수, 비트연산에 대해 공부한 후 푸니 코드도 훨씬 간단해졌다. (https://wikidocs.net/121166)
- 이진법 함수(bin)
- 십진법 수를 이진법으로 나타내는 함수, 결과 맨 앞에 0b가 붙어 출력되는 걸 조심해야한다.
- bin 안에는 비트연산을 활용할 수 있다.
- bin(a & b) : and 조건, 둘 다 1(True)여야 1, 하나라도 0이 있다면 0
- bin(a | b) : or 조건, 둘 중 하나라도 1이 있다면 1, 둘 다 0이어야 0
다음번에 비슷한 유형의 문제를 만난다면 활용해봐야겠다.
2. zfill(), rjust(), ljust()를 복습하는 시간이 되었다.
728x90
'Python' 카테고리의 다른 글
기초 Python programming 강의 내용 정리 모음 (0) | 2023.10.10 |
---|---|
I/O, OOP (2) | 2023.10.10 |