CODING TEST/ALGORITHM - 문제
[프로그래머스] 무인도 여행 - Python
쏘니(SSony)
2023. 2. 4. 18:36
코딩테스트 연습 - 무인도 여행 | 프로그래머스 스쿨 (programmers.co.kr)
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제 요약
지도 격자의 각 칸에는 'X' (바다)또는 1에서 9 사이의 자연수(무인도)가 적혀있습니다.
이때, 상, 하, 좌, 우로 연결되는 땅들은 하나의 무인도를 이룹니다.
지도의 각 칸에 적힌 숫자는 식량을 나타내는데, 상, 하, 좌, 우로 연결되는 칸에 적힌 숫자를 모두 합한 값은 해당 무인도에서 최대 며칠동안 머물 수 있는지를 나타냅니다.
각 섬에서 최대 며칠씩 머물 수 있는지 알아본 후 놀러갈 섬을 결정하려 합니다.
매개변수 : 지도를 나타내는 문자열 배열 maps
return 값 : 각 섬에서 최대 며칠씩 머무를 수 있는지 배열에 오름차순으로 담고, 만약 지낼 수 있는 무인도가 없다면 -1을 배열에 담아 return
문제 풀이
dfs(깊이 우선 탐색)을 사용해서 풀어주면 된다.
무인도에 방문한 뒤 'X'로 표시를 해주어 다시 방문하지 않도록 처리했다.
import sys
sys.setrecursionlimit(10**7)
def dfs(answer, graph, x, y):
n,m = len(graph), len(graph[0])
dx = [0,0,1,-1]
dy = [1,-1,0,0]
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0<= ny < m:
if graph[nx][ny] != 'X':
answer[-1] += int(graph[nx][ny])
graph[nx][ny] = 'X'
dfs(answer, graph, nx, ny)
def solution(maps):
answer = []
n,m = len(maps), len(maps[0])
graph = []
for i in range(n):
graph.append(list(maps[i]))
for x in range(n):
for y in range(m):
if graph[x][y] != 'X':
answer.append(int(graph[x][y]))
graph[x][y] = 'X'
dfs(answer, graph, x, y)
answer.sort()
if len(answer) == 0: return [-1]
return answer
dfs로 풀 경우는 setrecursionlimit을 이용해서 재귀 깊이 한도를 늘려주어야 해결이 된다.