백준 온라인 저지, 구현 / 5373번: 큐빙 (파이썬 / , 백준 플레티넘문제, 삼성 SW 기출문제)

2022. 1. 2. 00:14알고리즘/구현

728x90
반응형

문제

루빅스 큐브는 삼차원 퍼즐이다. 보통 루빅스 큐브는 3×3×3개의 작은 정육면체로 이루어져 있다. 퍼즐을 풀려면 각 면에 있는 아홉 개의 작은 정육면체의 색이 동일해야 한다.

큐브는 각 면을 양방향으로 90도 만큼 돌릴 수 있도록 만들어져 있다. 회전이 마친 이후에는, 다른 면을 돌릴 수 있다. 이렇게 큐브의 서로 다른 면을 돌리다 보면, 색을 섞을 수 있다.

이 문제에서는 루빅스 큐브가 모두 풀린 상태에서 시작한다. 윗 면은 흰색, 아랫 면은 노란색, 앞 면은 빨간색, 뒷 면은 오렌지색, 왼쪽 면은 초록색, 오른쪽 면은 파란색이다.

루빅스 큐브를 돌린 방법이 순서대로 주어진다. 이때, 모두 돌린 다음에 가장 윗 면의 색상을 구하는 프로그램을 작성하시오.

위의 그림은 루빅스 큐브를 푼 그림이다. 왼쪽 면은 시계방향으로 조금 돌려져 있는 상태이다.

입력

첫째 줄에 테스트 케이스의 개수가 주어진다. 테스트 케이스는 최대 100개이다. 각 테스트 케이스는 다음과 같이 구성되어져 있다.

  • 첫째 줄에 큐브를 돌린 횟수 n이 주어진다. (1 ≤ n ≤ 1000)
  • 둘째 줄에는 큐브를 돌린 방법이 주어진다. 각 방법은 공백으로 구분되어져 있으며, 첫 번째 문자는 돌린 면이다. U: 윗 면, D: 아랫 면, F: 앞 면, B: 뒷 면, L: 왼쪽 면, R: 오른쪽 면이다. 두 번째 문자는 돌린 방향이다. +인 경우에는 시계 방향 (그 면을 바라봤을 때가 기준), -인 경우에는 반시계 방향이다.

출력

각 테스트 케이스에 대해서 큐브를 모두 돌린 후의 윗 면의 색상을 출력한다. 첫 번째 줄에는 뒷 면과 접하는 칸의 색을 출력하고, 두 번째, 세 번째 줄은 순서대로 출력하면 된다. 흰색은 w, 노란색은 y, 빨간색은 r, 오렌지색은 o, 초록색은 g, 파란색은 b.

예제 입력 1

4
1
L-
2
F+ B+
4
U- D- L+ R+
10
L- U- L+ U- L- U- U- L+ U+ U+

예제 출력 1

