Development Logs/Algorithms

[JAVA] 백준 14499번 : 주사위 굴리기 (삼성 SW 역량 테스트 기출 문제)

유뱅유뱅뱅 2020. 8. 7. 15:41

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

 

문제

 

해결방안

구현 문제이다. 주사위가 굴러갈때마다 지도의 좌표와 주사위를 계속 바꿔주면 된다. 

1. 좌표의 경우 동쪽, 서쪽인 경우 y값을 변화시켜주고 이 때 지도의 범위에서 넘어가는지 확인하는 과정이 필요하다.

1-1. 지도에서 넘어갈 경우 해당 명령을 무시하고 넘어가면 된다.

1-2. 지도에서 넘어가지 않는 경우 문제에 주어진 과정을 구현해주면 된다.
(주사위를 굴렸을 때, 이동한 칸에 쓰여 있는 수가 0이면, 주사위의 바닥면에 쓰여 있는 수가 칸에 복사된다. 0이 아닌 경우에는 칸에 쓰여 있는 수가 주사위의 바닥면으로 복사되며, 칸에 쓰여 있는 수는 0이 된다. 주사위를 놓은 곳의 좌표와 이동시키는 명령이 주어졌을 때, 주사위가 이동했을 때 마다 상단에 쓰여 있는 값을 출력한다.)

2. 주사위 경우 항상 주사위의 밑면 index는 6이고 윗면은 1이고 그 외는 주사위의 전개도를 참고한다.
동서남북으로 굴러갈때 굴러간 주사위 면의 값들을 각 주사위 index에 저장해준다.

 

 

코드

import java.util.Scanner;

// 주사위 굴리기
// NxM 지도
// 지도의 오른쪽은 동쪽, 위쪽은 북쪽
// 지도의 좌표 (r,c) 
// r: 북쪽으로부터 떨어진 칸의 갯수
// c: 서쪽으로부터 떨어진 칸의 갯수

public class Main {

	static int n; // 지도의 세로크기 (x)
	static int m; // 지도의 가로크기 (y)
	static int x,y; // 주사위를 놓은 곳의 좌표
	static int k; // 명령의 갯수
	static int[][] maps;
	static int[] dice;
	static int[] tempDice;
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		n = input.nextInt();
		m = input.nextInt();
		x = input.nextInt();
		y = input.nextInt();
		k = input.nextInt();

		dice = new int[7];
		
		maps = new int[n][m];
		for(int i=0; i<maps.length; i++) {
			for(int j=0; j<maps[i].length; j++) {
				maps[i][j] = input.nextInt();
				
				// 처음 시작일때(x,y) 밑면이 6
				if(x==i && y==j) {
					if(maps[x][y] == 0)
						maps[x][y] = 0;
					else {
						dice[6] = maps[x][y];
						maps[x][y] = 0;
					}
				}
			}
		}
		
		int command;
		for(int i=0; i<k; i++) {
			command = input.nextInt();
			rollTheDice(command);
		}
	}
	
	// 주사위 굴리기
	// 동:1, 서:2, 북:3, 남:4
	// 범위 넘어가면 명령 무시
	// 아니면 주사위의 윗 면에 써있는 수를 출력(dice[1]);
	public static void rollTheDice(int command) {
		tempDice = dice.clone();
		boolean flag = true;
		
		if(command == 1) {
			if(y+1 < m) {
				y+=1;
				
				dice[1] = tempDice[4];
				dice[2] = tempDice[2];
				dice[3] = tempDice[1];
				dice[4] = tempDice[6];
				dice[5] = tempDice[5];
				dice[6] = tempDice[3];
			}
			else
				flag = false;
		}
		else if(command == 2) {
			if(y-1 >= 0) {
				y-=1;
				
				dice[1] = tempDice[3];
				dice[2] = tempDice[2];
				dice[3] = tempDice[6];
				dice[4] = tempDice[1];
				dice[5] = tempDice[5];
				dice[6] = tempDice[4];
			}
			else
				flag = false;
		}
		else if(command == 3) {
			if(x-1 >= 0) {
				x-=1;
				
				dice[1] = tempDice[5];
				dice[2] = tempDice[1];
				dice[3] = tempDice[3];
				dice[4] = tempDice[4];
				dice[5] = tempDice[6];
				dice[6] = tempDice[2];
			}
			else
				flag = false;
		}
		else if(command == 4) {
			if(x+1 < n) {
				x+=1;
				
				dice[1] = tempDice[2];
				dice[2] = tempDice[6];
				dice[3] = tempDice[3];
				dice[4] = tempDice[4];
				dice[5] = tempDice[1];
				dice[6] = tempDice[5];
			}
			else
				flag = false;
		}
		else {
			;
		}
		
		if(flag) {

			// 지도 좌표가 0인 경우 dice에 적힌 수가 지도 좌표에 적힌 값이 됨
			// 주사위의 젤 밑부분인 dice[6]이 지도 좌표에 적힌 값이 됨
			if(maps[x][y] == 0)
				maps[x][y] = dice[6];
			else {
				dice[6] = maps[x][y];
				maps[x][y] = 0;
			}

			// 그 윗부분인 dice[1]을 출력
			System.out.println(dice[1]);
		}
	}

}