작성
·
211
0
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int N;
cin >> N;
vector<int> save(N + 1 , 0);
for (int i = 1; i <= N; i++) {
cin >> save[i];
}
sort(save.begin(), save.end());
int result = 0;
for (int k = 1; k <= N; k++) {
int s = 1; int e = N;
while (s < e && s >= 1 && e <= N) {
int temp = save[s] + save[e];
if (temp < save[k]) {
s++;
}
else if (temp > save[k]) {
e--;
}
else {
//만약 s와 e가 k와 같아지면 안됨
if (s != k && e != k) {
result++; break;
}
else if (s == k) s++;
else if (e == k) e--;
}
}
}
cout << result << "\n";
}
제가 다음과 같이 돌렸을 때 틀렸습니다라고 나오는데, 벡터에 저장할 때 0부터 저장하면 정답이라고 나오는 이유를 모르겠습니다
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
Junseo3456님, 질문하신 내용에 대해 설명드리겠습니다.
C++ STL에서 제공하는 vector
는 동적 배열을 제공하며, 0번 인덱스부터 사용하는 것이 일반적입니다. 배열(save
)의 인덱스를 0부터 하는 경우가 기본적인 코딩 관례이므로, 대부분의 STL 알고리즘 함수들도 이에 맞추어져 있습니다.
질문하신 코드에서 다음과 같이 벡터의 크기를 N+1로 선언하고, 1부터 N까지 값을 저장하고 있습니다:
vector<int> save(N + 1 , 0);
for (int i = 1; i <= N; i++) {
cin >> save[i];
}
이렇게 하면 save[0]
은 사용되지 않고 남게 되므로, 메모리를 낭비하게 됩니다.
참고로, sort
함수는 벡터의 전체 범위를 정렬하도록 설계되었습니다. 하지만 인덱스를 1부터 사용할 경우, save[0]
은 정렬에서 제외되어 잘못된 결과를 초래할 수 있습니다.
따라서 save
벡터를 0번 인덱스부터 사용하여 다음과 같이 코드를 수정하면 좀 더 자연스럽고 예상한 대로 동작하게 될 것입니다:
vector<int> save(N, 0); // 0부터 N-1까지 사용
for (int i = 0; i < N; i++) {
cin >> save[i];
}
0번 인덱스부터 값을 저장하여 정렬하면, 모든 값이 예상한 위치에 정렬되어 올바른 결과를 얻을 수 있습니다.
질문하신 코드의 문제는 인덱스를 기준으로 알고리즘을 설계하였지만, 벡터의 관례에 맞지 않게 사용하여 발생한 문제로 보입니다. 인덱스 관리를 보다 정확하게 하여 문제를 해결해보세요.