[programmers/py] 무인도 여행

승민·2024년 3월 24일

알고리즘

목록 보기
92/171

무인도 여행

https://school.programmers.co.kr/learn/courses/30/lessons/154540

문제 설명

  • 지도는 1 x 1크기의 사각형들로 이루어진 직사각형 격자 형태이며, 격자의 각 칸에는 'X' 또는 1에서 9 사이의 자연수가 적혀있습니다.
  • 지도의 'X'는 바다를 나타내며, 숫자는 무인도를 나타냅니다. 이때, 상, 하, 좌, 우로 연결되는 땅들은 하나의 무인도를 이룹니다.
  • 지도의 각 칸에 적힌 숫자는 식량을 나타내는데, 상, 하, 좌, 우로 연결되는 칸에 적힌 숫자를 모두 합한 값은 해당 무인도에서 최대 며칠동안 머물 수 있는지를 나타냅니다
  • 자열 배열 maps가 매개변수로 주어질 때, 각 섬에서 최대 며칠씩 머무를 수 있는지 배열에 오름차순으로 담아 return 하는 solution 함수를 완성해주세요. 만약 지낼 수 있는 무인도가 없다면 -1을 배열에 담아 return 해주세요.

문제 풀이

  • DFS를 통해 접근
import sys
from collections import deque

sys.setrecursionlimit(10000)

def solution(maps):
    answer = []
    
    # 상 하 좌 우
    dx = [0, 0, -1, 1]
    dy = [-1, 1, 0, 0]
    
    c = len(maps)
    r = len(maps[0])
    visited = [[False]*r for _ in range(c)]
    
    def DFS(i, j):
        ret = 0
        if i < 0 or j < 0 or i >= c or j >= r:
            return ret
        
        if maps[i][j] != "X" and visited[i][j] == False:
            visited[i][j] = True
            for k in range(4):
                ret += DFS(i + dx[k], j + dy[k])
            return int(maps[i][j]) + ret
        
        return ret
    
    for i in range(c):
        for j in range(r):
            if maps[i][j] != 'X' and visited[i][j] == False:
                answer.append(DFS(i, j))
    
    if len(answer) == 0:
        return [-1]
    return sorted(answer)

0개의 댓글