해결된 질문
작성
·
103
1
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.
안녕하세요!
http://boj.kr/8c457baae3554ac38764f81d351201bc
제가 생각한 문제 풀이는 총 9명 키의 합에서 100을 빼면 난쟁이가 아닌 2명 키의 합이 나온다고 생각했습니다.
9명의 키합 - 100의 값을 ss로 정하고 for문을 돌면서 2명의 합이 ss가 나오면 해당 두명을 erase를 사용해 제거해서 출력하는 방식으로 코딩했습니다. Devc++에서 입력받고 출력도 잘 나오는데 반례가 있는지 백준 제출하면 틀렸다고 나오는데 어떤게 문제인지 모르겠어 질문남깁니다! 감사합니다!
답변 2
1
안녕하세요 문규님 ㅎㅎ
이 문제 같은 경우 답이 되는 경우의수가 여러개 발생할 수 있습니다.
이 때문에 만약 경우의 수발견 -> 그대로 종료를 시켜야 합니다.
#include<bits/stdc++.h>
using namespace std;
int main() {
vector<int> a; //입력 받기
for(int i=1; i<=9; i++) {
int q;
cin >> q;
a.push_back(q);
}
int sum = accumulate(a.begin(), a.end(), 0); //9명키 합 구하기
int ss = sum - 100; // 두명의 키 합이 ss값
sort(a.begin(), a.end()); //오름차순 정렬
for(int i:a) {
auto f = find(a.begin(), a.end(), ss-i);
if(f!=a.end() && *f*2 != ss){ //난쟁이 아닌 두명 찾아서 erase사용 제거
a.erase(remove(a.begin(), a.end(), ss-i), a.end());
a.erase(remove(a.begin(), a.end(), i), a.end());
break;
}
}
for(auto i:a) cout << i << '\n';
}
이렇게 해보시겠어요?
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
0
안녕하세요, 인프런 AI 인턴입니다.
문제의 풀이 접근 방식은 올바르게 생각하셨습니다. 9명의 난쟁이 키의 합에서 100을 빼면, 난쟁이가 아닌 2명의 키의 합을 찾을 수 있죠. 그리고 이 합에 해당하는 두 명을 찾아 제거하는 방식으로 문제를 해결할 수 있습니다.
하지만, 만약 입력된 키 값들 중에 같은 값을 가지는 난쟁이들이 있다면, erase
함수 사용에 주의가 필요합니다. erase
는 조건에 맞는 첫 번째 요소를 삭제하기 때문에, 같은 값을 가진 다른 난쟁이가 먼저 삭제될 가능성이 있습니다. 따라서, 키 값을 저장할 때는 각각의 키와 그 키를 가진 난쟁이의 인덱스를 함께 저장하는 방식을 고려할 수 있습니다. 그리고 두 난쟁이를 찾은 후에는 인덱스를 이용해 정확히 해당 난쟁이만을 제거하도록 로직을 구성해야 합니다.
또 다른 가능성으로는 반례를 찾지 못하는 논리적 오류가 있을 수 있습니다. 예를 들어, 모든 경우의 수를 다 고려하지 않고 일부를 놓치는 경우입니다. 모든 두 명의 조합을 정확히 확인했는지, 그리고 그 중 합이 정확히 ss
인 경우를 모두 탐색하고 있는지 다시 한 번 검토해보시기 바랍니다.
문제 해결에 있어서 반복문 내에서 삭제 작업을 할 경우, 인덱스 관리에 주의해야 합니다. 난쟁이를 제거한 후에는 인덱스가 당겨지기 때문에 이 부분을 고려하지 않으면 예상치 못한 결과가 나올 수 있습니다.
이와 같은 경우를 유의하시면서 다시 한 번 코드를 검토해보시기 바랍니다. 추가적으로, 조건을 만족하는 난쟁이를 찾는 과정에서도 나머지 난쟁이들의 순서가 문제가 되지 않도록 주의해 주세요.
질문이 더 있으시면 언제든지 문의해 주세요. 코드 수정 후에도 문제가 해결되지 않는다면, 구체적인 코드 내용과 함께 다시 질문해 주시면 더 도움을 드릴 수 있을 것입니다. 감사합니다!