# 해당 포스팅은 이제 막 알고리즘 공부를 시작한 초보 수준에서 작성했음을 이해해주시고, 비난보다는 따뜻한 조언을 부탁드립니다.
안녕하십니까, 간토끼입니다.
오늘은 프로그래머스(Programmers) 비밀지도 문제에 대해 다뤄보겠습니다.
2018년 카카오 블라인드 채용 코딩테스트 문제(Lv.1 수준)입니다.
1. 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/17681
한 변의 길이가 n인 정사각형의 지도의 내용을 채우는 문제입니다.
지도의 칸은 공백(" ") 혹은 벽("#")으로 이루어져 있고, 이를 구하기 위해 두 개의 지도가 주어집니다.
각 지도는 10진수로 표현된 n개의 정수로 이루어진 배열이고, 이 10진수를 2진수로 변환해야 합니다.
예를 들어 N=5이고 숫자 9를 2진법으로 표현하면 1001이 되지만, n의 개수에 맞게 0을 더 붙여서 '01001'로 표현해야 합니다. 이때 0은 공백, 1은 벽입니다.
이렇게 지도 1, 지도 2를 변환한 후 두 가지의 규칙을 유념해서 전체 지도를 만들어줘야 하는데요.
(1) 지도 1과 지도 2 모두 1(=벽)인 칸은 벽("#")으로 나타내야 합니다.
(2) 지도 1 혹은 지도 2 중 0(=공백)인 칸은 공백(" ")으로 나타내야 합니다.
2. 접근 방법
다음과 같이 접근하였습니다.
전체적인 흐름은 코드를 보시면서 주석을 읽어보시면 이해가 될 거라고 생각합니다.
먼저 10진수를 2진수로 변환하기 위해 format(i, "b") 함수를 이용했습니다. ("b" : 이진수)
그리고 위에서 언급한 것처럼 주어진 수를 2진수로 표현해도 2진수의 자릿수가 n보다 작으면 안 되기 때문에,
n보다 작다면 2진수 앞에 0을 더 붙여줬습니다. 9를 예로 들면, 9는 1001이지만 n=5이기 때문에 "01001" 로 만들어주는 거죠. 이렇게 해도 결과값은 변하지 않으니깐요.
그 외 어려운 부분은 없던 문제였습니다.
구현은 문제 읽고 해석하는 게 더 어려운 것 같아요 ...
3. 코드
def solution(n, arr1, arr2):
# 이진수 변환 함수 : format(i, 'b')
total_map = [[0]*n for _ in range(n)] # nxn 지도
map1 = [[0]*n for _ in range(n)] # map1
map2 = [[0]*n for _ in range(n)] # map2
# map1 변환
for i in range(len(arr1)):
bin_1 = format(arr1[i], "b") # ex. 9 -> 1001
if len(bin_1) < n:
diff = n - len(bin_1) # if n=5인데 bin_1 = 1001이면 01001로 만들어주기 위함
bin_1 = diff*"0" + bin_1
for j in range(len(bin_1)):
map1[i][j] = bin_1[j]
# map2 변환
for i in range(len(arr2)):
bin_2 = format(arr2[i], "b") # ex. 9 -> 1001
if len(bin_2) < n:
diff = n - len(bin_2) # if n=5인데 bin_1 = 1001이면 01001로 만들어주기 위함
bin_2 = diff*"0" + bin_2
for j in range(len(bin_2)):
map2[i][j] = bin_2[j]
# 전체 지도 병합
# 규칙 : 하나라도 0(공백)이면 전체도 0, 둘다 1(벽)이어야만 전체도 1
for i in range(n):
map1_i = map1[i] # list의 i번째 list
map2_i = map2[i] # list의 i번째 list
for j in range(n):
a = map1_i[j] # map1[i][j]
b = map2_i[j] # map2[i][j]
# 규칙 1
if a == "1" or b == "1":
total_map[i][j] = "#"
elif a == "0" and b == "0":
total_map[i][j] = " "
answer = []
for i in range(n):
map_i = total_map[i]
sum_i = map_i[0]
for j in range(1, len(map_i)):
sum_i = sum_i + map_i[j]
answer.append(sum_i)
return answer
감사합니다.
잘 읽으셨다면 게시글 하단에 ♡(좋아요) 눌러주시면 감사하겠습니다 :)
(구독이면 더욱 좋습니다 ^_^)
* 본 블로그는 학부생이 운영하는 블로그입니다.
따라서 포스팅에 학문적 오류가 있을 수 있으며, 이를 감안해서 봐주시면 감사하겠습니다.
- 간토끼(DataLabbit)
- B.A. in Economics, Data Science at University of Seoul
'Python Programming > [Programmers] Algorithm' 카테고리의 다른 글
[프로그래머스] 키패드 누르기 Python 풀이 (0) | 2023.08.26 |
---|---|
[프로그래머스] 숫자 문자열과 영단어 Python 풀이 (0) | 2023.08.25 |
[프로그래머스] 크레인 인형뽑기 게임 Python 풀이 (0) | 2023.08.22 |
[프로그래머스] 실패율 Python 풀이 (0) | 2023.08.22 |
[프로그래머스] 체육복 Python 풀이 (0) | 2023.08.21 |