반응형
문제
https://www.acmicpc.net/problem/14503
문제 풀이
구현문제. for ~ else문을 새롭게 알게됨. for문 돌다가 break로 끊기지 않았으면 for문 다 돌고 else문이 실행됨. 유용하다!
코드
1) deque 사용 X ( 훨 빠름 )
import sys
input = sys.stdin.readline
N, M = map(int,input().split())
cx, cy, cd = map(int,input().split())
MAP = [list(map(int,input().split())) for _ in range(N)]
move = [(-1,0),(0,1),(1,0),(0,-1)]
res = 0
while True:
if MAP[cx][cy] == 0: #청소
res += 1
MAP[cx][cy] = 2
for d in range(4): # 주변 4칸 중 청소할 칸 있으면
tx, ty = move[(cd-d-1)%4]
nx = tx + cx
ny = ty + cy
if 0<=nx<N and 0<=ny<M and MAP[nx][ny] == 0:
cx, cy, cd = (nx,ny,(cd-d-1)%4)
break
else: # 주변에 청소안한 빈칸 없음
tx, ty = move[cd%4]
nx = cx - tx
ny = cy - ty
if MAP[nx][ny] != 1: #후진 가능?
cx, cy, cd = nx, ny, cd
continue
if MAP[nx][ny] == 1: # 후진 불가능 뒤에 벽
break
print(res)
2) collections.deque 사용
import sys
input = sys.stdin.readline
import collections
N, M = map(int,input().split())
r, c, d = map(int,input().split())
MAP = [list(map(int,input().split())) for _ in range(N)]
move = [(-1,0),(0,1),(1,0),(0,-1)]
res = 0
q = collections.deque()
q.append((r,c,d))
while q:
cx, cy, cd = q.popleft()
if MAP[cx][cy] == 0: #청소
res += 1
MAP[cx][cy] = 2
for d in range(4): # 주변 4칸 중 청소할 칸 있으면
tx, ty = move[(cd-d-1)%4]
nx = tx + cx
ny = ty + cy
if 0<=nx<N and 0<=ny<M and MAP[nx][ny] == 0:
q.append((nx,ny,(cd-d-1)%4))
break
else: # 주변에 청소안한 빈칸 없음
tx, ty = move[cd%4]
nx = cx - tx
ny = cy - ty
if MAP[nx][ny] != 1: #후진 가능?
q.append((nx, ny, cd))
continue
if MAP[nx][ny] == 1: # 후진 불가능 뒤에 벽
break
print(res)
반응형
'알고리즘 > 백준 문제풀이' 카테고리의 다른 글
[boj] 백준 20058 마법사 상어와 파이어스톰 python 풀이 (0) | 2023.08.12 |
---|---|
[boj] 백준 9095 1, 2, 3 더하기 python 풀이 (0) | 2023.08.11 |
[boj] 백준 15657 N과 M (8) python 풀이 (0) | 2023.08.10 |
[boj] 백준 15655 N과 M (7) python 풀이 (0) | 2023.08.08 |
[boj] 백준 21736 헌내기는 친구가 필요해 python 풀이 (0) | 2023.08.08 |