본문 바로가기
Algorithm/백준

[Python] 백준 13901 - 로봇

by 애기 개발자 2022. 12. 23.
반응형

https://www.acmicpc.net/problem/13901

 

13901번: 로봇

첫 번째 줄에는 방의 크기 R, C(3 ≤ R, C ≤ 1,000)가 입력된다. 두 번째 줄에는 장애물의 개수 k(0 ≤ k ≤ 1,000)가 입력된다. 다음 k개의 줄에는 각 장애물 위치 br(0 ≤ br ≤ R – 1), bc(0 ≤ bc ≤ C - 1)가

www.acmicpc.net

 

혼자 힘으로 풀었는가? O

알고리즘 분류
 - 구현
 - 시뮬레이션

 

문제

해빈이는 로봇을 좋아한다. 로봇을 가지고 놀던 해빈이는 로봇에게 계속해서 명령을 내려 움직이는 대신 이동할 방향을 미리 지정하여 로봇이 알아서 움직이도록 하였다.  이 로봇은 다음과 같은 규칙을 가지고 움직인다.

  • 로봇은 사용자가 지정한 방향을 일직선으로 움직인다.
  • 이동 중 벽이나 방문한 지역, 장애물을 만날 경우 로봇은 사용자가 지정한 다음 방향으로 움직인다.
  • 사용자가 지정한 다음 방향이 없다면 맨 처음 방향으로 돌아가서 위의 과정을 반복한다.
  • 로봇이 움직일 수 없을 경우 동작을 멈춘다. 
* * *
x 0 *
* * *
<초기 상태>
* 1 *
x 0 *
* * *
<1번 째 이동>
2 1 *
x 0 *
* * *
<2번 째 이동>
방 크기가 3* 3이고
장애물이 (1, 0)에 있으며
시작 위치는 (1,1)
해빈이가 지정한 방향이 (상, 하, 좌, 우) 일 때,
로봇의 마지막 위치는 (0, 0)이다.
2 번째 이동이 끝난 후, 로봇은 움직일 수 없으므로 동작을 멈춘다.
로봇은 (1, 1) → (0, 1) → (0, 0)로 이동하였다.

입력으로 방의 크기와 장애물의 개수, 각 장애물들의 위치, 로봇의 시작 위치, 이동 방향의 순서가 주어졌을 때 로봇이 멈추는 위치를 출력하시오. 위치 (0, 0)은 왼쪽 위를 가리키며 방의 크기가 R * C일 때 오른쪽 아래 위치는 (R - 1, C - 1)이 된다. (R은 세로의 크기를 C은 가로의 크기를 말한다.)

입력

첫 번째 줄에는 방의 크기 R, C(3  R, C  1,000)가 입력된다. 두 번째 줄에는 장애물의 개수 k(0  k  1,000)가 입력된다. 다음 k개의 줄에는 각 장애물 위치 br(0  br  R – 1), bc(0  bc  C - 1)가 주어진다. 그 다음 순서대로 로봇의 시작 위치 sr(0  sr  R – 1), sc(0  sc  C - 1)와 이동 방향의 순서(총 4개가 입력되는데 1은 위 방향, 2은 아래 방향, 3은 왼쪽 방향, 4는 오른쪽 방향을 나타낸다)가 한 줄씩 입력된다. 로봇의 시작위치에 장애물이 있는 경우는 없다.

출력

로봇의 마지막 위치 r, c를 출력한다.

 

 


 

문제 내용을 이해하는대만 너무 오래 걸렸다.

 

처음에 내가 생각했던 방법은

 

1. 다음좌표 값이 0이면 방향순서대로 진행.

2. 0이 아니면 방향 전환

 

예시로

 

https://www.acmicpc.net/board/view/86308

 

글 읽기 - 반례입니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

해당 반례를 참고하였다.

 

5 5
3
1 2
3 3
2 4
2 2
1 2 3 4

위 처럼 입력되어있을때 나의 경우엔

 

이러한 순서로 움직이에 되었다.

 

(1, 4) 지점에서 위로 올라간 이유는 순서가 1 2 3 4 로 (상 하 좌 우 ) 순서이기 때문에

 

매번 좌표에서 방향을 갱신하는 줄 알았다.

 

하지만 위의 반례의 정답은 (2, 3) 으로 내 코드의 정답인 (4, 0) 과는 거리가 멀었다.

 


문제를 다시 읽어보자

 

갈수 없는 지점을 만나지 않고서는 방향이 바뀌지 않고 계속 같은방향으로 진행한다는걸 알았다.

 

즉 위와 같이 진행되기 때문에

 

정답이 (2, 3)이 나올 수 있게 된것이다.

 

import sys
input = sys.stdin.readline

r, c = map(int, input().split())
data = [ [0] * c for _ in range(r)]

k = int(input())
for _ in range(k):
  kr, kc = map(int, input().split())
  data[kr][kc] = -1

x, y = map(int, input().split())
data[x][y] = 1

dir = list(map(int, input().split()))

last = [x, y]
dx = [0, -1, 1, 0, 0]
dy = [0, 0, 0, -1, 1]

pos = 0
cnt = 0
while True:
  if cnt == 4:
    break
  pos = pos%4
  nx = x + dx[dir[pos]]
  ny = y + dy[dir[pos]]
  if nx < 0 or nx >= r or ny < 0 or ny >= c or data[nx][ny] != 0:
    pos += 1
    cnt += 1
  else:
    cnt = 0
    data[nx][ny] = data[x][y]+1
    x = nx
    y = ny
    last = [x, y]
print(last[0], last[1])

 

Git 백준 13901번 - 로봇.py

반응형

댓글