이 문제는 시뮬레이션 문제이다. (시뮬레이션 구현을 위해 노가다가 필요하다..)
문제에서 요구하는 바는 주어진 순서대로 큐브를 회전시켰을 때의 상태를 구하는 것이다.
문제를 푸는 로직 자체는 매우 쉽지만, 이를 구현하기 위한 방법이 매우 까다롭다.
먼저, 나는 문제를 풀기 위해 다음과 같이 큐브의 전개도를 구성하였다.
큐브의 전개도
이 전개도는 가상의 위치로써, 큐브가 회전하더라도 어떻게 큐브가 회전하였는지 우리가 알기 쉽게 도와준다.
이 전개도를 구현하기 위해 나는 cube라는 3차원 리스트 변수를 두었고, 다음과 같이 구성하였다.
즉, cube는 3*3 2차원 배열을 6개 가진 변수이다.
cube변수의 구조
큐브의 각 칸에 대한 숫자들은 나중에 큐브가 회전할 때 우리가 쉽게 이해하기 위해 임의로 둔 숫자이다.
이제 우리는 코드로 큐브를 구현하였으니, 모든 회전 명령에 대해서 구현하여야 한다.
다음은 큐브가 회전했을 때의 전개도 상태를 나타낸 그림들이다.
윗 면을 회전한 큐브의 전개도
아랫 면을 회전한 큐브의 전개도
앞 면을 회전한 큐브의 전개도
뒷 면을 회전한 큐브의 전개도
왼쪽 면을 회전한 큐브의 전개도
오른쪽 면을 회전한 큐브의 전개도
각 회전 명령에 대한 코드는 4~86번째 줄에 구현되어 있다.
이제 필요한 함수는 모두 작성하였으니, 문제를 풀면 된다.
문제를 푼 로직은 다음과 같다.
- 큐브를 초기화한다. (92~99번째 줄)
- 주어진 모든 명령에 대해서 큐브를 회전시키고 출력한다. (101~109번째 줄)
- 모든 테스트 케이스에 대해서 수행한다. (89~91번째 줄)
| import sys |
| |
| |
| def get_plain_index(p): |
| if p == 'U': |
| return 0 |
| elif p == 'L': |
| return 1 |
| elif p == 'F': |
| return 2 |
| elif p == 'R': |
| return 3 |
| elif p == 'B': |
| return 4 |
| elif p == 'D': |
| return 5 |
| |
| |
| def rotate(p, d): |
| global cube |
| idx = get_plain_index(p) |
| |
| if d == '-': |
| |
| cube[idx] = list(reversed(list(map(list, zip(*cube[idx]))))) |
| |
| if p == 'U': |
| cube[1][0], cube[2][0], cube[3][0], cube[4][0] = cube[4][0], cube[1][0], cube[2][0], cube[3][0] |
| elif p == 'D': |
| cube[1][2], cube[2][2], cube[3][2], cube[4][2] = cube[2][2], cube[3][2], cube[4][2], cube[1][2] |
| elif p == 'F': |
| temp = cube[0][2] |
| cube[0][2] = list(map(list, zip(*cube[3])))[0] |
| cube[3][0][0], cube[3][1][0], cube[3][2][0] = list(reversed(cube[5][0])) |
| cube[5][0] = list(map(list, zip(*cube[1])))[2] |
| cube[1][0][2], cube[1][1][2], cube[1][2][2] = list(reversed(temp)) |
| elif p == 'B': |
| temp = cube[0][0] |
| cube[0][0] = list(reversed(list(zip(*cube[1]))[0])) |
| cube[1][0][0], cube[1][1][0], cube[1][2][0] = cube[5][2] |
| cube[5][2] = list(reversed(list(zip(*cube[3]))[2])) |
| cube[3][0][2], cube[3][1][2], cube[3][2][2] = temp |
| elif p == 'L': |
| temp = list(zip(*cube[0]))[0] |
| cube[0][0][0], cube[0][1][0], cube[0][2][0] = list(map(list, zip(*cube[2])))[0] |
| cube[2][0][0], cube[2][1][0], cube[2][2][0] = list(map(list, zip(*cube[5])))[0] |
| cube[5][0][0], cube[5][1][0], cube[5][2][0] = list(reversed(list(zip(*cube[4]))[2])) |
| cube[4][0][2], cube[4][1][2], cube[4][2][2] = list(reversed(temp)) |
| elif p == 'R': |
| temp = list(map(list, zip(*cube[0])))[2] |
| cube[0][0][2], cube[0][1][2], cube[0][2][2] = list(reversed(list(zip(*cube[4]))[0])) |
| cube[4][0][0], cube[4][1][0], cube[4][2][0] = list(reversed(list(zip(*cube[5]))[2])) |
| cube[5][0][2], cube[5][1][2], cube[5][2][2] = list(map(list, zip(*cube[2])))[2] |
| cube[2][0][2], cube[2][1][2], cube[2][2][2] = temp |
| elif d == '+': |
| |
| cube[idx] = list(map(list, zip(*reversed(cube[idx])))) |
| |
| if p == 'U': |
| cube[1][0], cube[2][0], cube[3][0], cube[4][0] = cube[2][0], cube[3][0], cube[4][0], cube[1][0] |
| elif p == 'D': |
| cube[1][2], cube[2][2], cube[3][2], cube[4][2] = cube[4][2], cube[1][2], cube[2][2], cube[3][2] |
| elif p == 'F': |
| temp = cube[0][2] |
| cube[0][2] = list(reversed(list(zip(*cube[1]))[2])) |
| cube[1][0][2], cube[1][1][2], cube[1][2][2] = cube[5][0] |
| cube[5][0] = list(reversed(list(zip(*cube[3]))[0])) |
| cube[3][0][0], cube[3][1][0], cube[3][2][0] = temp |
| elif p == 'B': |
| temp = cube[0][0] |
| cube[0][0] = list(map(list, zip(*cube[3])))[2] |
| cube[3][0][2], cube[3][1][2], cube[3][2][2] = list(reversed(cube[5][2])) |
| cube[5][2] = list(map(list, zip(*cube[1])))[0] |
| cube[1][0][0], cube[1][1][0], cube[1][2][0] = list(reversed(temp)) |
| elif p == 'L': |
| temp = list(map(list, zip(*cube[0])))[0] |
| cube[0][0][0], cube[0][1][0], cube[0][2][0] = list(reversed(list(zip(*cube[4]))[2])) |
| cube[4][0][2], cube[4][1][2], cube[4][2][2] = list(reversed(list(zip(*cube[5]))[0])) |
| cube[5][0][0], cube[5][1][0], cube[5][2][0] = list(map(list, zip(*cube[2])))[0] |
| cube[2][0][0], cube[2][1][0], cube[2][2][0] = temp |
| elif p == 'R': |
| temp = list(zip(*cube[0]))[2] |
| cube[0][0][2], cube[0][1][2], cube[0][2][2] = list(map(list, zip(*cube[2])))[2] |
| cube[2][0][2], cube[2][1][2], cube[2][2][2] = list(map(list, zip(*cube[5])))[2] |
| cube[5][0][2], cube[5][1][2], cube[5][2][2] = list(reversed(list(zip(*cube[4]))[0])) |
| cube[4][0][0], cube[4][1][0], cube[4][2][0] = list(reversed(temp)) |
| |
| |
| |
| t = int(sys.stdin.readline()) |
| for _ in range(t): |
| cube = [ |
| [['w' for c in range(3)] for r in range(3)], |
| [['g' for c in range(3)] for r in range(3)], |
| [['r' for c in range(3)] for r in range(3)], |
| [['b' for c in range(3)] for r in range(3)], |
| [['o' for c in range(3)] for r in range(3)], |
| [['y' for c in range(3)] for r in range(3)], |
| ] |
| |
| |
| n = int(sys.stdin.readline().strip()) |
| command_list = sys.stdin.readline().strip().split() |
| for command in command_list: |
| plain, direction = map(str, [c for c in command]) |
| rotate(plain, direction) |
| |
| for r in cube[0]: |
| print(''.join(r)) |
| |