Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

개발 블로그

[Programmers/파이썬]프로그래머스(Lv.2) 무인도 여행 문제풀이 본문

Algorithm

[Programmers/파이썬]프로그래머스(Lv.2) 무인도 여행 문제풀이

토산인 2023. 3. 14. 01:04

문제 설명

메리는 여름을 맞아 무인도로 여행을 가기 위해 지도를 보고 있습니다. 지도에는 바다와 무인도들에 대한 정보가 표시돼 있습니다. 지도는 1 x 1크기의 사각형들로 이루어진 직사각형 격자 형태이며, 격자의 각 칸에는 'X' 또는 1에서 9 사이의 자연수가 적혀있습니다. 지도의 'X'는 바다를 나타내며, 숫자는 무인도를 나타냅니다. 이때, 상, 하, 좌, 우로 연결되는 땅들은 하나의 무인도를 이룹니다. 지도의 각 칸에 적힌 숫자는 식량을 나타내는데, 상, 하, 좌, 우로 연결되는 칸에 적힌 숫자를 모두 합한 값은 해당 무인도에서 최대 며칠동안 머물 수 있는지를 나타냅니다. 어떤 섬으로 놀러 갈지 못 정한 메리는 우선 각 섬에서 최대 며칠씩 머물 수 있는지 알아본 후 놀러갈 섬을 결정하려 합니다.

지도를 나타내는 문자열 배열 maps가 매개변수로 주어질 때, 각 섬에서 최대 며칠씩 머무를 수 있는지 배열에 오름차순으로 담아 return 하는 solution 함수를 완성해주세요. 만약 지낼 수 있는 무인도가 없다면 -1을 배열에 담아 return 해주세요.


제한사항
  • 3 ≤ maps의 길이 ≤ 100
    • 3 ≤ maps[i]의 길이 ≤ 100
    • maps[i]는 'X' 또는 1 과 9 사이의 자연수로 이루어진 문자열입니다.
    • 지도는 직사각형 형태입니다.

입출력 예mapsresult
["X591X","X1X5X","X231X", "1XXX1"] [1, 1, 27]
["XXX","XXX","XXX"] [-1]

입출력 예 설명

입출력 예 #1

위 문자열은 다음과 같은 지도를 나타냅니다.

연결된 땅들의 값을 합치면 다음과 같으며

이를 오름차순으로 정렬하면 [1, 1, 27]이 됩니다.

입출력 예 #2

위 문자열은 다음과 같은 지도를 나타냅니다.

섬이 존재하지 않기 때문에 -1을 배열에 담아 반환합니다.

 


사고 흐름

1. 인접한 좌표들에 대해 총합을 계산해라

2. 전형적인 bfs 문제!

 

문제 핵심과 알고리즘

상하좌우로 모두 인접한 좌표들을 탐색해 섬의 총합을 구하는 bfs 문제

def solution(maps):
    global answer
    answer=[]
    bfs(maps)
    answer.sort()
    
    if len(answer)==0 :
        return [-1]
    else :
        return answer

def bfs(maps) :
    global answer
    q=[]
    dx=[-1,1,0,0]
    dy=[0,0,-1,1]
    visited=[]
    
    for i in range(len(maps)) :
        for j in range(len(maps[0])) :
            sum=0
            if maps[i][j]!='X' and [i,j] not in visited :
                q.append([i,j])
                visited.append([i,j])
                sum+=int(maps[i][j])
                
                while q :
                    now=q.pop(0)
                    for k in range(4) :
                        nx=dx[k]+now[0]
                        ny=dy[k]+now[1]
                        
                        if 0<=nx<len(maps) and 0<=ny<len(maps[0]) and maps[nx][ny]!='X':
                            if [nx,ny] not in visited: 
                                q.append([nx,ny])
                                visited.append([nx,ny])
                                sum+=int(maps[nx][ny])
            if sum!=0 :
                answer.append(sum)

 

문제 풀면서 헤맸던 부분

딱히 없었다.

 

총평

전형적인 완전 탐색중 bfs(dfs)문제였다. 딱히 어려운 건 없었으나, 좀더 능숙하고 자잘한 실수를 하지말자. 그리고 갔던 경로를 출력하거나, 응용하는 문제들에 대해서도 대비가 필요하다.