티스토리 뷰
#include <iostream>
using namespace std;
int gear[4][8];
int sub[8];
void roll(int g, int direc, int check)
{
int before[8];
for (int i = 0; i < 8; i++)
before[i] = gear[g - 1][i];
if (direc == 1)
for (int i = 0; i < 8; i++)
sub[i] = gear[g - 1][(i + 7) % 8];
else
for (int i = 0; i < 8; i++)
sub[i] = gear[g - 1][(i + 1) % 8];
for (int i = 0; i < 8; i++)
gear[g - 1][i] = sub[i];
if (g == 1) {
if (before[2] != gear[1][6] && check == 0)
roll(2, -direc, 0);
}
else if (g == 2) {
if (before[2] != gear[2][6] && check == 0)
roll(3, -direc, 0);
if (before[6] != gear[0][2] && check == 1)
roll(1, -direc, 1);
if (before[2] != gear[2][6] && check == 2)
roll(3, -direc, 0);
if (before[6] != gear[0][2] && check == 2)
roll(1, -direc, 1);
}
else if (g == 3) {
if (before[2] != gear[3][6] && check == 0)
roll(4, -direc, 0);
if (before[6] != gear[1][2] && check == 1)
roll(2, -direc, 1);
if (before[2] != gear[3][6] && check == 2)
roll(4, -direc, 0);
if (before[6] != gear[1][2] && check == 2)
roll(2, -direc, 1);
}
else {
if (before[6] != gear[2][2] && check == 1)
roll(3, -direc, 1);
}
}
int main(void)
{
char x;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 8; j++) {
cin >> x;
gear[i][j] = x - 48;
}
}
int k;
cin >> k;
for (int i = 0; i < k; i++) {
int num, direc;
cin >> num >> direc;
if (num == 1)
roll(num, direc, 0);
else if (num == 2)
roll(num, direc, 2);
else if (num == 3)
roll(num, direc, 2);
else
roll(num, direc, 1);
}
int ans = 0;
if (gear[0][0] == 1)
ans += 1;
if (gear[1][0] == 1)
ans += 2;
if (gear[2][0] == 1)
ans += 4;
if (gear[3][0] == 1)
ans += 8;
cout << ans;
return 0;
}
디버깅 두시간...
몇번이나 새로 짜고싶었지만 이유를 알아야했다.
질문 검색에 있는 예제도 다 통과하는데 틀리는건 아주 작은 부분의 문제라고 생각했기 때문이다.
그것만 고치면 답이 되는 것도 있고, 시험치다 작은 실수로 두시간동안 삽질할 순 없다.
여기저기 출력해보고 before 부분에서 오류가 난다는 걸 알았다. 원인은 전역으로 선언한 before에 값을 덮어쓴 것. 재귀 전 전역 배열을 수정하고 나올 때 복구하지 않았다.
복구 대신 배열을 지역으로 선언하는 식으로 고쳤다. 왜냐면 집에 가야해...
'프로그래밍 > 문제풀이' 카테고리의 다른 글
[BOJ] 17298 오큰수 (0) | 2020.06.13 |
---|---|
[BOJ] 10799 쇠막대기 (0) | 2020.06.13 |
[BOJ] 1107 리모컨 (0) | 2020.05.20 |
[BOJ] 10971 외판원 순회2 (0) | 2020.05.15 |
[BOJ] 11051 이항 계수 2 (0) | 2020.02.28 |
댓글