알고리즘 문제해결/BOJ

BOJ 16939 2×2×2 큐브

havana723 2022. 7. 31. 18:11

https://www.acmicpc.net/problem/16939

 

16939번: 2×2×2 큐브

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

www.acmicpc.net

 

시키는 대로 구현하면 되는 문제입니다.

 

총 6개의 축으로 돌릴 수 있고 각 축마다 시계/반시계 방향으로 돌릴 수 있습니다. 2x2x2 큐브인데다가 딱 한 번 돌렸을 때 가능한지 묻는 문제이기 때문에 돌려질 때의 옆면은 신경쓰지 않아도 됩니다.

 

어떤 면들이 축인지를 입력받아 회전시켜주는 함수 rotate를 만들었고 반시계로 돌린다는 건 시계 방향으로 세 번 돌려준다는 뜻이기 때문에 각 축에 대해 네 번씩 돌려주며 중간중간 큐브가 맞춰줬는지 확인해줬습니다.

 

이것보단 깨끗하게 짤 수 있을 거 같은데... 머리보다 몸이 고생하는 게 좋았기 때문에 그냥 짰습니다.

 

큐빙과의 난이도 차이는 크게 모르겠어요. 비슷하게 귀찮은 문제인거 같습니다.

 

아래는 코드입니다.

 

#include <bits/stdc++.h>
#define FastIO ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define endl '\n'
#define ends ' '

using namespace std;

int T, n, cube[25];

int checkcheck(int a, int b, int c, int d) {
  if (a == b && b == c && c == d) return 1;
  return 0;
}

int check() {
  for (int i = 1; i < 24; i += 4) {
    if (!checkcheck(cube[i], cube[i + 1], cube[i + 2], cube[i + 3])) {
      return 0;
    }
  }
  return 1;
}

void rotate(int c1, int c2, int c3, int c4, int c5, int c6, int c7, int c8) {
  int tmp1 = cube[c1];
  int tmp2 = cube[c2];
  cube[c1] = cube[c3];
  cube[c2] = cube[c4];
  cube[c3] = cube[c5];
  cube[c4] = cube[c6];
  cube[c5] = cube[c7];
  cube[c6] = cube[c8];
  cube[c7] = tmp1;
  cube[c8] = tmp2;
}

int32_t main(void) {
  FastIO;
  T = 1;
  //cin >> T;

  while (T--) {
    for (int i = 1; i <= 24; i++) cin >> cube[i];

    int flag = 0;

    rotate(1, 3, 5, 7, 9, 11, 24, 22);
    if (check()) flag = 1;
    rotate(1, 3, 5, 7, 9, 11, 24, 22);
    rotate(1, 3, 5, 7, 9, 11, 24, 22);
    if (check()) flag = 1;
    rotate(1, 3, 5, 7, 9, 11, 24, 22);

    rotate(2, 4, 6, 8, 10, 12, 23, 21);
    if (check()) flag = 1;
    rotate(2, 4, 6, 8, 10, 12, 23, 21);
    rotate(2, 4, 6, 8, 10, 12, 23, 21);
    if (check()) flag = 1;
    rotate(2, 4, 6, 8, 10, 12, 23, 21);

    rotate(13, 14, 5, 6, 17, 18, 21, 22);
    if (check()) flag = 1;
    rotate(13, 14, 5, 6, 17, 18, 21, 22);
    rotate(13, 14, 5, 6, 17, 18, 21, 22);
    if (check()) flag = 1;
    rotate(13, 14, 5, 6, 17, 18, 21, 22);

    rotate(15, 16, 7, 8, 19, 20, 23, 24);
    if (check()) flag = 1;
    rotate(15, 16, 7, 8, 19, 20, 23, 24);
    rotate(15, 16, 7, 8, 19, 20, 23, 24);
    if (check()) flag = 1;
    rotate(15, 16, 7, 8, 19, 20, 23, 24);


    rotate(3, 4, 17, 19, 10, 9, 16, 14);
    if (check()) flag = 1;
    rotate(3, 4, 17, 19, 10, 9, 16, 14);
    rotate(3, 4, 17, 19, 10, 9, 16, 14);
    if (check()) flag = 1;
    rotate(3, 4, 17, 19, 10, 9, 16, 14);

    rotate(1, 2, 18, 20, 12, 11, 15, 13);
    if (check()) flag = 1;
    rotate(1, 2, 18, 20, 12, 11, 15, 13);
    rotate(1, 2, 18, 20, 12, 11, 15, 13);
    if (check()) flag = 1; rotate(1, 2, 18, 20, 12, 11, 15, 13);

    if (flag) cout << 1 << endl;
    else cout << 0 << endl;
  }

  return 0;
}

'알고리즘 문제해결 > BOJ' 카테고리의 다른 글

BOJ 5502 팰린드롬  (0) 2022.08.04
BOJ 8872 빌라봉  (0) 2022.08.03
BOJ 5859 Liars and Truth Tellers  (0) 2022.08.02
BOJ 1635 1 또는 -1  (0) 2022.08.01
BOJ 3056 007  (0) 2022.07.29