본문 바로가기
백준/실버

로봇 - Python, 구현

by 아찌방 2025. 3. 26.

 

출처 : 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