▼ Why ?
이번 문제도 구현 - 시뮬레이션 문제이고, 이전에 풀었던 문제 [청소 로봇]처럼 개체를 직접 이동시키는 상황을 구현해내는 유형이다. 주어진 상황에 맞게 알고리즘을 구현해내는 능력을 키우기 위해 계속해서 관련 문제를 풀어보려고 한다.
▼ [로봇의 이동]
문제 정보
- 이차원 배열 격자판 0행 0열에 로봇이 3시 방향을 보고 있습니다.
- 로봇은 다음 규칙에 따라 이동합니다.
- 'G' 명령을 주면 보고 있는 방향으로 한 칸 이동합니다. 격자 밖으로 나가는 명령은 하지 않습니다.
- 'R' 명령을 주면 오른쪽으로 90도 회전합니다.
- 'L' 명령을 주면 왼쪽으로 90도 회전합니다.
- 매개변수 moves에 로봇에 명령을 내린 문자들이 차례대로 나열된 명령 문자열이 주어지면 이 명령 문자열을 로봇이 모두 수행했을 때 최종 위치를 반환하는 프로그램을 작성하세요.
입출력 예
제한사항
- moves의 길이는 100을 넘지 않습니다.
- 2차원 배열 격자판의 크기는 100*100입니다.
어떻게 해결해야 할까?
- 개체의 이동을 구현해내면 되는 문제이다
- 이전 문제와는 달리 로봇이 현재 가리키고 있는 방향(' nowDir ')을 저장하고 있어야 한다
(int nowDir의 초기값은 1 ➜ 처음에 바라보고 있는 방향이 동쪽이기 때문에) - 일단 북에서부터 시계 방향의 순서로 방향 배열을 생성해주고, 로봇이 90도 회전할 때마다 nowDir 값에 ±1만 해주면 된다
(nowDir 값이 음수가 되면 안되기 때문에 항상 체크해주자) - 이동하라는 명령(' G ')이 확인되면 nowDir % 4 의 결과값을 index로 하여 방향 배열에서 해당하는 값을 로봇의 위치를 저장하고 있는 배열에 더해주기만 하면 된다
해결 코드
import java.util.*;
public static int[] solution(String moves) {
int[] robotPos = new int[2];
int[] dx = {-1, 0, 1, 0};
int[] dy = {0, 1, 0, -1};
int nowDir = 1;
for(int i = 0; i < moves.length(); i++) {
char move = moves.charAt(i);
if(move == 'G') {
robotPos[0] += dx[nowDir % 4];
robotPos[1] += dy[nowDir % 4];
}
else if(move == 'R') nowDir += 1;
else {
if(nowDir == 0) nowDir += 4;
nowDir -= 1;
}
}
return robotPos;
}
▼ 정리
- 이전 문제 [청소 로봇]처럼 주어진 입력에 따라 개체가 움직이는 상황을 구현하기만 하면 되고, 격자판을 벗어나는 명령을 주어지지 않는다는 조건 때문에 로봇의 방향을 어떻게 처리해야 할지만 생각해보면 돼서 어렵지 않게 풀 수 있었다
- 격자판을 벗어나는 명령이 주어질 수 있다면, 해당 명령을 수행했을 때의 위치를 저장할 변수를 따로 만들어 체크해주기만 하면 될 것 같다