기록하는 습관을 들이자

[ 백준 14999 주사위 굴리기 ] 문제 풀이(Java) - 삼성 SW역량테스트 기출 본문

알고리즘/BOJ

[ 백준 14999 주사위 굴리기 ] 문제 풀이(Java) - 삼성 SW역량테스트 기출

myeongmy 2020. 4. 16. 04:47
반응형

오늘은 백준 14999 주사위 굴리기 문제를 풀어보았습니다.

 

별도의 알고리즘이 필요하지 않은 시뮬레이션 문제입니다.

 

 

문제보기

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개의 줄에 지도에 쓰여 있는 수가 북쪽부터 남쪽으로, 각 줄은 서쪽부터 동쪽 순서대로 주어진다. 주사위를 놓은 칸에 쓰여 있는 수는 항상 0이다. 지도의 각 칸에 쓰여 있는 수는 10을 넘지 않는 자연수 또는 0이다. 마

www.acmicpc.net

 

나의 풀이

 

주사위를 어떻게 구현할지만 생각하면 간단히 풀리는 문제입니다. 주사위는 6개의 면을 가진 정육면체이므로 저는 size 6의 배열을 선언하여 저장했습니다. 그리고 이동 명령에 따라 각 면에 있는 수를 어떻게 배치할지만 생각해주면 됩니다.

 

아이패드로 끄적끄적,,,

 

다음과 같이 주사위를 정의한 다음 각각의 동, 서, 남, 북에 따라 어느 면에 있는 수가 어느 면으로 이동할 지를 생각해주었습니다.

 

그리고 각 면의 수를 이동해준 다음 문제에 따라,

 

"이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다."

 

이것을 구현해주면 됩니다.

 

 

코드

//시뮬레이션 문제

import java.io.*;
import java.util.*;

public class N_14499 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		try {
			String[] arr = br.readLine().split(" ");
			int N = Integer.parseInt(arr[0]);
			int M = Integer.parseInt(arr[1]);
			int x = Integer.parseInt(arr[2]); // 주사위 시작 위치
			int y = Integer.parseInt(arr[3]);
			int K = Integer.parseInt(arr[4]); // 명령의 개수

			int[][] A = new int[N][M];
			int[] dice = new int[6]; // 주사위(0: 윗면, 1: 아랫면, 2: 앞면, 3: 뒷면, 4: 왼쪽 면, 5: 오른쪽 면)

			for (int i = 0; i < N; i++) {
				String[] arr1 = br.readLine().split(" ");
				for (int j = 0; j < M; j++) {
					A[i][j] = Integer.parseInt(arr1[j]);
				}
			}

			String[] command = br.readLine().split(" ");
			for (int i = 0; i < command.length; i++) {
				int dir = Integer.parseInt(command[i]);

				// 주사위 굴리기
				if (dir == 1) { // 동쪽
					if (y + 1 >= M)
						continue;
					y++;
					int temp = dice[1];
					dice[1] = dice[5];
					dice[5] = dice[0];
					dice[0] = dice[4];
					dice[4] = temp;

				} else if (dir == 2) { // 서쪽
					if (y - 1 < 0)
						continue;
					y--;
					int temp = dice[1];
					dice[1] = dice[4];
					dice[4] = dice[0];
					dice[0] = dice[5];
					dice[5] = temp;

				} else if (dir == 3) { // 북쪽
					if (x - 1 < 0)
						continue;
					x--;
					int temp = dice[1];
					dice[1] = dice[3];
					dice[3] = dice[0];
					dice[0] = dice[2];
					dice[2] = temp;

				} else if (dir == 4) { // 남쪽
					if (x + 1 >= N)
						continue;
					x++;
					int temp = dice[1];
					dice[1] = dice[2];
					dice[2] = dice[0];
					dice[0] = dice[3];
					dice[3] = temp;
				}

				// 수 업데이트
				if (A[x][y] == 0) {
					A[x][y] = dice[1];
				} else {
					dice[1] = A[x][y];
					A[x][y] = 0;
				}
				System.out.println(dice[0]);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

 

결과

 

백준 채점결과

반응형
Comments