프로그래머스/Python
[프로그래머스] 무인도 여행 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트
우당탕탕 개발자
2023. 11. 11. 13:26
728x90
반응형
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
1. 문제 설명
2. 풀이과정
해당 문제는 무인도를 각각 찾아내어 머무를 수 있는 날을 계산한 뒤, 모든 무인도의 머무를 수 있는 날을 오름차순으로 정렬하는 문제이다.
각 연결되어 있는 무인도를 찾기 위해 bfs 알고리즘을 활용한다.
각 무인도의 시작 위치를 찾아내어 연결된 무인도를 탐색하고 해당 무인도의 머무를 수 있는 날을 계산한다.
지도의 모든 위치를 탐색하며 무인도를 모두 찾아내고 각 무인도마다 머무를 수 있는 날을 저장했다면 이를 오름차순으로 정렬한다.
- bfs 함수에서 deque 자료구조를 사용하기 위해 deque 모듈을 불러온다. from collections import deque
- 지도의 각 문자열을 분리하여 2차원 리스트로 다시 저장한다. maps = list(list(i) for i in maps)
- 시작 위치의 좌표를 입력받는 bfs 함수를 구현한다. def bfs(x, y)
- 각 위치를 지나왔는지 확인할 리스트를 생성한다. arr = list(list(False for i in range(len(maps[0]))) for i in range(len(maps)))
- 각 위치별 다음 위치로 이동할 수 있는 상, 하, 좌, 우 4가지 방향을 리스트로 저장한다. move = [[0, -1], [0, 1], [1, 0], [-1, 0]]
- 시작 위치 0, 0부터 시작해 for i in range(len(maps)): for j in range(len(maps[i]))
- 각 위치별로 연결된 하나의 무인도를 탐색합니다. result = bfs(i, j)
- 만약 무인도에 머무를 수 있으면 if (result != 0)
- 머무를 수 있는 날을 추가한다. answer.append(result)
- 만약 무인도가 존재하지 않는다면 -1을 저장한다. if (len(answer) == 0): answer = [-1]
- 반면 무인도가 존재한다면 머무를 수 있는 날을 오름차순으로 정렬한다. else: answer.sort()
bfs 함수
- 만약 해당 위치가 바다라면 if (maps[x][y] == 'X')
- 0을 반환한다. return 0
- 해당 위치가 무인도라면 해당 위치를 저장할 deque를 생성한다. queue = deque()
- 생성한 deque에 해당 위치의 좌표를 추가한다. queue.append([x, y])
- 해당 무인도에 머무를 수 있는 날을 저장할 변수를 생성하고 초기화한다. result = 0
- 만약 해당 위치가 처음 탐색하는 위치이면 if (not arr[x][y])
- 해당 위치를 탐색함으로 수정하고 arr[x][y] = True
- 해당 무인도에 머무를 수 있는 날을 더한다. result += int(maps[x][y])
- 무인도를 탐색할 좌표가 있으면 반복한다. while (queue)
- 현재 위치의 좌표를 가져온다. x, y = queue.popleft()
- 해당 위치에서 다음 위치로 이동할 수 있는 4가지 방향에 따른 다음 위치를 탐색한다. for i in range(len(move))
- 다음 위치의 좌표를 각각 저장한다. newX = x + move[i][0] newY = y + move[i][1]
- 만약 다음 위치가 이동 가능한 위치이고 if (0 <= newX < len(maps)) and (0 <= newY < len(maps[0]))
- 만약 해당 위치를 처음 탐색하는 위치라면 if (not arr[newX][newY])
- 해당 위치를 탐색함으로 수정하고 arr[newX][newY] = True
- 만약 지도에서 해당 위치가 무인도라면 if (maps[newX][newY] != 'X')
- 해당 위치를 이어서 탐색할 위치로 추가한다. queue.append([newX, newY])
- 해당 무인도에 머무를 수 있는 날을 더한다. result += int(maps[newX][newY])
- 연결된 한 무인도를 찾았다면 해당 무인도에 머무를 수 있는 날을 반환한다. return result
반응형
3. 소스코드
from collections import deque
def solution(maps):
answer = []
maps = list(list(i) for i in maps)
def bfs(x, y):
if (maps[x][y] == 'X'):
return 0
queue = deque()
queue.append([x, y])
result = 0
if (not arr[x][y]):
arr[x][y] = True
result += int(maps[x][y])
while (queue):
x, y = queue.popleft()
for i in range(len(move)):
newX = x + move[i][0]
newY = y + move[i][1]
if (0 <= newX < len(maps)) and (0 <= newY < len(maps[0])):
if (not arr[newX][newY]):
arr[newX][newY] = True
if (maps[newX][newY] != 'X'):
queue.append([newX, newY])
result += int(maps[newX][newY])
return result
arr = list(list(False for i in range(len(maps[0]))) for i in range(len(maps)))
move = [[0, -1], [0, 1], [1, 0], [-1, 0]]
for i in range(len(maps)):
for j in range(len(maps[i])):
result = bfs(i, j)
if (result != 0):
answer.append(result)
if (len(answer) == 0):
answer = [-1]
else:
answer.sort()
return answer
728x90
반응형