인프런 커뮤니티 질문&답변

조준서님의 프로필 이미지
조준서

작성한 질문수

Do it! 알고리즘 코딩테스트 with C++

[투 포인터 실전 문제] 좋은 수 구하기 (백준 1253)

문제 8번 질문드립니

작성

·

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번 인덱스부터 값을 저장하여 정렬하면, 모든 값이 예상한 위치에 정렬되어 올바른 결과를 얻을 수 있습니다.

질문하신 코드의 문제는 인덱스를 기준으로 알고리즘을 설계하였지만, 벡터의 관례에 맞지 않게 사용하여 발생한 문제로 보입니다. 인덱스 관리를 보다 정확하게 하여 문제를 해결해보세요.

조준서님의 프로필 이미지
조준서

작성한 질문수

질문하기