https://school.programmers.co.kr/learn/courses/30/lessons/388353
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
https://jinsang-2.tistory.com/129
https://www.acmicpc.net/problem/2638
백준 치즈 문제와 비슷하다.
물류창고에 알파벳 컨테이너가 있는데, 지게차 같은 경우에는 "A"와 같은 형태이며 외곽에 있는 것들만 꺼낼 수 있다. 외곽부터 껍질 깎기 느낌으로 생각하면 된다. 크레인 같은경우에는 요청된 모든 종류의 컨테이너를 꺼낸다.
첫번째 세번째는 지게차로 'A' 꺼내기, 두번째 예시는 크레인으로 'B' 컨테이너 다 꺼내기
풀이 과정
위에 백준 치즈 문제와 같은 해결법으로 생각했다. n*m의 직사각형 형태의 외곽으로 한 칸씩 늘려서 밖이 한 집합으로 연결되게 만들어서 지게차 일 때는 외곽쪽을 녹이고 크레인 일 때는 그냥 다 뽑아버릴 것이다.
visited 배열을 하나 만들어서 외곽은 -1로 표시하고 크레인 일 때는 그냥 다 찾고 -1로 바꿔버리면 되고, 지게차 일때가 중요한데, 지게차 일 때에는 n*m에서 상하좌우로 한 칸씩 더 늘린 visited 0,0부터 bfs 탐색해서 해당 알파벳을 찾고 -1로 변환해주면 된다.
핵심은 지게차로 외곽 갉아 먹기이다.
from collections import deque
def solution(storage, requests):
answer = 0
n=len(storage)
m=len(storage[0])
dx=[-1,1,0,0]
dy=[0,0,-1,1]
# vistied 배열 만들기
visited = [[-1]+[1] * (m)+[-1] for _ in range(n)]
visited = [[-1]*(m+2)] + visited + [[-1]*(m+2)]
def forklift(alpa):
queue = deque([(0,0)])
alpa_li = []
v=[[0]*(m+2) for _ in range(n+2)]
v[0][0]=1
while queue:
x,y=queue.popleft()
for i in range(4):
nx=dx[i]+x
ny=dy[i]+y
if 0<=nx<n+2 and 0<=ny<m+2 and v[nx][ny]==0 and visited[nx][ny]==-1:
v[nx][ny]=1
queue.append((nx,ny))
if 0<=nx<n+2 and 0<=ny<m+2 and visited[nx][ny]==1 and storage[nx-1][ny-1]==alpa:
alpa_li.append((nx,ny))
for x,y in alpa_li:
visited[x][y]=-1
def crane(alpa):
for i in range(n):
for j in range(m):
if storage[i][j]==alpa:
visited[i+1][j+1]=-1
tmp=set()
for request in requests:
if len(request)==1:
forklift(request)
else:
if request[0] not in tmp:
crane(request[0])
tmp.add(request[0])
for i in visited:
answer+=i.count(1)
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[Level 2 | Python] 서버 증설 횟수 (2025 프로그래머스 코드챌린지) (0) | 2025.02.27 |
---|---|
[Level 2 | Python] 완전범죄 (완탐 + 더 효율적인 코드) (0) | 2025.02.26 |
[Level 3 | Python] 미로 탈출 명령어 (0) | 2025.02.24 |
[Level 2 | Python] 요격 시스템 (0) | 2025.02.24 |
[Level 2 | Python] 호텔 대실 (0) | 2025.02.24 |