https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWIeV9sKkcoDFAVH
먼저 회전시킬 자석들을 미리 판단한 후에 돌려주면 됩니다.
저는 회전시킬 자석들을 큐에 담아 놓고, 판단이 끝나면 큐에서 차례차례 꺼내어 회전시켜줬습니다.
판단할 때는 자석의 2번과 6번이 같은지 틀린지만 보면 되며,
저는 check변수를 통해 자석의 »쪽을 비교할지 «쪽을 비교할지 판단하였습니다.
(때문에 처음엔 양쪽을 봐야하므로 두번 함수를 돌림)
#include <iostream>
#include <queue>
using namespace std;
//10:54
int k, result;
bool mag[4][8];
bool ch[4];
struct Info {
int num;
int dir;
};
queue <Info> q;//회전시킬애들 담아논다
void decide(int num, int dir, int check) {//회전시킬애들 판단
if (mag[num][2] != mag[num + 1][6] && num < 3 && check == 1) {
q.push({ num + 1,dir*(-1) });
decide(num + 1, dir*(-1), 1);
}
else if (mag[num][6] != mag[num - 1][2] && num > 0 && check == -1) {
q.push({ num - 1,dir*(-1) });
decide(num - 1, dir*(-1), -1);
}
}
void rotate() {//회전
while (!q.empty()) {
int num = q.front().num;
int dir = q.front().dir;
q.pop();
if (dir == 1) {
int temp = mag[num][0];
mag[num][0] = mag[num][7];
for (int i = 7; i > 1; i--) {
mag[num][i] = mag[num][i - 1];
}
mag[num][1] = temp;
}
else {
int temp = mag[num][0];
for (int i = 0; i < 7; i++) {
mag[num][i] = mag[num][i + 1];
}
mag[num][7] = temp;
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int test_case;
cin >> test_case;
for (int t = 1; t <= test_case; t++) {
//start
cin >> k;
result = 0;
for (int i = 0; i < 4; i++)
for (int j = 0; j < 8; j++)
cin >> mag[i][j];
for (int i = 0; i < k; i++) {
int num, dir;
cin >> num >> dir;
num -= 1;
q.push({ num,dir });//회전시킬애
decide(num, dir, 1);//위치에서>>
decide(num, dir, -1);//위치에서<<
rotate();
}
//end
for (int i = 0; i < 4; i++) {
result += mag[i][0] * (1 << i);//2의제곱만큼더함
}
cout << '#' << t << ' ' << result << '\n';
}
}
- 나 혼자 말하고 나 혼자 듣는 말
쉬웠는데… 실수를 많이해서 1시간 걸렸다…ㅠㅠㅠ