
출처 : https://www.acmicpc.net/problem/13901
코드
import sys
# 입력 처리
data = sys.stdin.read().splitlines()
R, C = map(int, data.pop(0).split(" "))
room = [[False] * C for _ in range(R)]
# 장애물 설치
k = int(data.pop(0))
for _ in range(k):
br, bc = map(int, data.pop(0).split(" "))
room[br][bc] = True
r, c = map(int, data.pop(0).split(" "))
commands = list(map(int, data.pop(0).split()))
# 1 : up, 2 : down, 3 : left, 4 : right
direct = {1: (-1, 0), 2: (1, 0), 3: (0, -1), 4: (0, 1)}
room[r][c] = True
while True:
moved = False
for cmd in commands:
dr, dc = direct[cmd]
while True:
tr = r + dr
tc = c + dc
if 0 <= tr < R and 0 <= tc < C and not room[tr][tc]:
room[tr][tc] = True
moved = True
r, c = tr, tc
else: # 벽이나 방문한 지역, 장애물을 만날 경우
break
if not moved:
break
print(r, c)
풀이
문제를 잘 읽어봐야합니다.
사용자가 지정한 다음 방향이 없다면 맨 처음 방향으로 돌아가서 위의 과정을 반복한다.
즉, 주어진 명령어가 모두 움직일 수 없는 경우가 발생할 때까지
반복해야 됩니다.

5 5
3
1 2
3 3
2 4
2 2
1 2 3 4
첫 시작 상황이라고 할 때
1회차

1은 위에 방해물이 있어서 못 가고, 4도 이미 방문한 길이기 때문에 못 갑니다.
그렇기에 이제 우리는 다시 시작했던 (2, 2)로 갑니다.
2회차

1은 방해물, 2는 이미 방문한 곳, 4도 이미 방문한 곳이기에 이동 X
다시 시작했던 (2, 2)로 갑니다.
3회차

1은 방해물, 2는 방문했던 곳, 3도 방문했던 곳이기에 이동 X
다시 시작했던 (2, 2)로 갑니다.
4회차
(2, 2)에서 더이상 움직일 수 없기 때문에
마지막 위치였던 2, 3을 반환 합니다.
728x90
'백준 > 실버' 카테고리의 다른 글
트리의 부모 찾기 - Python, BFS, 재귀 깊이 제한 키우기 (0) | 2025.03.07 |
---|---|
백준 > 9711번 > 피보나치 - JAVA (2) | 2023.06.02 |
백준 > 8911번 > 거북이 - JAVA (0) | 2023.04.01 |
백준 > 27535번 > 제주 초콜릿 지키기 - JAVA > CompareTo<T>로 List 정렬하기 (0) | 2023.04.01 |
백준 > 1992번 > 쿼드트리 - JAVA (0) | 2023.02.22 |