티스토리 뷰

#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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함