본문 바로가기
알고리즘/백준

[백준 1726] 로봇 (C++)

by Bloofer 2021. 3. 23.

A. 문제설명

www.acmicpc.net/problem/1726

 

1726번: 로봇

많은 공장에서 로봇이 이용되고 있다. 우리 월드 공장의 로봇은 바라보는 방향으로 궤도를 따라 움직이며, 움직이는 방향은 동, 서, 남, 북 가운데 하나이다. 로봇의 이동을 제어하는 명령어는

www.acmicpc.net

문제에 대한 자세한 설명은 링크 참조

 

1. 로봇이 궤도를 따라 움직이며 시작점에서 목적지로 이동

2. 로봇은 각각 한번의 명령마다 아래와 같이 이동할 수 있음

명령 1. Go k: k는 1, 2 또는 3일 수 있다. 현재 향하고 있는 방향으로 k칸 만큼 움직인다.
명령 2. Turn dir: dir은 left 또는 right 이며, 각각 왼쪽 또는 오른쪽으로 90° 회전한다.

3. 로봇의 현재 위치와 바라보는 방향이 주어졌을 때, 로봇을 원하는 위치로 이동시키고, 원하는 방향으로 바라보도록 하는데 최소 몇 번의 명령이 필요한지 구하라

 

B. 접근법

BFS

 

문제에서 주어진 조건에 따라 로봇의 이동좌표, 그리고 해당 좌표에서의 방향을 chk 배열에 기록해준다. 로봇은 각 좌표에서 Go k 혹은 Turn dir의 명령을 받을 수 있는데, 여기서 k는 3이하인 정수이기 때문에 이를 유의해서 이동하는 로직을 구현한다.

 

각 명령을 수행(이동/회전)할 때마다 cnt를 증가시키며 큐에 삽입한다. 가장 마지막으로 목적지에 도착한 좌표/방향이 맞을 경우, 해당 큐의 cnt를 반환한다. 문제에서 조건이 1(동)/2(서)/3(남)/4(북)으로 주어졌기 때문에 이를 dx/dy로 변환하는 작업에 유의하여 구현한다.

 

C. 풀이

1. 문제 조건을 입력받고, 입력받은 방향을 1(동)/2(서)/3(남)/4(북) -> 0(동)/1(남)/2(서)/3(북)으로 변환

2. startX/Y/D와 endX/Y/D를 BFS 함수에 넣고 초기 위치를 큐에 삽입하여 탐사를 시작

3. 각 큐는 명령 1/2에 따라 이동/회전할 때마다 cnt를 증가시키며 큐에 삽입

4. 탐사하는 위치가 배열의 영역을 벗어나거나, 주어진 궤도의 범위가 아니거나(1), 이미 같은 좌표 같은 방향으로 방문된 경우가 있는 경우(chk) 넘어감

5. 목적지에 도달한 경우, 해당 큐의 cnt를 반환

 

D. 내 코드