문제 : boj13567
필요 알고리즘 개념
- 구현, 시뮬레이션
- 문제에서 제시된 대로 구현만 잘 하면 풀 수 있다.
※ 제 코드에서 왜 main 함수에 로직을 직접 작성하지 않았는지, 왜 Scanner를 쓰지 않고 BufferedReader를 사용했는지 등에 대해서는 '자바로 백준 풀 때의 팁 및 주의점' 글을 참고해주세요. 백준을 자바로 풀어보려고 시작하시는 분이나, 백준에서 자바로 풀 때의 팁을 원하시는 분들도 보시는걸 추천드립니다.
풀이
변수들 설계만 잘 하면 의외로 엄청 쉽게 풀린다. 내 경우엔 아래와 같이 진행했다.
r : y축 값 (내 경우엔 y, x론 헷갈려서 행과 열을 뜻하는 row, column으로 r과 c를 주로 사용한다.) - 초기값 0
c : x축 값 - 초기값 0
dir : 0-북, 1-동, 2-남, 3-서
일단 이렇게만 해두면, 이제 TURN 0은 dir-- 이다. TURN 1은 dir++ 만 해주면 된다(추가로 dir이 음수면 3으로, dir이 4면 0으로 변경해주자.).
그리고 MOVE로 이동될 값을 미리 DR, DC로 정의해두었다. 좌측 아래가 (0, 0)이므로 dir이 0일 경우 북쪽이라서 r값이 + 되어야 하므로 DR[0] = 1이다. 북쪽으로 이동할 경우 c값은 그대로이므로 DC[0] = 0이다. 이런식으로 설정하면 아래와 같다.
private static final int[] DR = {1, 0, -1, 0};
private static final int[] DC = {0, 1, 0, -1};
그럼 이제 MOVE X가 입력으로 들어올 경우, 현재 dir을 기준으로 r+=X * DR[dir]; c+=X * DC[dir]; 을 해주면 해당 방향으로 이동한게 된다. MOVE 연산이 끝난 후 r이 음수 혹은 m이상, c가 음수 혹은 m이상이라면 해당 명령어 열은 유효하지 않은 것이므로 '-1'을 출력하고 바로 프로그램을 종료하면 된다. 명령어 열이 유효했다면 모든 연산이 끝난 후 c와 r값을 출력해주면 된다.
코드 : github
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
private static final int[] DR = {1, 0, -1, 0};
private static final int[] DC = {0, 1, 0, -1};
private void solution() throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int m = Integer.parseInt(st.nextToken());
int n = Integer.parseInt(st.nextToken());
int r = 0;
int c = 0;
int dir = 1;
while (n-->0) {
st = new StringTokenizer(br.readLine());
if (st.nextToken().charAt(0) == 'T') {
dir += st.nextToken().charAt(0) == '0' ? -1 : 1;
if (dir < 0) dir = 3;
if (dir > 3) dir = 0;
} else {
int dist = Integer.parseInt(st.nextToken());
r += DR[dir]*dist;
c += DC[dir]*dist;
if (r >= m || c >= m || r < 0 || c < 0) {
System.out.println(-1);
return;
}
}
}
System.out.println(c + " " + r);
}
public static void main(String[] args) throws Exception {
new Main().solution();
}
}
'PS > BOJ' 카테고리의 다른 글
[자바] 백준 25703 - 포인터 공부 (java) (0) | 2022.11.02 |
---|---|
[자바] 백준 10822 - 더하기 (java) (0) | 2022.10.28 |
[자바] 백준 5717 - 상근이의 친구들 (java) (0) | 2022.10.25 |
[자바] 백준 22864 - 피로도 (java) (0) | 2022.10.25 |
[자바] 백준 10178 - 할로윈의 사탕 (java) (0) | 2022.10.25 |
댓글