rww
rww
rww
bbb
www
ggg
gwg
owr
bwb
gwo
www
rww
W3sicHJvYmxlbV9pZCI6IjUzNzMiLCJwcm9ibGVtX2xhbmciOiIwIiwidGl0bGUiOiJcdWQwNTBcdWJlNTkiLCJkZXNjcmlwdGlvbiI6IjxwPlx1YjhlOFx1YmU0NVx1YzJhNCBcdWQwNTBcdWJlMGNcdWIyOTQgXHVjMGJjXHVjYzI4XHVjNmQwIFx1ZDM3Y1x1Yzk5MFx1Yzc3NFx1YjJlNC4gXHViY2Y0XHVkMWI1IFx1YjhlOFx1YmU0NVx1YzJhNCBcdWQwNTBcdWJlMGNcdWIyOTQgMyZ0aW1lczszJnRpbWVzOzNcdWFjMWNcdWM3NTggXHVjNzkxXHVjNzQwIFx1YzgxNVx1YzcyMVx1YmE3NFx1Y2NiNFx1Yjg1YyBcdWM3NzRcdWI4ZThcdWM1YjRcdWM4MzggXHVjNzg4XHViMmU0LiBcdWQzN2NcdWM5OTBcdWM3NDQgXHVkNDgwXHViODI0XHViYTc0IFx1YWMwMSBcdWJhNzRcdWM1ZDAgXHVjNzg4XHViMjk0IFx1YzU0NFx1ZDY0OSBcdWFjMWNcdWM3NTggXHVjNzkxXHVjNzQwIFx1YzgxNVx1YzcyMVx1YmE3NFx1Y2NiNFx1Yzc1OCBcdWMwYzlcdWM3NzQgXHViM2Q5XHVjNzdjXHVkNTc0XHVjNTdjIFx1ZDU1Y1x1YjJlNC48XC9wPlxyXG5cclxuPHA+XHVkMDUwXHViZTBjXHViMjk0IFx1YWMwMSBcdWJhNzRcdWM3NDQgXHVjNTkxXHViYzI5XHVkNWE1XHVjNzNjXHViODVjIDkwXHViM2M0IFx1YjljY1x1ZDA3YyBcdWIzY2NcdWI5YjQgXHVjMjE4IFx1Yzc4OFx1YjNjNFx1Yjg1ZCBcdWI5Y2NcdWI0ZTRcdWM1YjRcdWM4MzggXHVjNzg4XHViMmU0LiBcdWQ2OGNcdWM4MDRcdWM3NzQgXHViOWM4XHVjZTVjIFx1Yzc3NFx1ZDZjNFx1YzVkMFx1YjI5NCwgXHViMmU0XHViOTc4IFx1YmE3NFx1Yzc0NCBcdWIzY2NcdWI5YjQgXHVjMjE4IFx1Yzc4OFx1YjJlNC4gXHVjNzc0XHViODA3XHVhYzhjIFx1ZDA1MFx1YmUwY1x1Yzc1OCBcdWMxMWNcdWI4NWMgXHViMmU0XHViOTc4IFx1YmE3NFx1Yzc0NCBcdWIzY2NcdWI5YWNcdWIyZTQgXHViY2Y0XHViYTc0LCBcdWMwYzlcdWM3NDQgXHVjMTFlXHVjNzQ0IFx1YzIxOCBcdWM3ODhcdWIyZTQuPFwvcD5cclxuXHJcbjxwPlx1Yzc3NCBcdWJiMzhcdWM4MWNcdWM1ZDBcdWMxMWNcdWIyOTQgXHViOGU4XHViZTQ1XHVjMmE0IFx1ZDA1MFx1YmUwY1x1YWMwMCBcdWJhYThcdWI0NTAgXHVkNDgwXHViOWIwIFx1YzBjMVx1ZDBkY1x1YzVkMFx1YzExYyBcdWMyZGNcdWM3OTFcdWQ1NWNcdWIyZTQuIFx1YzcxNyBcdWJhNzRcdWM3NDAgXHVkNzcwXHVjMGM5LCBcdWM1NDRcdWI3YWIgXHViYTc0XHVjNzQwIFx1YjE3OFx1Yjc4MFx1YzBjOSwgXHVjNTVlIFx1YmE3NFx1Yzc0MCBcdWJlNjhcdWFjMDRcdWMwYzksIFx1YjRiNyBcdWJhNzRcdWM3NDAgXHVjNjI0XHViODBjXHVjOWMwXHVjMGM5LCBcdWM2N2NcdWNhYmQgXHViYTc0XHVjNzQwIFx1Y2QwOFx1Yjg1ZFx1YzBjOSwgXHVjNjI0XHViOTc4XHVjYWJkIFx1YmE3NFx1Yzc0MCBcdWQzMGNcdWI3ODBcdWMwYzlcdWM3NzRcdWIyZTQuPFwvcD5cclxuXHJcbjxwPlx1YjhlOFx1YmU0NVx1YzJhNCBcdWQwNTBcdWJlMGNcdWI5N2MgXHViM2NjXHViOWIwIFx1YmMyOVx1YmM5NVx1Yzc3NCBcdWMyMWNcdWMxMWNcdWIzMDBcdWI4NWMgXHVjOGZjXHVjNWI0XHVjOWM0XHViMmU0LiBcdWM3NzRcdWI1NGMsIFx1YmFhOFx1YjQ1MCBcdWIzY2NcdWI5YjAgXHViMmU0XHVjNzRjXHVjNWQwIFx1YWMwMFx1YzdhNSBcdWM3MTcgXHViYTc0XHVjNzU4IFx1YzBjOVx1YzBjMVx1Yzc0NCBcdWFkNmNcdWQ1NThcdWIyOTQgXHVkNTA0XHViODVjXHVhZGY4XHViN2E4XHVjNzQ0IFx1Yzc5MVx1YzEzMVx1ZDU1OFx1YzJkY1x1YzYyNC48XC9wPlxyXG5cclxuPHA+PGltZyBhbHQ9XCJcIiBzcmM9XCJcL3VwbG9hZFwvaW1hZ2VzXC9jdWJlLnBuZ1wiIHN0eWxlPVwiaGVpZ2h0OjEyMHB4OyB3aWR0aDozMTlweFwiIFwvPjxcL3A+XHJcblxyXG48cD5cdWM3MDRcdWM3NTggXHVhZGY4XHViOWJjXHVjNzQwIFx1YjhlOFx1YmU0NVx1YzJhNCBcdWQwNTBcdWJlMGNcdWI5N2MgXHVkNDdjIFx1YWRmOFx1YjliY1x1Yzc3NFx1YjJlNC4gXHVjNjdjXHVjYWJkIFx1YmE3NFx1Yzc0MCBcdWMyZGNcdWFjYzRcdWJjMjlcdWQ1YTVcdWM3M2NcdWI4NWMgXHVjODcwXHVhZTA4IFx1YjNjY1x1YjgyNFx1YzgzOCBcdWM3ODhcdWIyOTQgXHVjMGMxXHVkMGRjXHVjNzc0XHViMmU0LjxcL3A+XHJcbiIsImlucHV0IjoiPHA+XHVjY2FiXHVjOWY4IFx1YzkwNFx1YzVkMCBcdWQxNGNcdWMyYTRcdWQyYjggXHVjZjAwXHVjNzc0XHVjMmE0XHVjNzU4IFx1YWMxY1x1YzIxOFx1YWMwMCBcdWM4ZmNcdWM1YjRcdWM5YzRcdWIyZTQuIFx1ZDE0Y1x1YzJhNFx1ZDJiOCBcdWNmMDBcdWM3NzRcdWMyYTRcdWIyOTQgXHVjZDVjXHViMzAwIDEwMFx1YWMxY1x1Yzc3NFx1YjJlNC4gXHVhYzAxIFx1ZDE0Y1x1YzJhNFx1ZDJiOCBcdWNmMDBcdWM3NzRcdWMyYTRcdWIyOTQgXHViMmU0XHVjNzRjXHVhY2ZjIFx1YWMxOVx1Yzc3NCBcdWFkNmNcdWMxMzFcdWI0MThcdWM1YjRcdWM4MzggXHVjNzg4XHViMmU0LjxcL3A+XHJcblxyXG48dWw+XHJcblx0PGxpPlx1Y2NhYlx1YzlmOCBcdWM5MDRcdWM1ZDAgXHVkMDUwXHViZTBjXHViOTdjIFx1YjNjY1x1YjliMCBcdWQ2OWZcdWMyMTggblx1Yzc3NCBcdWM4ZmNcdWM1YjRcdWM5YzRcdWIyZTQuICgxICZsZTsgbiAmbGU7IDEwMDApPFwvbGk+XHJcblx0PGxpPlx1YjQ1OFx1YzlmOCBcdWM5MDRcdWM1ZDBcdWIyOTQgXHVkMDUwXHViZTBjXHViOTdjIFx1YjNjY1x1YjliMCBcdWJjMjlcdWJjOTVcdWM3NzQgXHVjOGZjXHVjNWI0XHVjOWM0XHViMmU0LiBcdWFjMDEgXHViYzI5XHViYzk1XHVjNzQwIFx1YWNmNVx1YmMzMVx1YzczY1x1Yjg1YyBcdWFkNmNcdWJkODRcdWI0MThcdWM1YjRcdWM4MzggXHVjNzg4XHVjNzNjXHViYTcwLCBcdWNjYWIgXHViYzg4XHVjOWY4IFx1YmIzOFx1Yzc5MFx1YjI5NCBcdWIzY2NcdWI5YjAgXHViYTc0XHVjNzc0XHViMmU0LiBVOiBcdWM3MTcgXHViYTc0LCBEOiBcdWM1NDRcdWI3YWIgXHViYTc0LCBGOiBcdWM1NWUgXHViYTc0LCBCOiBcdWI0YjcgXHViYTc0LCBMOiBcdWM2N2NcdWNhYmQgXHViYTc0LCBSOiBcdWM2MjRcdWI5NzhcdWNhYmQgXHViYTc0XHVjNzc0XHViMmU0LiBcdWI0NTAgXHViYzg4XHVjOWY4IFx1YmIzOFx1Yzc5MFx1YjI5NCBcdWIzY2NcdWI5YjAgXHViYzI5XHVkNWE1XHVjNzc0XHViMmU0LiArXHVjNzc4IFx1YWNiZFx1YzZiMFx1YzVkMFx1YjI5NCBcdWMyZGNcdWFjYzQgXHViYzI5XHVkNWE1IChcdWFkZjggXHViYTc0XHVjNzQ0IFx1YmMxNFx1Yjc3Y1x1YmQyNFx1Yzc0NCBcdWI1NGNcdWFjMDAgXHVhZTMwXHVjOTAwKSwgLVx1Yzc3OCBcdWFjYmRcdWM2YjBcdWM1ZDBcdWIyOTQgXHViYzE4XHVjMmRjXHVhY2M0IFx1YmMyOVx1ZDVhNVx1Yzc3NFx1YjJlNC48XC9saT5cclxuPFwvdWw+XHJcbiIsIm91dHB1dCI6IjxwPlx1YWMwMSBcdWQxNGNcdWMyYTRcdWQyYjggXHVjZjAwXHVjNzc0XHVjMmE0XHVjNWQwIFx1YjMwMFx1ZDU3NFx1YzExYyBcdWQwNTBcdWJlMGNcdWI5N2MgXHViYWE4XHViNDUwIFx1YjNjY1x1YjliMCBcdWQ2YzRcdWM3NTggXHVjNzE3IFx1YmE3NFx1Yzc1OCBcdWMwYzlcdWMwYzFcdWM3NDQgXHVjZDljXHViODI1XHVkNTVjXHViMmU0LiBcdWNjYWIgXHViYzg4XHVjOWY4IFx1YzkwNFx1YzVkMFx1YjI5NCBcdWI0YjcgXHViYTc0XHVhY2ZjIFx1YzgxMVx1ZDU1OFx1YjI5NCBcdWNlNzhcdWM3NTggXHVjMGM5XHVjNzQ0IFx1Y2Q5Y1x1YjgyNVx1ZDU1OFx1YWNlMCwgXHViNDUwIFx1YmM4OFx1YzlmOCwgXHVjMTM4IFx1YmM4OFx1YzlmOCBcdWM5MDRcdWM3NDAgXHVjMjFjXHVjMTFjXHViMzAwXHViODVjIFx1Y2Q5Y1x1YjgyNVx1ZDU1OFx1YmE3NCBcdWI0MWNcdWIyZTQuIFx1ZDc3MFx1YzBjOVx1Yzc0MCB3LCBcdWIxNzhcdWI3ODBcdWMwYzlcdWM3NDAgeSwgXHViZTY4XHVhYzA0XHVjMGM5XHVjNzQwIHIsIFx1YzYyNFx1YjgwY1x1YzljMFx1YzBjOVx1Yzc0MCBvLCBcdWNkMDhcdWI4NWRcdWMwYzlcdWM3NDAgZywgXHVkMzBjXHViNzgwXHVjMGM5XHVjNzQwIGIuPFwvcD5cclxuIiwiaGludCI6IiIsIm9yaWdpbmFsIjoiMCIsImh0bWxfdGl0bGUiOiIwIiwicHJvYmxlbV9sYW5nX3Rjb2RlIjoiS29yZWFuIn0seyJwcm9ibGVtX2lkIjoiNTM3MyIsInByb2JsZW1fbGFuZyI6IjEiLCJ0aXRsZSI6IkN1YmluZyIsImRlc2NyaXB0aW9uIjoiPHA+QSBSdWJpayZyc3F1bztzIEN1YmUgaXMgYSB0aHJlZS1kaW1lbnNpb25hbCBwdXp6bGUuIEluIGl0cyBvcmlnaW5hbCB2ZXJzaW9uLCBpdCBpcyBtYWRlIHVwIG9mIDNcdTAwMDImdGltZXM7MyZ0aW1lcztcdTAwMDIzIHNtYWxsZXIgY3ViZXMuIEVhY2ggb2YgdGhlIHZpc2libGUgZmFjZXMgb2YgdGhlc2Ugc21hbGxlciBjdWJlcyBoYXMgb25lIG9mIHNpeCBjb2xvcnMgKHdoaXRlLCB5ZWxsb3csIHJlZCwgb3JhbmdlLCBncmVlbiBvciBibHVlKS4gQSBSdWJpayZyc3F1bztzIEN1YmUgaXMgc2FpZCB0byBiZSBzb2x2ZWQgaWYgb24gZWFjaCBmYWNlLCB0aGUgbmluZSBjdWJlcyBhbGwgc2hvdyB0aGUgc2FtZSBjb2xvci48XC9wPlxyXG5cclxuPHA+VGhlIEN1YmUgaXMgbWVjaGFuaWNhbGx5IGNvbnN0cnVjdGVkIHN1Y2ggdGhhdCBpdCBpcyBwb3NzaWJsZSB0byByb3RhdGUgYW55IGZhY2UgKHRoYXQgaXMsIGFueSBzZXQgb2YgMyZ0aW1lcztcdTAwMDIzIHNtYWxsZXIgY3ViZXMgbWFraW5nIHVwIG9uZSBvZiB0aGUgc2l4IGZhY2VzIG9mIHRoZSBlbnRpcmUgY3ViZSkgYnkgOTAgZGVncmVlcyBpbiBib3RoIGRpcmVjdGlvbnMuIFdoZW4gYSByb3RhdGlvbiBpcyBjb21wbGV0ZWQsIGl0IGlzIGFnYWluIHBvc3NpYmxlIHRvIHJvdGF0ZSBhbnkgZmFjZSBpbiBhbnkgZGlyZWN0aW9uLiBUaHVzIGJ5IGNvbWJpbmluZyByb3RhdGlvbnMgcGVyZm9ybWVkIG9uIGRpZmZlcmVudCBmYWNlcywgaXQgaXMgcG9zc2libGUgdG8gbWl4IHVwIHRoZSBjb2xvcnMuIFRoZSBwdXp6bGUgaXMgdGhlbiB0byB0YWtlIGEgQ3ViZSB3aG9zZSBjb2xvcnMgYXJlIG1peGVkIHVwLCBhbmQgcmV0dXJuIGl0IHRvIGl0cyBzb2x2ZWQgc3RhdGUuPFwvcD5cclxuXHJcbjxwPldlIHN0YXJ0IGZyb20gYSBzb2x2ZWQgUnViaWsmcnNxdW87cyBDdWJlLCB3aGljaCBpcyBjb21wbGV0ZWx5IHdoaXRlIG9uIHRoZSB0b3AgKHVwKSBmYWNlLCB5ZWxsb3cgb24gdGhlIGJvdHRvbSAoZG93biksIHJlZCBvbiB0aGUgZnJvbnQsIG9yYW5nZSBvbiB0aGUgYmFjaywgZ3JlZW4gb24gdGhlIGxlZnQgYW5kIGJsdWUgb24gdGhlIHJpZ2h0LiBZb3UgYXJlIGdpdmVuIGEgc2VxdWVuY2Ugb2Ygcm90YXRpb25zLiBEZXRlcm1pbmUgd2hhdCB0aGUgdG9wIGZhY2UgbG9va3MgbGlrZSBhZnRlciBhcHBseWluZyBhbGwgcm90YXRpb25zLjxcL3A+XHJcblxyXG48cD48aW1nIGFsdD1cIlwiIHNyYz1cIlwvdXBsb2FkXC9pbWFnZXNcL2N1YmUucG5nXCIgc3R5bGU9XCJoZWlnaHQ6MTIwcHg7IHdpZHRoOjMxOXB4XCIgXC8+PFwvcD5cclxuXHJcbjxwPkEgc29sdmVkIFJ1YmlrJnJzcXVvO3MgQ3ViZS4gSW4gdGhlIGxlZnQgaW1hZ2UgdGhlIHRvcCAod2hpdGUpLCBmcm9udCAocmVkKSBhbmQgbGVmdCAoZ3JlZW4pIGZhY2UgYXJlIHNob3duLiBJbiB0aGUgcmlnaHQgaW1hZ2UgdGhlIHNhbWUgY3ViZSBpcyB2aWV3ZWQgZnJvbSB0aGUgb3Bwb3NpdGUgc2lkZSwgd2l0aCB0aGUgYm90dG9tICh5ZWxsb3cpLCBiYWNrIChvcmFuZ2UpIGFuZCByaWdodCAoYmx1ZSkgZmFjZSB2aXNpYmxlLiBTaG93biBpcyB0aGUgd2F5IGluIHdoaWNoIGEgZmFjZSBjYW4gYmUgcm90YXRlZCAoaW4gdGhpcyBjYXNlLCB0aGUgbGVmdCBmYWNlIGlzIHBhcnRpYWxseSByb3RhdGVkIGNsb2Nrd2lzZSkuPFwvcD5cclxuIiwiaW5wdXQiOiI8cD5PbiB0aGUgXHVmYjAxcnN0IGxpbmUgb25lIHBvc2l0aXZlIG51bWJlcjogdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzLCBhdCBtb3N0IDEwMC4gQWZ0ZXIgdGhhdCBwZXIgdGVzdCBjYXNlOjxcL3A+XHJcblxyXG48dWw+XHJcblx0PGxpPm9uZSBsaW5lIHdpdGggYW4gaW50ZWdlciBuICgxICZsZTsmbmJzcDtuICZsZTsmbmJzcDsxIDAwMCk6IHRoZSBudW1iZXIgb2Ygcm90YXRpb25zLjxcL2xpPlxyXG5cdDxsaT5vbmUgbGluZSB3aXRoIG4gc3BhY2Utc2VwYXJhdGVkIHBhaXJzIG9mIGNoYXJhY3RlcnM6IHRoZSByb3RhdGlvbnMuIEZvciBlYWNoIHJvdGF0aW9uLCB0aGUgXHVmYjAxcnN0IGNoYXJhY3RlciBpZGVudGlcdWZiMDFlcyB0aGUgZmFjZSB0aGF0IGlzIHJvdGF0ZWQ6ICZsc3F1bztVJnJzcXVvOyBmb3IgdGhlIHRvcCAodXApIGZhY2UsICZsc3F1bztEJnJzcXVvOyBmb3IgdGhlIGJvdHRvbSAoZG93biksICZsc3F1bztGJnJzcXVvOyBmb3IgdGhlIGZyb250LCAmbHNxdW87QiZyc3F1bzsgZm9yIHRoZSBiYWNrLCAmbHNxdW87TCZyc3F1bzsgZm9yIHRoZSBsZWZ0IGFuZCAmbHNxdW87UiZyc3F1bzsgZm9yIHRoZSByaWdodC4gVGhlIHNlY29uZCBjaGFyYWN0ZXIgaW5kaWNhdGVzIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHJvdGF0aW9uOiAmbHNxdW87KyZyc3F1bzsgZm9yIGEgY2xvY2t3aXNlIHJvdGF0aW9uICh3aGVuIGxvb2tpbmcgZGlyZWN0bHkgYXQgdGhlIGZhY2UgdGhhdCBpcyByb3RhdGVkKSwgJmxzcXVvOy0mcnNxdW87IGZvciBhIGNvdW50ZXJjbG9ja3dpc2Ugcm90YXRpb24uPFwvbGk+XHJcbjxcL3VsPlxyXG4iLCJvdXRwdXQiOiI8cD5QZXIgdGVzdCBjYXNlOjxcL3A+XHJcblxyXG48dWw+XHJcblx0PGxpPnRocmVlIGxpbmVzLCBlYWNoIHdpdGggdGhyZWUgY2hhcmFjdGVyczogdGhlIGNvbG9ycyBvZiB0aGUgc3F1YXJlcyBvbiB0aGUgdG9wIGZhY2Ugb2YgdGhlIGN1YmUsIGFmdGVyIGFwcGx5aW5nIHRoZSByb3RhdGlvbnMuIFRoZSBcdWZiMDFyc3QgbGluZSBjb3JyZXNwb25kcyB0byB0aGUgc3F1YXJlcyBhZGphY2VudCB0byB0aGUgYmFjayBzaWRlIG9mIHRoZSBjdWJlLiBUaGUgY29sb3JzIGFyZSBpbmRpY2F0ZWQgYnkgdGhlIFx1ZmIwMXJzdCBsZXR0ZXIgKGxvd2VyIGNhc2UpOiAmbHNxdW87dyZyc3F1bzsgZm9yIHdoaXRlLCAmbHNxdW87eSZyc3F1bzsgZm9yIHllbGxvdywgJmxzcXVvO3ImcnNxdW87IGZvciByZWQsICZsc3F1bztvJnJzcXVvOyBmb3Igb3JhbmdlLCAmbHNxdW87ZyZyc3F1bzsgZm9yIGdyZWVuIGFuZCAmbHNxdW87YiZyc3F1bzsgZm9yIGJsdWUuPFwvbGk+XHJcbjxcL3VsPlxyXG4iLCJoaW50IjoiIiwib3JpZ2luYWwiOiIxIiwiaHRtbF90aXRsZSI6IjAiLCJwcm9ibGVtX2xhbmdfdGNvZGUiOiJFbmdsaXNoIn1d

