티스토리 뷰

문제보러가기

 

16939번: 2×2×2 큐브

첫째 줄에 2×2×2 루빅스 큐브 각 면의 각 칸 색상이 주어진다. 색상은 1부터 6까지의 자연수로 나타내며, 각 자연수는 총 4번 등장한다. i번째 수가 의미하는 칸은 아래와 같다.

www.acmicpc.net

이문제는 2차원 배열을 만들어 문제에서 제시한 대로 큐브 한 면에 해당하는 인덱스들을 90도씩 회전시킬 수 있느냐를 묻는 문제였다. 참.. 어려웠다.. 거의 막일로 푼 문제긴 한데.. 비슷한 코드는 묶어서 쓰기도 했다.

 

 

 

 

문제풀이

-문제에서 주어진 전개도 그대로 2차원 배열을 만들어 저장한다.

-문제에서는 큐브를 단 한 번만 회전할 경우만을 요구하고 있으므로

-회전은 총 12가지 경우가 있다

  1. 큐브의 앞면
  2. 큐브의 뒷면
  3. 큐브의 윗면
  4. 큐브의 아랫면
  5. 큐브의 왼쪽면
  6. 큐브의 오른쪽면

->이 경우를 모두 시계방향, 시계 반대방향 해줘야 하므로 6*2=12가지가 나오게 된다.

->이렇게 배열로 나타낼 수가 있다 6*8 배열이지만 나는 구현할 때에는 8*8 배열을 사용했다.

-그 후에 면이 돌아갈 때마다 원래의 배열 데이터가 날아가지 않게 copy() 함수를 통해 생성된 copyMap배열을 회전시킨다

-3차원 큐브이기 때문에 한 면이 돌아갈 경우 면에 해당하는 사각형뿐만 아니라 둘러싸고 있는 인덱스들 역시 같이 회전시켜줘야 한다.

->아랫면을 회전시킨다고 하면 색칠된 부분이 전부 회전이 되어야 하는 것이다.

 

-나는 규칙을 찾을 수 없는 부분들을 그냥 막일로 넣었고, 사각형 면같이 규칙이 있는 회전의 경우 함수를 만들어 사용하였다. 코드를 보면서 이해하는 게 더 쉬울 듯싶다.

 

 

package baekjoon;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Ex_16939 {
	static int[][] cube;
	static int[][] copyMap;

	public static void main(String[] args) throws Exception {

		cube = new int[8][8];
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());

		int index = 0;
		while (st.hasMoreTokens()) {
			if (index < 12) {
				for (int i = 2; i <= 3; i++) {
					cube[index / 2][i] = Integer.parseInt(st.nextToken());
					index++;
				}

			} else if (index < 16) {
				for (int i = 0; i <= 1; i++) {
					cube[(index + 1) / 5][i] = Integer.parseInt(st.nextToken());
					index++;
				}
			} else {
				for (int i = 2; i <= 3; i++) {
					for (int j = 4; j <= 5; j++) {
						cube[i][j] = Integer.parseInt(st.nextToken());
					}
				}
				for (int i = 2; i <= 3; i++) {
					for (int j = 6; j <= 7; j++) {
						cube[i][j] = Integer.parseInt(st.nextToken());
					}
				}
			}
		}

		// 뒷면 //
		// 시계방향
		copy();
		rotateSquare(0, 2, 0);
		rotateX(2, 0);
		if(check()) {
			System.out.println(1);
			return;
		}
		
		// 반시계방향
		copy();
		rotateSquare(0, 2, 1);
		rotateX(2, 1);
		if(check()) {
			System.out.println(1);
			return;
		}

		// 앞면 //
		copy();
		rotateSquare(4, 2, 0);
		rotateX(3, 0);
		if(check()) {
			System.out.println(1);
			return;
		}

		copy();
		rotateSquare(4, 2, 1);
		rotateX(3, 1);
		if(check()) {
			System.out.println(1);
			return;
		}
        
		//왼쪽 옆면//
		//앞쪽방향
		copy();
		rotateSquare(2,0,0);
		rotateY(2,0);
		if(check()) {
			System.out.println(1);
			return;
		}
		//뒷쪽방향
		copy();
		rotateSquare(2,0,1);
		rotateY(2,1);
		if(check()) {
			System.out.println(1);
			return;
		}
        
		//오른쪽 옆면//
		//앞쪽방향
		copy();
		rotateSquare(3,0,0);
		rotateY(3,0);
		if(check()) {
			System.out.println(1);
			return;
		}
		//뒷쪽방향
		copy();
		rotateSquare(3,0,1);
		rotateY(3,1);	
		if(check()) {
			System.out.println(1);
			return;
		}
        
		//아랫면//
		copy();
		rotateSquare(2,2,0);
		rotateBottom(0);
		if(check()) {
			System.out.println(1);
			return;
		}
		copy();
		rotateSquare(2,2,1);
		rotateBottom(1);
		if(check()) {
			System.out.println(1);
			return;
		}
		
		
		//윗면//
		copy();
		rotateSquare(2,6,0);
		rotateTop(0);
		if(check()) {
			System.out.println(1);
			return;
		}
		
		copy();
		rotateSquare(2,6,1);
		rotateTop(1);
		if(check()) {
			System.out.println(1);
			return;
		}
		

		System.out.println(0);

	}

	static void rotateSquare(int row, int col, int dir) {

		// 시계방향
		if (dir == 0) {
			copyMap[row][col] = cube[row + 1][col];
			copyMap[row][col + 1] = cube[row][col];
			copyMap[row + 1][col] = cube[row + 1][col + 1];
			copyMap[row + 1][col + 1] = cube[row][col + 1];
		}
		// 반시계방향
		else {
			copyMap[row][col] = cube[row][col + 1];
			copyMap[row][col + 1] = cube[row + 1][col + 1];
			copyMap[row + 1][col] = cube[row][col];
			copyMap[row + 1][col + 1] = cube[row + 1][col];
		}


	}
	static void rotateBottom(int dir) {
		if(dir==0) {
		copyMap[1][2] = cube[3][1];
		copyMap[1][3] = cube[2][1];
		copyMap[2][4] = cube[1][2];
		copyMap[3][4] = cube[1][3];
		copyMap[4][2] = cube[3][4];
		copyMap[4][3] = cube[2][4];
		copyMap[2][1] = cube[4][2];
		copyMap[3][1] = cube[4][3];
		}else {
			copyMap[1][2] = cube[2][4];
			copyMap[1][3] = cube[3][4];
			copyMap[2][4] = cube[4][3];
			copyMap[3][4] = cube[4][2];
			copyMap[4][2] = cube[2][1];
			copyMap[4][3] = cube[3][1];
			copyMap[2][1] = cube[1][3];
			copyMap[3][1] = cube[1][2];
		}
	}
	static void rotateTop(int dir) {
		if(dir==0) {
		copyMap[0][2] = cube[3][0];
		copyMap[0][3] = cube[2][0];
		copyMap[2][5] = cube[0][2];
		copyMap[3][5] = cube[0][3];
		copyMap[5][3] = cube[2][4];
		copyMap[5][2] = cube[3][4];
		copyMap[3][0] = cube[5][3];
		copyMap[2][0] = cube[5][2];
		}else {
			copyMap[0][2] = cube[2][4];
			copyMap[0][3] = cube[3][4];
			copyMap[2][5] = cube[5][3];
			copyMap[3][5] = cube[5][2];
			copyMap[5][3] = cube[3][0];
			copyMap[5][2] = cube[2][0];
			copyMap[3][0] = cube[0][2];
			copyMap[2][0] = cube[0][3];
		}
	}
