백준_주사위 굴리기[Java]_도움요청

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

www.acmicpc.net

 

풀이

뭔가 이상하다.

시뮬레이션 문제라고 해서 그대로 풀었는데 테스트 케이스도 잘 맞는데 

자꾸 틀렸습니다 로만 채점된다.

이유 아시는 분 ! 댓글 남겨주세요 ㅜㅜ

 

import java.util.Scanner;

public class Main {
	static int N, M, x, y, K;
	static int[][] map;
	static int[] order;
	static int[] dice = {0,0,0,0,0,0,0};
	
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		N = scan.nextInt(); // 지도 세로 크기 
		M = scan.nextInt(); // 지도 가로 크기 
		x = scan.nextInt(); // 좌표 
		y = scan.nextInt();
		K = scan.nextInt(); // 명령의 갯수 
		
		map = new int[20][20];
		for(int i = 0; i < N; i++) {
			for(int j = 0; j < M; j++) {
				map[i][j] = scan.nextInt();
			}
		}
		
		//  동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4
		for(int i = 0; i < K; i++) {
            int order = scan.nextInt();
			if(order == 1) { 
				x++;
			} else if(order == 2) {
				x--;
			} else if(order == 3) {
				y--;				
			} else {
				y++;
			}
			
			if(x >= M || y >= N || x < 0 | y < 0) {
				// N과 M보다 크거나 같으면 락
				if(order == 1) { 
					x--;
				} else if(order == 2) {
					x++;
				} else if(order == 3) {
					y++;				
				} else {
					y--;
				}
			} else {
			//  동쪽은 1, 서쪽은 2, 북쪽은 3, 남쪽은 4
				int[] temp = dice.clone();
				if(order == 1) { 
					dice[1] = temp[4];
					dice[3] = temp[1];
					dice[6] = temp[3];
					dice[4] = temp[6];
				} else if(order == 2) {
					dice[1] = temp[3];
					dice[3] = temp[6];
					dice[6] = temp[4];
					dice[4] = temp[1];
				} else if(order == 3) { // 북쪽
					dice[1] = temp[5];
					dice[5] = temp[6];
					dice[6] = temp[2];
					dice[2] = temp[1];
				} else {
					dice[1] = temp[2];
					dice[5] = temp[1];
					dice[6] = temp[5];
					dice[2] = temp[6];
				}
				
				//System.out.println("x : " + x + " / y : " + y);
				if(map[y][x] == 0) {
					map[y][x] = dice[6];
				}else {
					dice[6] = map[y][x];
                    map[y][x] = 0;
				}
				System.out.println(dice[1]);
				
			}

		}
		
		scan.close();
	}


}

나의 결과,, 또르륵

* 참고로 나는 장외로 주사위가 굴러떨어지는 경우를 미리 계산해 떨어졌을 경우 다시 원상복귀 시키는 방법으로 구현하였는데

다른 많은 분들은 x,y를 담은 배열을 선언할 때 미래의 값과 현재의 값 총 4개의 값을 저장하는 배열을 선언하는 방식으로 구현하였다.

int[] = {oldX, oldY, newX, newY};

이런 식으로 하면 newX나 newY를 이용해 주사위가 지도 밖으로 떨어지는지 확인하더라 !

 

 

참고

- 자바로 친절하게 푸신 분 ! 

https://mygumi.tistory.com/244

 

백준 14499번 주사위 굴리기 :: 마이구미

이 글은 백준 알고리즘 문제 14999번 "주사위 굴리기" 를 풀이한다. 삼성 SW 역량 테스트의 기출 문제이다. 특정한 알고리즘을 요구하지 않고, 단순히 문제의 이해를 통한 구현이다. https://www.acmicpc.net/prob..

mygumi.tistory.com