접근 방법

- 어떤 면이 돌아갔을 때, 다른 면들이 어떻게 변하는 지를 파악한 뒤, 이를 반영하여 코드를 짠다.
- 1. 왼쪽 면이 돌아갔을 때
- - 시계방향인 경우: 윗면의 왼쪽 열 -> 앞면의 왼쪽 열 -> 아랫면의 왼쪽 열 -> 뒷면의 왼쪽 열 -> 윗면의 왼쪽 열 순으로 바뀐다.
- - 반시계방향인 경우: 윗면의 왼쪽 열 -> 뒷면의 왼쪽 열 -> 아랫면의 왼쪽 열 -> 앞면의 왼쪽 열 -> 윗면의 왼쪽 열 순으로 바뀐다.
- 2. 앞 면이 돌아갔을 때
- - 시계방향인 경우: 윗면의 아래 행 -> 오른쪽면의 왼쪽 열 -> 아랫면의 윗 행 -> 왼쪽면의 오른쪽 열 -> 윗면의 아래 행 순으로 바뀐다.
- - 반시계방향인 경우: 윗면의 아래 향 -> 왼쪽의 오른쪽 열 -> 아랫면의 윗 향 -> 오른쪽면의 왼쪽 열 -> 윗면의 아래 행 순으로 바뀐다.
- 3. 오른쪽 면이 돌아갔을 때
- - 시계방향인 경우: 윗면의 오른쪽 열 -> 뒷면의 오른쪽 열 -> 아랫면의 오른쪽 열 -> 앞면의 오른쪽 열 -> 윗면의 오른쪽 열 순으로 바뀐다.
- - 반시계방향인 경우: 윗면의 오른쪽 열 -> 앞면의 오른쪽 열 -> 아랫면의 오른쪽 열 -> 뒷면의 오른쪽 열 -> 윗면의 오른쪽 열 순으로 바뀐다.
- 4. 윗면이 돌아갔을 때
- - 시계방향인 경우: 왼쪽면의 윗 행 -> 뒷면의 아래행 -> 오른쪽면의 윗 행 -> 앞면의 윗행 순으로 바뀐다.
- - 반시계방향인 경우: 왼쪽면의 윗 행 -> 앞면의 윗 행 -> 오른쪽면의 윗행 -> 뒷면의 아래행 순으로 바뀐다.
- 5. 아래 면이 돌아갔을 때
- - 시계방향인 경우: 앞면의 아래 행 -> 오른쪽의 아래 행 -> 뒷면의 윗 행 -> 왼쪽면의 아래 행 -> 앞면의 아래 행
- - 반시계방향인 경우: 앞면의 아래 행 -> 왼쪽면의 아래행 -> 뒷면의 윗 행 -> 오른쪽면의 아래 행 -> 앞면의 아래 행
- 6. 뒷면이 돌아갔을 떄
- - 시계방향인 경우: 아래면의 아래 행 -> 오른쪽면의 오른쪽 행 -> 윗면의 윗 행 -> 왼쪽면의 왼쪽 행 -> 아래면의 아래 행
- - 반시계방향인 경우: 아래면의 아래 행 -> 왼쪽면의 왼쪽 행 -> 윗면의 윗 행 -> 오른쪽면의 오른쪽 행 -> 아래면의 아래 행

