알고리즘/구현
[BOJ] 백준 13567 - 로봇 풀이
송승현(SSH)
2022. 10. 31. 00:18
1. 문제
https://www.acmicpc.net/problem/13567
13567번: 로봇
입력은 표준 입력으로부터 받는다. 첫 줄에는 두 정수 M과 n (1 ≤ M ≤ 1,000, 1 ≤ n ≤ 1,000)이 주어진다. M은 정사각형 S의 한 변의 길이, 즉 오른쪽 맨 위의 좌표는 (M, M)이 된다. n은 로봇이 수행할
www.acmicpc.net
2. 풀이
백준 실버 4에 해당하는 문제이다.
현재 위치는 (0, 0)이고 현재 방향이 동쪽이라고 문제에서 주어졌으므로 그에 맞춰 값을 셋팅한다.
우선 방향을 저장하는 배열(dir)을 선언하고 값을 넣어준다. (dir을 보면 0, 1, 2, 3으로 셋팅해놓았다. 이는 주석에도 있듯이 순서대로 동남서북을 의미한다. 이는 임의대로 설정할 수 있는데, 90도로 돌릴 때 값을 편하게 셋팅하기 위해 이같이 설정하였다.)
초기 값을 셋팅한 후, 첫 째줄 입력을 저장한 후 명령 수에 맞게 반복문을 돌린다.
"MOVE" 명령이 나오면 현재 X좌표(myX), 현재 Y좌표(myY)에 방향에 맞는 이동 값 * 명령줄에 같이 주어지는 숫자(commendNum)를 더해준다. 이 때 주어진 좌표의 한계 값 이상이거나 음수가 나온다면 "-1"을 출력 후 프로그램을 종료한다.
"TURN" 명령이 나오면 setDir 함수를 실행하여 방향을 전환해준다.
마지막으로 현재 X좌표와 Y좌표를 출력해주면 정답!!! (이동하는 중간에 범위를 벗어난 경우는 앞서 처리를 해주었다.)
3. 소스 코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
static int[] dir = {0, 1, 2, 3}; // 동남서북
static int[] dx = {1, 0, -1, 0};
static int[] dy = {0, -1, 0, 1};
static int myDir = 0;
static int myX = 0;
static int myY = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
String commend = st.nextToken();
int commendNum = Integer.parseInt(st.nextToken());
switch (commend) {
case "MOVE":
myX += dx[dir[myDir]] * commendNum;
myY += dy[dir[myDir]] * commendNum;
if (myX < 0 || myX >= M || myY < 0 || myY >= M) {
bw.write("-1");
bw.flush();
bw.close();
br.close();
return;
}
break;
case "TURN":
setDir(commendNum);
break;
}
}
bw.write(Integer.toString(myX) + " " + Integer.toString(myY));
bw.flush();
bw.close();
br.close();
}
// 방향전환 함수
private static void setDir(int commendNum) {
// 왼쪽으로 90도 이동
if (commendNum == 0) {
if (myDir == 0) {
myDir = 3;
} else {
myDir -= 1;
}
}
// 오른쪽으로 90도 이동
else {
if (myDir == 3) {
myDir = 0;
} else {
myDir += 1;
}
}
}
}