https://www.acmicpc.net/problem/14891
풀이법
1) 깔끔한 풀이를 기대하고 들어왔다면.. 죄송하지만 해당 풀이는 도움이 크게 되지는 않습니다.
2) Deque을 사용하면 더 쉽게 풀 수 있다는 것을 문제를 보고 눈치 챘지만, 안 쓴지 너무 오래되었으며 검색 없이 정해준 30분이라는 시간 제한 내에 어떻게든 풀기 위해 조건을 빡 구현하여 배열로 문제를 풀었습니다.
3) checkOne, CheckTwo, CheckThree 라는 bool 변수를 두어서 톱니가 회전하는지를 확인하고 모든 경우의 수를 if-else로 구현해서 문제를 맞출 수 있었습니다.
4) 단순한 구현이 전부인 문제이기에 if-else로 문제를 풀려고 하시는 분들께서는 코드를 보심이 더 이해가 쉬우실 겁니다.
#include <string>
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
#include <algorithm>
#include <set>
#include <math.h>
using namespace std;
int arr[8][5];
int k;
void rotRight(int which)
{
int now = arr[7][which];
for (int i = 7; i >=1; i--)
{
arr[i][which] = arr[i - 1][which];
}
arr[0][which] = now;
}
void rotLeft(int which)
{
int now = arr[0][which];
for (int i = 1; i <= 7; i++)
{
arr[i-1][which] = arr[i][which];
}
arr[7][which] = now;
}
void rotate(int which, int dir)
{
bool checkOne = false;//1번 톱니 2번, 2번 톱니 6번
bool checkTwo = false;//2번 톱니 2번, 3번 톱니 6번
bool checkThree = false;//3번 톱니 2번, 4번 톱니 6번
if (arr[2][1] != arr[6][2])
checkOne = true;
if (arr[2][2] != arr[6][3])
checkTwo = true;
if (arr[2][3] != arr[6][4])
checkThree = true;
if (dir == 1)//시계
{
rotRight(which);
if (which == 1)
{
if (checkOne == true)
{
rotLeft(which + 1);
if (checkTwo == true)
{
rotRight(which + 2);
if (checkThree == true)
rotLeft(which + 3);
}
}
}
else if (which == 2)
{
if (checkOne == true)
{
rotLeft(which - 1);
}
if (checkTwo == true)
{
rotLeft(which + 1);
if (checkThree == true)
{
rotRight(which + 2);
}
}
}
else if (which == 3)
{
if (checkTwo== true)
{
rotLeft(which - 1);
if (checkOne == true)
rotRight(which - 2);
}
if (checkThree == true)
{
rotLeft(which + 1);
}
}
else
{
if (checkThree == true)
{
rotLeft(which - 1);
if (checkTwo == true)
{
rotRight(which - 2);
if (checkOne == true)
rotLeft(which - 3);
}
}
}
}
else
{
rotLeft(which);
if (which == 1)
{
if (checkOne == true)
{
rotRight(which + 1);
if (checkTwo == true)
{
rotLeft(which + 2);
if (checkThree == true)
rotRight(which + 3);
}
}
}
else if (which == 2)
{
if (checkOne == true)
{
rotRight(which - 1);
}
if (checkTwo == true)
{
rotRight(which + 1);
if (checkThree == true)
{
rotLeft(which + 2);
}
}
}
else if (which == 3)
{
if (checkTwo == true)
{
rotRight(which - 1);
if (checkOne == true)
rotLeft(which - 2);
}
if (checkThree == true)
{
rotRight(which + 1);
}
}
else
{
if (checkThree == true)
{
rotRight(which - 1);
if (checkTwo == true)
{
rotLeft(which - 2);
if (checkOne == true)
rotRight(which - 3);
}
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
for (int i = 1; i <= 4; i++)
{
string s; cin >> s;
for (int j = 0; j < s.size(); j++) {
arr[j][i] = (s[j] - '0');
}
}
cin >> k;
for (int t = 0; t < k; t++) {
int a, b; cin >> a >> b;
rotate(a, b);
}
int ans = 0;
for (int i = 1; i <= 4; i++)
{
if (arr[0][i]==1)
{
ans += (int)(pow(2, i-1));
}
}
cout << ans;
}
'Coding_Test_C++' 카테고리의 다른 글
BaekJoon 16928번: 뱀과 사다리 게임(C++) (0) | 2021.09.25 |
---|---|
BaekJoon 16236번: 아기상어(C++) (0) | 2021.09.24 |
BaekJoon 18111번: 마인크래프트(C++) (0) | 2021.09.18 |
BaekJoon 1062번: 가르침(C++) (0) | 2021.09.17 |
BaekJoon 1939번: 중량제한(C++) (0) | 2021.09.16 |