코드

# https://www.acmicpc.net/problem/5373
# 접근 방법
# 어떤 면이 돌아갔을 때, 다른 면들이 어떻게 변하는 지를 파악한 뒤, 이를 반영하여 코드를 짠다.
# 1. 왼쪽 면이 돌아갔을 때
# - 시계방향인 경우: 윗면의 왼쪽 열 -> 앞면의 왼쪽 열 -> 아랫면의 왼쪽 열 -> 뒷면의 왼쪽 열 -> 윗면의 왼쪽 열 순으로 바뀐다.
# - 반시계방향인 경우: 윗면의 왼쪽 열 -> 뒷면의 왼쪽 열 -> 아랫면의 왼쪽 열 -> 앞면의 왼쪽 열 -> 윗면의 왼쪽 열 순으로 바뀐다.
# 2. 앞 면이 돌아갔을 때
# - 시계방향인 경우: 윗면의 아래 행 -> 오른쪽면의 왼쪽 열 -> 아랫면의 윗 행 -> 왼쪽면의 오른쪽 열 -> 윗면의 아래 행 순으로 바뀐다.
# - 반시계방향인 경우: 윗면의 아래 향 -> 왼쪽의 오른쪽 열 -> 아랫면의 윗 향 -> 오른쪽면의 왼쪽 열 -> 윗면의 아래 행 순으로 바뀐다.
# 3. 오른쪽 면이 돌아갔을 때
# - 시계방향인 경우: 윗면의 오른쪽 열 -> 뒷면의 오른쪽 열 -> 아랫면의 오른쪽 열 -> 앞면의 오른쪽 열 -> 윗면의 오른쪽 열 순으로 바뀐다.
# - 반시계방향인 경우: 윗면의 오른쪽 열 -> 앞면의 오른쪽 열 -> 아랫면의 오른쪽 열 -> 뒷면의 오른쪽 열 -> 윗면의 오른쪽 열 순으로 바뀐다.
# 4. 윗면이 돌아갔을 때
# - 시계방향인 경우: 왼쪽면의 윗 행 -> 뒷면의 아래행 -> 오른쪽면의 윗 행 -> 앞면의 윗행 순으로 바뀐다.
# - 반시계방향인 경우: 왼쪽면의 윗 행 -> 앞면의 윗 행 -> 오른쪽면의 윗행 -> 뒷면의 아래행 순으로 바뀐다.
# 5. 아래 면이 돌아갔을 때
# - 시계방향인 경우: 앞면의 아래 행 -> 오른쪽의 아래 행 -> 뒷면의 윗 행 -> 왼쪽면의 아래 행 -> 앞면의 아래 행
# - 반시계방향인 경우: 앞면의 아래 행 -> 왼쪽면의 아래행 -> 뒷면의 윗 행 -> 오른쪽면의 아래 행 -> 앞면의 아래 행
# 6. 뒷면이 돌아갔을 떄
# - 시계방향인 경우: 아래면의 아래 행 -> 오른쪽면의 오른쪽 행 -> 윗면의 윗 행 -> 왼쪽면의 왼쪽 행 -> 아래면의 아래 행
# - 반시계방향인 경우: 아래면의 아래 행 -> 왼쪽면의 왼쪽 행 -> 윗면의 윗 행 -> 오른쪽면의 오른쪽 행 -> 아래면의 아래 행
import sys


