본문 바로가기

알고리즘 삽질장

[프로그래머스] 비밀지도

반응형


문제설명

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

 

코딩테스트 연습 - [1차] 비밀지도

비밀지도 네오는 평소 프로도가 비상금을 숨겨놓는 장소를 알려줄 비밀지도를 손에 넣었다. 그런데 이 비밀지도는 숫자로 암호화되어 있어 위치를 확인하기 위해서는 암호를 해독해야 한다. 다

programmers.co.kr

사고과정

  • 십진수를 이진수로 DFS 함수로 바꾸어주는 것이 가장 핵심이었다. 즉 암호화된 10진수 값을 이진수 값으로 부호화한다. 그리고 n길이 만큼 이진수 길이가 나오지 않은 값들은 모두 왼쪽에다가 0을 빈자리에 모두 추가해주어야 한다.
  • 그리고 난 후 두 맵의 동일한 원소끼리 합쳤을 때 값이 1 이상이면 벽이고 0이면 공백으로 최종 맵을 갱신해주면 된다.
  • 이진수로 변환하는 DFS 함수에서 변환한 이진수를 저장할 때 리스트를 이용하려 했더니 자꾸 재귀함수가 끝날 때마다 빈 리스트로 초기화 되서 애를먹었다.. 그래서 리스트 대신 그냥 빈 문자열로 해주니까 초기화되지 않고 잘 되었다.

풀이

def solution(n, arr1, arr2):
    answer1, answer2 = [], []
    result = ''
    
    def dfs(x):
        nonlocal result
        if x == 0:
            return
        else:
            dfs(x // 2)
            result += str(x % 2)
    # 이진수 변환
    for a in arr1:
        dfs(a)
        if len(result) < n:
            result = '0' * (n-len(result)) + result
        answer1.append(result)
        result = ''
    for a in arr2:
        dfs(a)
        if len(result) < n:
            result = '0' * (n-len(result)) + result
        answer2.append(result)
        result = ''
    # 맵 갱신
    maps = [[0] * n for _ in range(n)]
    for i in range(n):
        for j in range(n):
            if int(answer1[i][j]) + int(answer2[i][j]) >= 1:
                maps[i][j] = '#'
            else:
                maps[i][j] = ' '
    answer = []
    for m in maps:
        answer.append(''.join(m))
    return answer
반응형