문제
네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다.
1.
지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 "공백"(" ") 또는 "벽"("#") 두 종류로 이루어져 있다.
2.
전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 "지도 1"과 "지도 2"라고 하자. 지도 1 또는 지도 2 중 어느 하나라도 벽인 부분은 전체 지도에서도 벽이다. 지도 1과 지도 2에서 모두 공백인 부분은 전체 지도에서도 공백이다.
3.
"지도 1"과 "지도 2"는 각각 정수 배열로 암호화되어 있다.
4.
암호화된 배열은 지도의 각 가로줄에서 벽 부분을 1, 공백 부분을 0으로 부호화했을 때 얻어지는 이진수에 해당하는 값의 배열이다.
네오가 프로도의 비상금을 손에 넣을 수 있도록, 비밀지도의 암호를 해독하는 작업을 도와줄 프로그램을 작성하라.
입력
입력으로 지도의 한 변 크기 n 과 2개의 정수 배열 arr1, arr2가 들어온다.
•
1 ≦ n ≦ 16
•
arr1, arr2는 길이 n인 정수 배열로 주어진다.
•
정수 배열의 각 원소 x를 이진수로 변환했을 때의 길이는 n 이하이다. 즉, 0 ≦ x ≦ 을 만족한다.
출력
원래의 비밀지도를 해독하여 '#', 공백으로 구성된 문자열 배열로 출력하라.
예시
예시1
예시2
정답
def solution(n, arr1, arr2):
binary_list1 = []
binary_list2 = []
for i in arr1:
temp = bin(i)[2:] # 이진법으로 바꾼후 앞의 접두사 버리기
if len(temp) < n: # 총 자릿수가 n 미만인 경우 앞을 0으로 채워주기
temp = '0' * (n - len(temp)) + temp
binary_list1.append(temp)
for i in arr2:
temp = bin(i)[2:]
if len(temp) < n:
temp = '0' * (n - len(temp)) + temp
binary_list2.append(temp)
true_list = []
for i, j in zip(binary_list1, binary_list2):
temp = ''
for s in range(n):
if (i[s] == '0') & (j[s] == '0'): # 모두 0인 경우
temp += ' ' # 공백 더해주기
else: # 하나라도 1인 경우
temp += '#' # '#' 더해주기
true_list.append(temp)
return true_list
Python
복사
풀이
•
이진법으로만 바꿀 수 있다면 간단한 문제이다.
•
특정 숫자를 이진법 문자열로 바꾸는 함수는 bin()이다(내장함수이다). 이때 변환된 문자열 앞에 ‘0b’라는 접두사가 붙는다.
•
따라서 우선 우리가 받은 arr1과 arr2를 bin()을 이용하여 이진법 문자열로 변환한다. 단, 접두사는 필요없으므로 접두사는 버린다.
def solution(n, arr1, arr2):
binary_list1 = []
binary_list2 = []
for i in arr1:
temp = bin(i)[2:] # 이진법으로 바꾼후 앞의 접두사 버리기
Python
복사
•
그런데 문제에서는 자릿수를 n으로 맞춰야하기 때문에 자릿수가 n보다 작은 경우에는 ‘0’을 앞에 더 채워준다.
if len(temp) < n: # 총 자릿수가 n 미만인 경우 앞을 0으로 채워주기
temp = '0' * (n - len(temp)) + temp
binary_list1.append(temp)
Python
복사
•
이진법으로 변환한 뒤 binary_list1과 binary_list2를 zip으로 묶어서 윗줄부터 차례대로 살펴본다.
for i, j in zip(binary_list1, binary_list2):
Python
복사
•
이때 줄마다 원소를 왼쪽에서부터 오른쪽으로 살펴보는데, 만약 둘다 ‘0’인 경우에는 길이므로 공백을 넣어주고 아닌 경우에는 하나라도 ‘1’이 있는 것이므로 벽으로 간주하고 ‘#’을 채워준다.
for i, j in zip(binary_list1, binary_list2):
temp = ''
for s in range(n):
if (i[s] == '0') & (j[s] == '0'): # 모두 0인 경우
temp += ' ' # 공백 더해주기
else: # 하나라도 1인 경우
temp += '#' # '#' 더해주기
true_list.append(temp)
Python
복사