Hope Everyone Is Happy

[골드4] 14499. 주사위 굴리기 (Java) 본문

※ 백준 (Baekjoon)/[Java] 문제 풀이 ( Solve the problems)

[골드4] 14499. 주사위 굴리기 (Java)

J 크 2023. 10. 17. 17:37
728x90
반응형

https://www.acmicpc.net/problem/14499

 

14499번: 주사위 굴리기

첫째 줄에 지도의 세로 크기 N, 가로 크기 M (1 ≤ N, M ≤ 20), 주사위를 놓은 곳의 좌표 x, y(0 ≤ x ≤ N-1, 0 ≤ y ≤ M-1), 그리고 명령의 개수 K (1 ≤ K ≤ 1,000)가 주어진다. 둘째 줄부터 N개의 줄에 지

www.acmicpc.net

구른다,,


※  문제를 요약하면 아래와 같습니다.

▶ 크기가 NxM인 맵에 주사위의 시작 좌표가 주어지며, 명령의 개수가 주어짐

주사위는 각 명령에 해당하는 방향으로 이동과 동시에 구르게 됨 ( 동 : 1, 서 : 2, 북 : 3, 남 : 4)

이 때 맵의 값이 0이면, 주사위의 바닥면에 쓰여있는 수가 맵으로 복사

맵의 값이 0이 아니면 주사위의 바닥면으로 맵의 값이 복사, 맵의 값은 0으로 변환

▶ 모든 명령이 끝난 후 주사위의 상단에 쓰여있는 값 출력

▶ Input : 첫째 줄에 지도의 세로 크기 N, 가로 크기 M, 주사위를 놓는 좌표 Row, Col, 명령의 개수 K

                이후 N개의 줄에 맵의 값, 마지막 줄에 K개 만큼 공백을 구분으로 명령 입력

▶ Output : 이동할 때 마다 주사위의 윗면 수 출력, 바깥으로 이동시키려고 하는 경우, 해당 명령 무시 && 출력 X


◈ Input - 1

4 2 0 0 8
0 2
3 4
5 6
7 8
4 4 4 1 3 3 3 2

◈ Output - 1

0
0
3
0
0
8
6
3

◈ Input - 2

3 3 1 1 9
1 2 3
4 0 5
6 7 8
1 3 2 2 4 4 1 1 3

◈ Output - 2

0
0
0
3
0
1
0
6
0

◈ Input - 3

2 2 0 0 16
0 2
3 4
4 4 4 4 1 1 1 1 3 3 3 3 2 2 2 2

◈ Output - 3

0
0
0
0

 ◎  코드 작성 전, 아래와 같이 솔루션을 정리하였습니다.

▶ 주사위의 정보를 4(row)x3(col) 크기의 2차원 배열로 저장

      (0,1) (1,0) (1,1) (1,2) (2,1) (3,1) 만 주사위의 값으로 사용

 각각의 화살표 방향으로 주사위를 굴렸을 때 아래 그림에서 규칙 확인 가능

     1. 세로로 움직일 때 가운데 열 (0,1) , (1,1), (2,1), (3,1)에 해당하는 배열값들만 해당 방향의 반대로 배열값이 이동

     2. 가로로 움직일 때  2번째 행 과 (3,1)의 배열값만 이동하며, 해당하는 방향의 반대로 배열값이 이동

동, 서, 북, 남 방향을 델타 탐색으로 맵을 이동, 맵 벗어날 시 주사위 움직임 및 출력 금지

주사위의 바닥면 == (3,1), 주사위의 상단면은 (1,1)로 설정, 바닥면을 맵과 비교

다음 방향의 맵의 값이 0이면 주사위의 바닥면 값을 맵에 적용

 다음 방향의 맵의 값이 0이아니면 맵의 값을 주사위의 바닥면 값으로 옮긴 후 0으로 변경

주사위 움직일 때 마다 상단면 (1,1) 출력


import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.HashMap;
import java.util.StringTokenizer;

public class Main {

	static int N, M, nDicePoint;
	static int[][] narrMap, narrDice;
	static int[] nDice;

	// 동, 서, 북, 남
	static int dr[] = { 0, 0, -1, 1 };
	static int dc[] = { 1, -1, 0, 0 };

	public static void main(String[] args) throws NumberFormatException, IOException {
		// TODO Auto-generated method stub
		BufferedReader bReader = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bWriter = new BufferedWriter(new OutputStreamWriter(System.out));

		StringTokenizer st = new StringTokenizer(bReader.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		int nRow = Integer.parseInt(st.nextToken());
		int nCol = Integer.parseInt(st.nextToken());
		int K = Integer.parseInt(st.nextToken());

		narrMap = new int[N][M];
		narrDice = new int[4][3];

		// 맵의 좌표 값 입력받자
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(bReader.readLine());
			for (int j = 0; j < M; j++) {
				narrMap[i][j] = Integer.parseInt(st.nextToken());
			}
		}

		st = new StringTokenizer(bReader.readLine());
		for (int i = 0; i < K; i++) {
			int nDirect = Integer.parseInt(st.nextToken());

			// 이동 고고
			int nSearchRow = nRow + dr[nDirect - 1];
			int nSearchCol = nCol + dc[nDirect - 1];

			if (nSearchRow < 0 || nSearchCol < 0 || nSearchRow >= N || nSearchCol >= M)
				continue;

			MoveDice(nDirect - 1);

			// 바닥면이 0이면 ? 맵의 값을 넣어준다.
			if (narrMap[nSearchRow][nSearchCol] == 0) {
				narrMap[nSearchRow][nSearchCol] = narrDice[3][1];
			} else {
				// 아니면 칸에 쓰여있는 수가 주사위의 바닥면으로 복사되며, 칸은 0이된다.
				narrDice[3][1] = narrMap[nSearchRow][nSearchCol];
				narrMap[nSearchRow][nSearchCol] = 0;
			}

			nRow = nSearchRow;
			nCol = nSearchCol;

			bWriter.write(narrDice[1][1] + "\n");
		}

		bWriter.close();
	}

	private static void MoveDice(int nDirect) {

		// 주사위가 동쪽으로
		if (nDirect == 0) {
			int nTemp = narrDice[1][0];
			for (int i = 0; i < 2; i++)
				narrDice[1][i] = narrDice[1][i + 1];
			narrDice[1][2] = narrDice[3][1];
			narrDice[3][1] = nTemp;
		}
		// 서
		if (nDirect == 1) {
			int nTemp = narrDice[1][2];
			for (int i = 2; i > 0; i--)
				narrDice[1][i] = narrDice[1][i - 1];
			narrDice[1][0] = narrDice[3][1];
			narrDice[3][1] = nTemp;
		}

		// 북
		if (nDirect == 2) {
			int nTemp = narrDice[3][1];
			for (int i = 3; i > 0; i--)
				narrDice[i][1] = narrDice[i - 1][1];
			narrDice[0][1] = nTemp;
		}

		// 남
		if (nDirect == 3) {
			int nTemp = narrDice[0][1];
			for (int i = 0; i < 3; i++)
				narrDice[i][1] = narrDice[i + 1][1];
			narrDice[3][1] = nTemp;
		}

	}

}

Good Luck! (피드백 감사합니다!)