Step-by-Step

[JAVA] 백준 - 주사위 굴리기 본문

언어/JAVA

[JAVA] 백준 - 주사위 굴리기

희주(KHJ) 2022. 2. 18. 14:23

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

이 문제는 어떻게 접근해야하는지만 깨달으면 쉽게 풀 수 있는 문제인데,,, 사실 그러기가 쉽지 않다(어렵다)

문제에서 이런식으로 주사위를 펼쳐놓은 모양을 보여주고, 친절하게 번호까지 지정해준다 (이게 큰 힌트)

주사위가 어떤 칸에 도달하면, 칸의 숫자가 0이 아니면 주사위 밑면에 값을 복사하고 0으로 만들어주며

칸의 숫자가 0이면 주사위 밑면의 숫자를 칸에 복사해야한다! 

그리고 우리가 출력해야 하는 값은 주사위 윗면의 값이기 때문에,

칸을 이동할때마다 주사위의 값이 매 번 어떻게 바뀌는지 알아야 한다

일단 주사위의 값을 담을 크기6짜리 1차원 배열을 선언해준다

그리고 0~5까지 각각 인덱스 값을 위의 주사위 전개도의 그림에 있는 위치라고 생각한다! (6은 0으로 대체)

그리고 회전하는 방향마다 영향을 받는 곳의 값들을 바꿔주면 된다

남쪽으로 이동, 동쪽으로 이동 값 이동

문제의 풀이 방식을 깨닫는 순간 코드 작성은 쉬워진다

import java.util.Scanner;

public class Solution{
	static int n,m,x,y;
	static int[][] map;
	//동-서-북-남 순서
	static int[] dx = {0,0,0,-1,1};
	static int[] dy = {0,1,-1,0,0};
	//윗면 : 1 , 아랫면 : 0
	static int[] dice = new int[6];
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		m = sc.nextInt();
		x = sc.nextInt();
		y = sc.nextInt();
		int move = sc.nextInt();
//		/동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4
		map = new int[n][m];
		
		for(int i=0; i<n; i++)
			for(int j=0; j<m; j++)
				map[i][j] = sc.nextInt();
		
		for(int k=0; k<move; k++) {
			int dir = sc.nextInt();
			int nextX = x+dx[dir];
			int nextY = y+dy[dir];
			
			if(nextX==n || nextY==m || nextX<0 || nextY<0)
				continue;
			
			x = nextX;
			y = nextY;
			
			change(dir,map[x][y]);
						
			System.out.println(dice[1]);
		}
	}
	
	static void change(int dir, int num) {
		int[] temp = dice.clone();
		switch(dir) {
		//동쪽
		case 1:{
			dice[3]=temp[1];
			dice[1]=temp[4];
			dice[4]=temp[0];
			dice[0]=temp[3];
			break;
		}
		//서쪽
		case 2:{
			dice[4]=temp[1];
			dice[1]=temp[3];
			dice[3]=temp[0];
			dice[0]=temp[4];
			break;
		}
		//북쪽
		case 3:{
			dice[2]=temp[1];
			dice[1]=temp[5];
			dice[5]=temp[0];
			dice[0]=temp[2];
			break;
		}
		//남쪽
		default:{
			dice[2]=temp[0];
			dice[1]=temp[2];
			dice[5]=temp[1];
			dice[0]=temp[5];
		}
		}
		
		if(num!=0) {
			dice[0]=num;
			map[x][y]=0;
		}
		else
			map[x][y]=dice[0];
	}
}

다른 사람들 풀이를 보니까 거의 나와 비슷하게 한 것 같았다

주사위 굴리면 굴러가는 방향에 있는 숫자들 빼고 양 옆쪽에 있는 숫자들은 바뀌지 않기 때문에

모든 경우에 4면씩 값을 바꿔주면 된다 '^'

 

Comments