알고리즘 연습/DFS와 BFS
[Lv.2 / 프로그래머스 / 파이썬] 지게차와 크레인 (2025 프로그래머스 코드챌린지 1차 예선)
김세진
2025. 5. 9. 14:46
반응형
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
풀이
requests를 순회하며 처리하는 시뮬레이션에서 BFS를 수행하는 문제이다.
BFS를 가장자리부터 진행하도록 하기 위해 빈 값으로 storage를 래핑해주었다.
그리고 주어진 요청을 순회하며 BFS 혹은 전체 삭제를 진행한다.
순회가 종료되면, 남은 블럭의 개수를 리턴한다.
BFS를 진행할 때, 현재 요청 타입에 맞는 블럭과 만났을 때 즉시 삭제하지 않도록 따로 삭제 예정 리스트를 구성한 다음 처리해야 한다. 그렇지 않으면 같은 타입의 블럭 뭉치를 만났을 때, 연결된 모든 부분을 삭제하게 된다.
def solution(storage, requests):
# 빈 값으로 storage 래핑
empty_row = ["-" * len(storage[0])]
storage = empty_row + storage + empty_row
storage = [list("-" + row + "-") for row in storage]
N, M = len(storage), len(storage[0])
move = [(1,0), (0,1), (-1,0), (0,-1)]
# 요청 순회
for req in requests:
t = req[0]
# 알파벳 2개 요청인 경우 전체 삭제
if len(req) == 2:
for i in range(N):
for j in range(M):
if storage[i][j] == t:
storage[i][j] = "-"
else: # 알파벳 1개 요청인 경우, 바깥에서 접근 가능한 부분만 삭제
visited = [[False] * M for _ in range(N)]
q = [(0, 0)]
# BFS
del_list = []
while q:
# 방문 체크
x, y = q.pop()
if visited[x][y]:
continue
visited[x][y] = True
# 탐색
for a, b in move:
dx, dy = x+a, y+b
# index out of range 방지
if dx >= N or dx < 0 or dy >= M or dy < 0:
continue
# 타입 비교 후 제거 목록에 추가
if storage[dx][dy] == t:
del_list.append((dx, dy))
# 다음 탐색 후보지 추가
if visited[dx][dy] or storage[dx][dy] != "-":
continue
q.append((dx, dy))
# 컨테이너 제거
for x, y in del_list:
storage[x][y] = "-"
# 결과 반환
result = 0
for i in range(N):
for j in range(M):
if storage[i][j] != "-":
result += 1
return result
반응형