//가로긴부분을 회전시키는 함수
	static void rotateX(int row, int dir) {
		if (dir == 0) {
			for (int i = 0; i < copyMap.length; i++) {
				int col = i < 6 ? i+2 : i%6;
				copyMap[row][i]=cube[row][col];
			}
		}
		else {
			for (int i = 0; i <copyMap.length; i++) {
				int col = i >1 ? i-2 : i+6;
				copyMap[row][i]=cube[row][col];
			}
		}
	}
    //세로긴부분을 회전시키는 함수
	static void rotateY(int col,int dir) {
		//앞으로
		if(dir==0) {
			for(int i=0;i<4;i++) {
				copyMap[i][col]=cube[i+2][col];
			}
			if(col==2) {
				copyMap[4][col] = cube[2][7];
				copyMap[5][col] = cube[3][7];
				copyMap[2][7] = cube[0][col];
				copyMap[3][7] = cube[1][col];
			}else {
				copyMap[4][col] = cube[2][6];
				copyMap[5][col] = cube[3][6];
				copyMap[2][6] = cube[0][col];
				copyMap[3][6] = cube[1][col];
			}
		}
		//뒤로
		else {
			for(int i=5;i>1;i--) {
				copyMap[i][col]=cube[i-2][col];
			}
			if(col==2) {
				copyMap[0][col] = cube[2][7];
				copyMap[1][col] = cube[3][7];
				copyMap[2][7] = cube[4][col];
				copyMap[3][7] = cube[5][col];
			}else {
				copyMap[0][col] = cube[2][6];
				copyMap[1][col] = cube[3][6];
				copyMap[2][6] = cube[4][col];
				copyMap[3][6] = cube[5][col];
			}
		}
	}
    //큐브가 맞춰졌는지->면마다 색이 다 같은지 확인
	static boolean check() {
		for(int i=0;i<6;i+=2) {
			int color = copyMap[i][2];
			for(int j=2;j<=3;j++) {
				if(copyMap[i][j]!=color || copyMap[i+1][j]!=color)
					return false;
			}
		}
		for(int i=0;i<copyMap.length;i+=2) {			
			int color = copyMap[2][i];
			for(int j=2;j<=3;j++) {
				if(copyMap[j][i]!=color || copyMap[j][i+1]!=color)
					return false;
			}
		}
		return true;
	}
    //배열을 복사하여 사용함
	static void copy() {
		int size = cube.length;
		copyMap = new int[size][size];
		for (int i = 0; i < size; i++) {
			System.arraycopy(cube[i], 0, copyMap[i], 0, size);
		}
	}

	

}

 코드가 엄청 길다... 풀면서도 이렇게 푸는 게 아닌 거 같은데,,, 이러면서 풀었다.. 다른 풀이도 찾아봐야지,,,

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함