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

dkstmdwns67님의 프로필 이미지
dkstmdwns67

작성한 질문수

10주완성 C++ 코딩테스트 | 알고리즘 코딩테스트

1-L

1-L 주몽 문제 질문입니다

작성

·

268

1

안녕하세요 큰돌님. 현재 강의를 듣고 있는 수강생입니다. 현재 1-L문제를 Vector형식에서 이중 for문을 이용해서 푸는데 고유한 값을 만들 수 있는 두개의 값이 있을 경우 이후 두개의 값을 0으로 처리하여 첫 번째 for문에서 0이 있을 경우 두 번째 for문으로 들어가지 않게 처리를 했는데요. 그 처리를 하니 백준에서 틀렸다고 나옵니다. 하지 않았을 경우에는 맞다고 표시가 되고요. 그래서 이유가 뭔지 궁금합니다.

http://boj.kr/561f58234a27422bb2b2e02606e349fa

답변 2

0

큰돌님의 프로필 이미지
큰돌
지식공유자

안녕하세요 ㅎㅎ

하지 않았을 경우에는 맞다고 표시가 되고요.

>> 이부분 공유가능하신가요?

 

저도 어느정도는 고쳐봤는데 아직입니다 ㅠ

 
#include <bits/stdc++.h>
using namespace std;

int N, M, a, c; 
vector<int> v;
int main()
{

    cin >> N >> M;
    for(int i  = 0; i < N; i++)
    {
        cin >> a;
        v.push_back(a);
    } 

    for(int j = 0; j < N; j++)
    { 
        if(M - v[j] < 0) continue;
        if(v[j] == M - v[j]) continue;
        if(v[j] == 0) continue; 
        for(int k = j + 1; k < N; k++)
        { 
            if(v[j]+v[k]==M)
            {
                v[j]=0;
                v[k]=0;
                c++;
                break;
            }
        } 
    }

    cout << c << "\n";
    return 0;
}

 

감사합니다.

dkstmdwns67님의 프로필 이미지
dkstmdwns67
질문자

http://boj.kr/ae68e8274e574f06af1334b37723865e
해당 코드 링크입니다. 기존 코드에서 v[j]=0, v[k]=0을 주석처리를 했습니다.

0

안녕하세요, 인프런 AI 인턴입니다.

dkstmdwns67님, 말씀하신 1-L 주몽 문제와 관련해 유사한 상황에 대한 질문과 답변이 있었습니다. 해당 질문에서는 주어진 문제에서 특정 처리를 할 때와 하지 않았을 때의 차이점을 논의하고 있습니다. 강의의 지식공유자께서는 질문자가 제공한 코드의 특정 부분(예: if(a[i] && m - i > 0 && a[m - i])에서의 i == m - i 검사 누락)에서 문제가 발생할 수 있다고 언급하며 해결 방법을 제공하고 있습니다. 이러한 경우, 이미 투표되거나 처리된 원소를 다시 확인하지 않도록 주의해야 합니다.

이와 유사한 상황이실 경우, 아래 URL에서 제공되는 답변의 해결책이 도움이 될 것 같습니다.

해당 답변에서 지식공유자께서 제공한 예시 코드는 다음과 같습니다:

#include <bits/stdc++.h>
using namespace std;

int n, m, ret, tmp, a[100001];

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL); cout.tie(NULL);

    cin >> n >> m;

    // 예외 상황 처리
    if(m >= 200000){
        cout << 0;
        exit(0);
    }

    for(int i=0; i < n; i++){
        cin >> tmp;
        a[tmp] = 1;
    }
    for(int i = 1; i <= 100000; i++){
        if(i == m - i) continue; // 같은 원소를 두 번 사용하는 경우 제외
        if(a[i] && m - i > 0 && a[m - i]){
            ret++;
            a[i] = 0; // 이미 사용된 원소 처리
        }
    }

    cout << ret;

    return 0;
}

이 코드는 i == m - i 인 상황을 제외하는 로직을 포함하고 있으며, 이는 같은 원소를 두 번 사용하는 경우를 배제하기 위함입니다. 만약 문제가 계속되면 위의 URL을 방문하여 보다 상세한 지식공유자의 답변을 확인하시거나, 추가 질문을 통해 해결을 도모하실 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

dkstmdwns67님의 프로필 이미지
dkstmdwns67

작성한 질문수

질문하기