프로그래머스

[프로그래머스]무인도 여행

진철 2023. 2. 15. 22:58
728x90
반응형

문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/154540

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

DFS 함수를 통해 본 문제를 해결할 것이다.

코드를 작성하기 위한 순서는 다음과 같다.

1. 퍄이썬의 최대 재귀 호출 횟수는 1000이므로 런타임 에러가 발생할 수 있다. 따라서 제한을 확장한다.

2. 문제에서 주어지는 maps가 문자열 형태이므로 이를 리스트로 다시 만들어준다.

3. DFS 함수에서의 x, y 좌표가 범위를 벗어나는 지, 그리고 해당 maps의 값이 숫자인지 확인하는 check 함수를 만들어준다.

4. check 함수 조건에 만족한다면 해당 좌표에서 상, 하, 좌, 우로 좌표를 이동시켜서 재귀호출을 진행한다.

 

import sys #1번
sys.setrecursionlimit(10**5) #과도한 숫자로 제한을 확장하면 이 역시 런타임에러가 발생할 수 있으므로 주의해야한다.

def solution(maps):
    global total
    answer = []
    maps = [list(map) for map in maps] #2번
    total = 0
    
    def check(y, x): #3번
        return x >= 0 and y >= 0 and x < len(maps[0]) and y < len(maps) and maps[y][x] != 'X'
    
    def dfs(y, x):
        global total
        maps[y][x] = 'X'
        
        dx = [0, 0, 1, -1]
        dy = [1, -1, 0, 0]
        
        for i in range(4): #4번
            mx = x + dx[i] #x += dx[i]와 같이 작성하게 되면, x값이 누적될 수 있으므로 오류가 발생한다.
            my = y + dy[i] #y += dy[i]도 마찬가지이다.)
            if check(my, mx):
                total += int(maps[my][mx])
                dfs(my, mx)
    
    for y in range(len(maps)):
        for x in range(len(maps[0])):
            if check(y, x):
                total = int(maps[y][x]) #전역 변수 total 값을 초기화 해주어야한다.
                dfs(y, x)
                if total != 0:
                    answer.append(total)
    if len(answer) == 0:
        return [-1]
    else:
        return sorted(answer)

 

DFS 함수를 구현하는데 조금 익숙해진 것 같다.

하지만 초기에는 좌표를 상, 하, 좌, 우 이동할 때, mx = x + dx[i] 대신에 x += dx[i]를 작성하여 답이 계속 안나왔었다.

사실은 오른쪽의 코드가 조금 더 간결하게 저렇게 작성했는데, check의 조건에 적합하면 상관없지만 check 조건에 맞지 않으면 좌표 값이 되돌아가지 않고 계속 누적되서 계속 오답이 발생했던 것 같다.

+=, -= 등과 같은 연산자를 사용할 때는 전, 후 조건을 잘 파악하는 것이 중요할 듯하다.

728x90
반응형