본문으로 바로가기

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. 문제

NxM 크기의 map이 주어진다. map 위에서 주사위를 굴릴 때 주사위의 윗면 숫자를 출력한다.

구를 때 규칙이 있다.

1. 이동한 칸이 0이면 주사위의 바닥면 숫자가 복사된다.

2. 이동한 칸이 0이 아니면 주사위의 바닥면에 칸의 숫자가 복사되고, 칸은 0이 된다.

2. 풀이

매번 굴릴 때마다 

1. 주사위 굴리기

2. 지도 상 주사위 좌표 이동, 지도 값 갱신

을 반복해주었다.

주사위 굴리기에는 규칙이 있다.

동 

내가 놓친 부분은 switch로 방향에 따라 분기처리를 했는데, switch의 파라미터로 들어오는 값으로 0,1,2,3 처럼 -1을 해서 뵀다. 그럼 case에서도 이에 맞춰서 0,1,2,3으로 처리를 해줘야 하는데 1,2,3,4로 보고있었으니 동쪽과 남쪽은 처리되고 있지 않았던 것이다.

3. 코드

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

public class Main {
    
	static int N, M, y, x, K, map[][], moveTo[];
	static int[] dice = {0, 0, 0, 0, 0, 0, 0};
	
	static int[] dy = { 0, 0,-1, 1};
	static int[] dx = { 1,-1, 0, 0};
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		y = Integer.parseInt(st.nextToken());
		x = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());
		
		map = new int[N][M];
		moveTo = new int[K];
		
		for (int i=0; i<N; i++) {
			st = new StringTokenizer(br.readLine());
			for (int j = 0; j<M; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		st = new StringTokenizer(br.readLine());
		for(int i=0; i<K; i++) {
			moveTo[i] = Integer.parseInt(st.nextToken());
		}
		// 입력 끝
		
		for (int i=0; i<K; i++) {
			int d = moveTo[i]-1;
			int ny = y+dy[d];
			int nx = x+dx[d];
			if (ny<0 || ny>=N || nx<0 || nx>=M) continue;
			y = ny;
			x = nx;
			change(d);
			move(y, x);
			System.out.println(dice[1]);
		}
	}
	
	static void change(int dir) {
		int tmp = dice[1];
		switch(dir) {
		case 0: //동
			dice[1] = dice[4];
			dice[4] = dice[6];
			dice[6] = dice[3];
			dice[3] = tmp;
			break;
		case 1: //서
			dice[1] = dice[3];
			dice[3] = dice[6];
			dice[6] = dice[4];
			dice[4] = tmp;
			break;
		case 2: //북
			dice[1] = dice[5];
			dice[5] = dice[6];
			dice[6] = dice[2];
			dice[2] = tmp;
			break;
		case 3: //남
			dice[1] = dice[2];
			dice[2] = dice[6];
			dice[6] = dice[5];
			dice[5] = tmp;
			break;
		}
	}
	
	static void move(int ny, int nx) {
		if (map[ny][nx] == 0) {
			map[ny][nx] = dice[6];
		}
		else {
			dice[6] = map[ny][nx];
			map[ny][nx] = 0;
		}
	}
}

4. 사담

이틀 걸린 문제다. 골드4 시뮬레이션이 이틀걸린다.. 정말 많이 분발하자