준호씨의 블로그

PS - 비밀지도 - 2018 KAKAO BLIND RECRUITMENT 1차 1번 문제 본문

개발이야기/PS - Problem Solving, 알고리즘

PS - 비밀지도 - 2018 KAKAO BLIND RECRUITMENT 1차 1번 문제

준호씨 2018. 9. 13. 08:46

문제

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

 

코딩테스트 연습 - [1차] 비밀지도 | 프로그래머스

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다행히 지도 암호를 해독할 방법을 적어놓은 메모도 함께 발견했다. 지도는 한 변의 길이가 n인 정사각형 배열 형태로, 각 칸은 공백(" ) 또는벽(#") 두 종류로 이루어져 있다. 전체 지도는 두 장의 지도를 겹쳐서 얻을 수 있다. 각각 지도 1과 지도 2라고 하자. 지도 1

programmers.co.kr

지도는 정사각형 모양의 2차원 배열로 만들어져 있습니다. 이런 지도가 두개가 있고, 두 지도를 겹친 지도를 만드는 문제입니다.

입력과 출력 예제 입니다.

n 5
arr1 [9, 20, 28, 18, 11]
arr2 [30, 1, 21, 17, 28]
출력 ["#####","# # #", "### #", "# ##", "#####"]

입력값으로는 n, arr1, arr2 가 주어집니다. n 은 지도의 가로, 세로 사이즈 입니다. 5이면 5x5 사이즈의 지도 입니다.

arr1, arr2 가 각각 1차원 배열이지만 사실 안에 주어진 값은 2진수로 풀어서 사용하는데 이거도 하나의 배열이라고 생각 하시면 됩니다. 예를 들어 9는 2진수로 01001 인데 [0, 1, 0, 0, 1] 이라고 생각하는게 이해하기 좋습니다.

arr1 은 다음과 같은 모양의 배열이라고 보면 됩니다.

01001
10100
11100
10010
01011

arr2 는 다음과 같은 배열이라고 보면 됩니다.

11110
00001
10101
10001
11100

두개의 배열을 겹치(merge)면 다음과 같이 됩니다.

11111
10101
11101
10011
11111

각 칸에 1이 하나라도 있으면 1이 됩니다. 요런걸 논리합(or) 이라고도 합니다.

0, 0 -> 0
0, 1 -> 1
1, 0 -> 1
1, 1 -> 1

결과에서 1을 '#' 으로 0 을 빈칸 ' ' 으로 만들어 주면 됩니다. 다음과 같이 되겠죠?

#####
# # #
### #
#  ##
#####

 

Python3 풀이

 

def solution(n, arr1, arr2):
    answer = []

    for idx in range(n):
        result_arr = arr1[idx] | arr2[idx]

        # answer.append(bin(result_arr)[2:].zfill(n).replace('1', '#').replace('0', ' '))
        answer.append(format(result_arr, 'b').zfill(n).replace('1', '#').replace('0', ' '))

    return answer

# test
# print(solution(5, [9, 20, 28, 18, 11], [30, 1, 21, 17, 28]))
print(solution(6, [46, 33, 33 ,22, 31, 50], [27 ,56, 19, 14, 14, 10]))

https://gist.github.com/junho85/afa0cba6b879caba91cef5be0092ee20

python 은 정말 편의 기능을 많이 제공해 준다는걸 또다시 느낄 수 있었습니다. format 'b' 에 zfill 로 한방에 2진법 변환에 빈공간 0 으로 채우기가 가능합니다.

2진수로 바꾸기. bin, format

# bin 함수의 결과는 0b 가 앞에 붙는다
print(bin(5)) # '0b101'

# '101'
print(bin(5)[2:]) # '0b' 잘라내고 나머지 출력
print(format(5, 'b')) # format 'b' 는 0b 가 붙지 않는다

zfill - fill zeros

길이를 맞추기 위해 앞에 '0' 으로 빈값을 채우기 위해 사용합니다.
print(format(9, 'b').zfill(8)) # '00001001'
print('abcd'.zfill(8)) # '0000abcd'

비트연산 or ('|')

print(1 | 2) # b01 | b10 = b11 = 3

for loop enumerate

for idx, item in enumerate([1, 10, 100, 1000]):
    print(idx, item)

0 1
1 10
2 100
3 1000

다른 언어로 풀이

https://junho85.pe.kr/1122

 

PS - 비밀지도 javascript

앞서 비밀지도 문제를 python 으로 풀어 보았었는데요. PS - 비밀지도 - 2018 KAKAO BLIND RECRUITMENT 1차 1번 Python3 풀이 https://gist.github.com/junho85/afa0cba6b879caba91cef5be0092ee20 python 은 정말..

junho85.pe.kr

참고

 

0 Comments
댓글쓰기 폼