비밀지도 문제!
2017년 9월 카카오 개발 신입공채 1번 문제로 출제 됐었다.
비트연산자를 이용하면 훨씬 쉽다고 하지만 아직 비트연산자를 써보지 않아서 익숙한 방법으로 풀이했다.
https://school.programmers.co.kr/learn/courses/30/lessons/17681
def solution(n, arr1, arr2):
answer = []
arr_1 = []
arr_2 = []
주어진 answer 값은 우선 냅두고 2진수로 변화시킬 값들이 들어갈 빈 리스트 만들기
for i in range(n):
arr_1.append(bin(arr1[i])[2:].zfill(n))
arr_2.append(bin(arr2[i])[2:].zfill(n))
코드로 세 줄 이지만 애를 많이 먹었던 부분.
전체 변의 길이가 n이기 때문에 for문을 range(n)으로 돌려서 arr1과 arr2의 모든 값(n개 만큼 존재)을 뽑아온다
그렇게 뽑은 하나하나의 값을 bin 함수를 통해 2진수로 바꿔준다.
bin함수는 정수를 2진수로 표현시켜준다.
ex)
보다시피 2진수로 바꿔주는데 ob라는 문자를 달고 나온다. 따라서 3번째 값부터 표시하도록 슬라이싱했다.
zfill함수는 자리값을 맞춰주는 함수다.
ex)
이렇게 ()안에 있는 숫자에서 부족한 자리값 만큼 0을 넣어 맞춰준다.
이렇게 정제된 값을 append로 새로운 리스트에 각 각 넣어줬다.
Map = ''
for j in range(n):
if arr_1[i][j] == '1' or arr_2[i][j] == '1':
Map += '#'
else:
Map += ' '
answer.append(Map)
return answer
Map이라는 빈 리스트를 만들었다.
정수가 2진수로 변해서 들어가있는 리스트인 arr_1과 arr_2의 값을 비교한다.
arr_1의 0~n-1번째 까지의 각 단어의, 0~n-1까지의 글자를 추출하여 비교하게 된다. (n=변의 길이)
값이 둘 중 하나라도 1이면 벽을 의미하는 "#"을,
둘 다 0이면 " " 공백을 Map 리스트에 변환하여 넣는다.
그리고 Map을 answer로 하나씩 붙인다.
def solution(n, arr1, arr2):
answer = []
arr1_ = []
arr2_ = []
for i in range(n):
arr_1.append(bin(arr1[i])[2:].zfill(n))
arr_2.append(bin(arr2[i])[2:].zfill(n))
Map = ''
for j in range(n):
if arr_1[i][j] == '1' or arr_2[i][j] == '1':
Map += '#'
else:
Map += ' '
answer.append(Map)
return answer
비트연산자를 쓰지 못한 것이 좀 아쉽고, 해당 풀이도 팀원들의 도움을 받으면서 풀어서 또 아쉽다.
그래도 하루하루 꾸준히 알고리즘을 풀면서 사고를 키워나가고 있다!
가보자고!!