kimbro6   2년 전

이 코드는 되고, 이 코드는 왜 안되는지 궁금합니다!

100점 맞은 코드:

#include <iostream>
using namespace std;
int main() {
    long long n, s=0, sum[100000] = {0}, input, cnt[4] = {1, 0, 0, 0}, division;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> input;
        s += input;
        sum[i] += s;
    }
    if (sum[n-1] % 4) {
        cout << "0";
    } else {
        division = sum[n-1] / 4;
        for (int i = 0; i < n-1; i++) {
            if (sum[i] == 3 * division)
                cnt[3] += cnt[2];
            if (sum[i] == 2 * division)
                cnt[2] += cnt[1];
            if (sum[i] == 1 * division)
                cnt[1] += cnt[0];
        }
        cout << cnt[3];
    }
    return 0;
}

5점 맞은 코드:

#include <iostream>
using namespace std;
int main() {
    long long n, sum[100000] = {0}, input, cnt[4] = {1, 0, 0, 0}, division;
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> input;
        sum[i] += sum[i-1] + input;
    }
    if (sum[n-1] % 4) {
        cout << "0";
    } else {
        division = sum[n - 1] / 4;
        for (int i = 0; i < n-1; i++) {
            if (sum[i] == 3 * division)
                cnt[3] += cnt[2];
            if (sum[i] == 2 * division)
                cnt[2] += cnt[1];
            if (sum[i] == 1 * division)
                cnt[1] += cnt[0];
        }
        cout << cnt[3];
    }
    return 0;
}

두 코드의 차이점은 sum 배열을 만드는 것에 있습니다.

100점 맞은 코드는

    for (int i = 0; i < n; i++) {
        cin >> input;
        s += input;
        sum[i] += s;
    }

5점 맞은 코드는 

    for (int i = 0; i < n; i++) {
        cin >> input;
        sum[i] += sum[i-1] + input;
    }

입니다.

반복문 둘다 똑같은 기능을 수행하는 것이 아닌가요? 
5점 맞은 코드의 i = 0 일때 sum[-1]의 값이 0이 아닌가요?

lcr7324   2년 전

C++에서 배열의 음의 인덱스에 접근하는 것은 undefined behavior입니다. 다시 말해 sum[-1]에서 무슨 값이든 튀어나올 수 있습니다. 실행 환경에 따라 0이 나올 수도 있지만, 아닐 수도 있습니다.

kimbro6   2년 전

아하 그렇군요 감사합니다!!

댓글을 작성하려면 로그인해야 합니다.