본문 바로가기
Problem Solving/삼성 SW 역량 테스트 기출

백준 14499 : 주사위 굴리기

by Libi 2021. 8. 1.
반응형

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

[ 문제풀이 ]

단순한 시뮬레이션 문제이다. 각 방향으로 주사위를 굴리는 부분만 구현하면 쉽게 해결할 수 있는 문제이다.

나는 주사위를 굴렸을 때 6번 면이 항상 아래 면으로 오도록 구현하였다.

  • 동쪽으로 주사위를 굴리는 경우 : (3, 6), (1, 3), (4, 1)을 swap 해주면 된다.
  • 서쪽으로 주사위를 굴리는 경우 : (6, 4), (4, 1), (1, 3)을 swap 해주면 된다.
  • 북쪽으로 주사위를 굴리는 경우 : (2, 6), (1, 2), (5, 1)을 swap 해주면 된다.
  • 남쪽으로 주사위를 굴리는 경우 : (5, 6), (1, 5), (2, 1)을 swap 해주면 된다.
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {

	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
	static StringTokenizer st;

	static int N, M, K, diceY, diceX;
	static int[] dice;
	static int[][] map;

	static int[][] dir = {{0,1}, {0,-1}, {-1,0}, {1,0}};

	public static void main(String[] args) throws IOException {
		dice = new int[7];
		st = new StringTokenizer(br.readLine());
		N = Integer.parseInt(st.nextToken());
		M = Integer.parseInt(st.nextToken());
		diceY = Integer.parseInt(st.nextToken());
		diceX = Integer.parseInt(st.nextToken());
		K = Integer.parseInt(st.nextToken());

		map = new int[N][M];
		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) {
			int cmd = Integer.parseInt(st.nextToken()) - 1;
			
			if (simulation(cmd)) {
				bw.write(dice[1] + "\n");
			}
		}

		bw.flush();bw.close();br.close();
	}

	public static boolean simulation(int cmd) {
		int ny = diceY + dir[cmd][0];
		int nx = diceX + dir[cmd][1];

		//범위를 벗어나면 종료
		if (ny < 0 || nx < 0 || ny >= N || nx >= M) return false;

		diceY = ny; diceX = nx;

		if (cmd == 0) {
			swap(3, 6); swap(1, 3); swap(4, 1);
		} else if (cmd == 1) {
			swap(6, 4); swap(4, 1); swap(1, 3);
		} else if (cmd == 2) {
			swap(2, 6); swap(1, 2); swap(5, 1);
		} else if (cmd == 3){
			swap(5, 6); swap(1, 5); swap(2, 1);
		}

		//주사위 6번 면을 복사
		copy_Bottom();
		
		return true;
	}

	public static void copy_Bottom() {
		if (map[diceY][diceX] == 0) {
			map[diceY][diceX] = dice[6];
		} else {
			dice[6] = map[diceY][diceX];
			map[diceY][diceX] = 0;
		}
	}

	public static void swap(int a, int b) {
		int temp = dice[a];
		dice[a] = dice[b];
		dice[b] = temp;
	}
}
반응형

'Problem Solving > 삼성 SW 역량 테스트 기출' 카테고리의 다른 글

백준 14501 : 퇴사  (0) 2021.08.01
백준 14500 : 테트로미노  (0) 2021.08.01
백준 13458 : 시험 감독  (0) 2021.08.01
백준 3190 : 뱀  (0) 2021.08.01
백준 12100 : 2048(Easy)  (0) 2021.08.01

댓글