21757번 - 나누기
이 코드는 되고, 이 코드는 왜 안되는지 궁금합니다!
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이 아닌가요?
C++에서 배열의 음의 인덱스에 접근하는 것은 undefined behavior입니다. 다시 말해 sum[-1]에서 무슨 값이든 튀어나올 수 있습니다. 실행 환경에 따라 0이 나올 수도 있지만, 아닐 수도 있습니다.
아하 그렇군요 감사합니다!!
댓글을 작성하려면 로그인해야 합니다.
kimbro6 2년 전
이 코드는 되고, 이 코드는 왜 안되는지 궁금합니다!
100점 맞은 코드:
5점 맞은 코드:
두 코드의 차이점은 sum 배열을 만드는 것에 있습니다.
100점 맞은 코드는
5점 맞은 코드는
입니다.
반복문 둘다 똑같은 기능을 수행하는 것이 아닌가요?
5점 맞은 코드의 i = 0 일때 sum[-1]의 값이 0이 아닌가요?