Post

[BOJ/백준] 3234번 : LUKA (Java)

📘 백준 3234번 : LUKA


문제 바로가기


🔤 문제 번역

문제

루카는 전국 대회에 참가하기 위해 열흘 일찍 도착해 문제 출제자들의 대화를 엿들으며 힌트를 얻고자 했다. 그는 문제 출제자들이 매일 크레스(Cres) 마을을 산책하며 문제에 대해 조용히 이야기한다는 것을 알고 있었다.

흥미롭게도, 크레스 마을은 평면 좌표 격자로 표현할 수 있다. 문제 출제자들은 매번 (0,0) 지점에서 산책을 시작하며, 매 턴마다 오른쪽(x좌표가 1 증가), 위쪽(y좌표가 1 증가), 왼쪽(x좌표가 1 감소), 아래쪽(y좌표가 1 감소) 중 한 방향으로 이동한다.

루카는 좌표 평면 위의 (X,Y) 지점에 위치해 있으며, 문제 출제자들이 루카가 있는 지점이나 인접한 8개의 지점 중 하나에 도착했을 때만 대화를 엿들을 수 있다.

당신의 임무는 루카가 문제 출제자들의 대화를 엿들은 시각(턴)을 모두 구하는 프로그램을 작성하는 것이다.

입력

  • 첫 번째 줄: 두 정수 X와 Y가 주어진다. (-10,000 ≤ X,Y ≤ 10,000) — 루카의 위치.

  • 두 번째 줄: 정수 K가 주어진다. (1 ≤ K ≤ 100,000) — 문제 출제자들이 그날 이동한 횟수.

  • 세 번째 줄: 길이 K의 문자열이 주어진다. — 문제 출제자들의 이동 경로.

    각 문자는 다음 중 하나이다:

    • I: 동쪽(오른쪽, x + 1)

    • S: 북쪽(위, y + 1)

    • Z: 서쪽(왼쪽, x - 1)

    • J: 남쪽(아래, y - 1)

출력

  • 문제 출제자들이 루카가 대화를 엿들은 시각(턴)을 오름차순으로 출력한다.

  • 각각의 시각은 한 줄에 하나씩 출력한다.

  • 만약 루카가 전혀 엿들을 수 없었다면, 출력 파일의 첫 번째 줄에 -1을 출력한다.

💡 문제 풀이


  1. 입력 받은 문자에 따라 문제 출제자들의 좌표를 이동.
  • 이동 방법:

    • 문제 출제자들의 위치를 (nowX, nowY)라고 했을 때 초기값을 (0,0)으로 둠.

    • I: nowX + 1

    • S: nowY + 1

    • Z: nowX - 1

    • J: nowY - 1

  1. 이동한 문제 출제자들의 좌표가 루카 위치의 좌표의 8방 이내에 포함되면 해당 턴 번호 추가.
  • 8방 범위:

    • X - 1 <= nowX <= X + 1

    • Y - 1 <= nowY <= Y + 1

‼️ 문제 출제자들의 초기 좌표(0,0)일 때도 확인하여 루카 주위에 있을 때 번호 0을 출력에 포함하여야 함.


✅ 코드 (Java)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

// https://www.acmicpc.net/problem/3234
// 입력받은 문자에 따라 문제 출제자들의 좌표를 이동하고 루카 좌표의 8방 이내에 포함되면 번호 추가
// 처음 문제 출제자들의 좌표(0,0)일 때도 확인하여 번호 0을 출력에 포함하여야 함
public class B3234_LUKA {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		StringTokenizer st = new StringTokenizer(br.readLine());
		int X = Integer.parseInt(st.nextToken()); // 루카가 있는 위치 X 좌표
		int Y = Integer.parseInt(st.nextToken()); // 루카가 있는 위치 Y 좌표
		int K = Integer.parseInt(br.readLine()); // 문제 출제자들의 이동 횟수
		char[] move = br.readLine().toCharArray(); // 문제 출제자들의 이동 경로
		int nowX = 0; // 문제 출제자들의 위치 X 좌표
		int nowY = 0; // 문제 출제자들의 위치 Y 좌표
		// 초기 위치의 문제 출제자들이 루카 주변(8방)에 있을 때
		if ((X - 1 <= nowX && nowX <= X + 1) && (Y - 1 <= nowY && nowY <= Y + 1)) {
			sb.append(0).append("\n");
		}
		// 문제 출제자들 이동
		for (int i = 0; i < K; i++) {
			char nowMove = move[i]; // 이동 방향
			switch (nowMove) { // 현재 위치 이동
			case 'I':
				nowX++;
				break;
			case 'S':
				nowY++;
				break;
			case 'Z':
				nowX--;
				break;
			case 'J':
				nowY--;
				break;
			}
			// 이동한 위치가 루카 주변(8방)에 있을 때
			if ((X - 1 <= nowX && nowX <= X + 1) && (Y - 1 <= nowY && nowY <= Y + 1)) {
				sb.append(i + 1).append("\n");
			}
		}
		if (sb.length() == 0) { // 한 번도 루카 주변에 있지 않았을 때
			sb.append(-1);
		}
		System.out.println(sb); // 출력
		br.close();
	}
}


💾 제출 결과


보러 가기