티스토리 뷰
이문제는 2차원 배열을 만들어 문제에서 제시한 대로 큐브 한 면에 해당하는 인덱스들을 90도씩 회전시킬 수 있느냐를 묻는 문제였다. 참.. 어려웠다.. 거의 막일로 푼 문제긴 한데.. 비슷한 코드는 묶어서 쓰기도 했다.
문제풀이
-문제에서 주어진 전개도 그대로 2차원 배열을 만들어 저장한다.
-문제에서는 큐브를 단 한 번만 회전할 경우만을 요구하고 있으므로
-회전은 총 12가지 경우가 있다
- 큐브의 앞면
- 큐브의 뒷면
- 큐브의 윗면
- 큐브의 아랫면
- 큐브의 왼쪽면
- 큐브의 오른쪽면
->이 경우를 모두 시계방향, 시계 반대방향 해줘야 하므로 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);
}
}
}
코드가 엄청 길다... 풀면서도 이렇게 푸는 게 아닌 거 같은데,,, 이러면서 풀었다.. 다른 풀이도 찾아봐야지,,,
'CS공부 > 알고리즘&문제풀이' 카테고리의 다른 글
[프로그래머스]2020카카오블라인드:기둥과 보 설치 (java) (0) | 2020.09.07 |
---|---|
[백준 16928]뱀과 사다리 게임 (java) (0) | 2020.09.06 |
[프로그래머스]2020카카오블라인드:자물쇠와열쇠(java) (0) | 2020.08.27 |
[백준 15683]감시/삼성 sw역량 테스트 기출(java) (0) | 2020.08.12 |
[프로그래머스]DP:정수 삼각형(java) (0) | 2020.08.06 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준
- Spring
- SWEA
- JavaScript
- 자바
- java
- websocket
- Oracle
- 코딩테스트
- programers
- 삼성 sw역량 테스트
- 채팅
- 정렬
- 알고리즘
- DP
- Heap
- 최소 스패닝 트리
- 완전탐색
- dfs
- BFS
- MST
- 분리 집합
- sockjs
- 삼성 sw역량테스트
- 운영체제
- Stomp
- OS
- Baekjoon
- 프로그래머스
- git
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함