def cubing(order, direction):

    # 1. 왼쪽 면이 돌아갔을 때
    # - 시계방향인 경우: 윗면의 왼쪽 열 -> 앞면의 왼쪽 열 -> 아랫면의 왼쪽 열 -> 뒷면의 왼쪽 열 -> 윗면의 왼쪽 열(역) 순으로 바뀐다.
    # - 반시계방향인 경우: 윗면의 왼쪽 열 -> 뒷면의 왼쪽 열(역) -> 아랫면의 왼쪽 열 -> 앞면의 왼쪽 열 -> 윗면의 왼쪽 열 순으로 바뀐다.
    if order == 'L':
        front_, bottom_, back_, top_ = [[0, 0, 0] for _ in range(4)]
        left_ = [[0, 0, 0] for _ in range(3)]
        if direction == '+':
            for i in range(3):
                front_[i], bottom_[i], back_[i], top_[i] = top[i][0], front[i][0], bottom[i][0], back[i][0]
                for j in range(3):
                    left_[j][2-i] = left[i][j]
        else:
            for i in range(3):
                back_[i], bottom_[i], front_[i], top_[i] = top[i][0], back[i][0], bottom[i][0], front[i][0]
                for j in range(3):
                    left_[2-j][i] = left[i][j]

        for i in range(3):
            front[i][0], bottom[i][0], back[i][0], top[i][0] = front_[i], bottom_[i], back_[i], top_[i]
            for j in range(3):
                left[i][j] = left_[i][j]
    # 2. 앞 면이 돌아갔을 때
    # - 시계방향인 경우: 윗면의 아래 행 -> 오른쪽면의 왼쪽 열 -> 아랫면의 윗 행(역) -> 왼쪽면의 오른쪽 열 -> 윗면의 아래 행(역) 순으로 바뀐다.
    # - 반시계방향인 경우: 윗면의 아래 행 -> 왼쪽의 오른쪽 열(역) -> 아랫면의 윗 행 -> 오른쪽면의 왼쪽 열(역) -> 윗면의 아래 행 순으로 바뀐다.
    if order == 'F':
        right_, bottom_, left_, top_ = [[0, 0, 0] for _ in range(4)]
        front_ = [[0, 0, 0] for _ in range(3)]
        if direction == '+':
            for i in range(3):
                right_[i], bottom_[2-i], left_[i], top_[2-i] = top[2][i], right[i][0], bottom[0][i], left[i][2]
                for j in range(3):
                    front_[j][2-i] = front[i][j]
        else:
            for i in range(3):
                left_[2-i], bottom_[i], right_[2-i], top_[i] = top[2][i], left[i][2], bottom[0][i], right[i][0]
                for j in range(3):
                    front_[2-j][i] = front[i][j]

        for i in range(3):
            top[2][i], right[i][0], bottom[0][i], left[i][2] = top_[i], right_[i], bottom_[i], left_[i]
            for j in range(3):
                front[i][j] = front_[i][j]
    # 3. 오른쪽 면이 돌아갔을 때
    # - 시계방향인 경우: 윗면의 오른쪽 열 -> 뒷면의 오른쪽 열(역) -> 아랫면의 오른쪽 열 -> 앞면의 오른쪽 열 -> 윗면의 오른쪽 열 순으로 바뀐다.
    # - 반시계방향인 경우: 윗면의 오른쪽 열 -> 앞면의 오른쪽 열 -> 아랫면의 오른쪽 열 -> 뒷면의 오른쪽 열 -> 윗면의 오른쪽 열(역) 순으로 바뀐다.
    if order == 'R':
        front_, bottom_, back_, top_ = [[0, 0, 0] for _ in range(4)]
        right_ = [[0, 0, 0] for _ in range(3)]
        if direction == '+':
            for i in range(3):
                back_[i], bottom_[i], front_[i], top_[i] = top[i][2], back[i][2], bottom[i][2], front[i][2]
                for j in range(3):
                    right_[j][2-i] = right[i][j]
        else:
            for i in range(3):
                front_[i], bottom_[i], back_[i], top_[i] = top[i][2], front[i][2], bottom[i][2], back[i][2]
                for j in range(3):
                    right_[2-j][i] = right[i][j]
        for i in range(3):
            front[i][2], bottom[i][2], back[i][2], top[i][2] = front_[i], bottom_[i], back_[i], top_[i]
            for j in range(3):
                right[i][j] = right_[i][j]
    # 4. 윗면이 돌아갔을 때
    # - 시계방향인 경우: 왼쪽면의 윗행 -> 뒷면의 아래행(역) -> 오른쪽면의 윗행 -> 앞면의 윗행 -> 왼쪽면의 윗행순으로 바뀐다.
    # - 반시계방향인 경우: 왼쪽면의 윗행 -> 앞면의 윗행 -> 오른쪽면의 윗행 -> 뒷면의 아래행 -> 왼쪽면의 윗행(역)순으로 바뀐다.
    if order == 'U':
        back_, right_, front_, left_ = [[0, 0, 0] for _ in range(4)]
        top_ = [[0,0,0] for _ in range(3)]
        if direction == '+':
            for i in range(3):
                back_[2-i], right_[2-i], front_[i], left_[i] = left[0][i], back[2][i], right[0][i], front[0][i]
                for j in range(3):
                    top_[j][2-i] = top[i][j]
        else:
            for i in range(3):
                front_[i], right_[i], back_[2-i], left_[2-i] = left[0][i], front[0][i], right[0][i], back[2][i]
                for j in range(3):
                    top_[2-j][i] = top[i][j]

        for i in range(3):
            left[0][i], back[2][i], right[0][i], front[0][i] = left_[i], back_[i], right_[i], front_[i]
            for j in range(3):
                top[i][j] = top_[i][j]


    # 5. 아래 면이 돌아갔을 때
    # - 시계방향인 경우: 앞면의 아래 행 -> 오른쪽의 아래 행 -> 뒷면의 윗 행(역) -> 왼쪽면의 아래 행 -> 앞면의 아래 행
    # - 반시계방향인 경우: 앞면의 아래 행 -> 왼쪽면의 아래행 -> 뒷면의 윗 행 -> 오른쪽면의 아래 행(역) -> 앞면의 아래 행
    if order == 'D':
        back_, right_, front_, left_ = [[0, 0, 0] for _ in range(4)]
        bottom_ = [[0,0,0] for _ in range(3)]
        if direction == '+':
            for i in range(3):
                front_[i], right_[i], back_[2-i], left_[2-i] = left[2][i], front[2][i], right[2][i], back[0][i]
                for j in range(3):
                    bottom_[j][2-i] = bottom[i][j]
        else:
            for i in range(3):
                back_[2-i], right_[2-i], front_[i], left_[i] = left[2][i], back[0][i], right[2][i], front[2][i]
                for j in range(3):
                    bottom_[2-j][i] = bottom[i][j]

        for i in range(3):
            left[2][i], back[0][i], right[2][i], front[2][i] = left_[i], back_[i], right_[i], front_[i]
            for j in range(3):
                bottom[i][j] = bottom_[i][j]

    # 6. 뒷면이 돌아갔을 떄
    # - 시계방향인 경우: 아래면의 아래 행 -> 오른쪽면의 오른쪽 행 -> 윗면의 윗 행(역) -> 왼쪽면의 왼쪽 행 -> 아래면의 아래 행(역)
    # - 반시계방향인 경우: 아래면의 아래 행 -> 왼쪽면의 왼쪽 행(역) -> 윗면의 윗 행 -> 오른쪽면의 오른쪽 행(역) -> 아래면의 아래 행
    if order == 'B':
        bottom_, right_, top_, left_ = [[0, 0, 0] for _ in range(4)]
        back_ = [[0,0,0] for _ in range(3)]
        if direction == '+':
            for i in range(3):
                right_[2-i], top_[i], left_[2-i], bottom_[i] = bottom[2][i], right[i][2], top[0][i], left[i][0]
                for j in range(3):
                    back_[j][2-i] = back[i][j]
        else:
            for i in range(3):
                left_[i], top_[2-i], right_[i], bottom_[2-i] = bottom[2][i], left[i][0], top[0][i], right[i][2]
                for j in range(3):
                    back_[2-j][i] = back[i][j]

        for i in range(3):
            bottom[2][i], right[i][2], top[0][i], left[i][0] = bottom_[i], right_[i], top_[i], left_[i]
            for j in range(3):
                back[i][j] = back_[i][j]
    # print(order, direction)
    # print('위:', top)
    # print('왼:', left)
    # print('앞:', front)
    # print('오:', right)
    # print('뒤:', back)
    # print('바닥:', bottom)
    # print()


for tc in range(int(sys.stdin.readline())):
    n = int(sys.stdin.readline())
    orders = list(sys.stdin.readline().split())
    
    top = [['w' for _ in range(3)] for _ in range(3)]
    bottom = [['y' for _ in range(3)] for _ in range(3)]
    front = [['r' for _ in range(3)] for _ in range(3)]
    back = [['o' for _ in range(3)] for _ in range(3)]
    left = [['g' for _ in range(3)] for _ in range(3)]
    right = [['b' for _ in range(3)] for _ in range(3)]

    for i in range(n):
        cubing(orders[i][0], orders[i][1])
    for i in range(3):
        print(top[i][0], top[i][1], top[i][2], sep='')
728x90
반응형