해결된 질문
작성
·
209
0
안녕하세요 선생님,
강의 잘 보고 있습니다.
http://boj.kr/af15ab332b77463faa58e47e6826ca48
선생님께서 설명하신 방법과 비슷한데, 일곱 난쟁이가 아닌 두 명을 잡아내기 위해 아홉개의 입력값의 합 sum에서 일곱 난쟁이 키의 합인 100을 뺀 sum-100 을 sub라는 변수에 담아두었고, 이중for문을 이용해 두 입력값의 합이 sub와 일치하는 두 수를 찾아냈습니다. 배열은 삭제가 안되니 그냥 저 두수를 0으로 처리하고 sort를 통해 오름차순으로 정렬한 다음, 출력할 때 두번째 인덱스부터 출력하도록 코드를 짜봤습니다.(0으로 바뀐 두 수는 맨 앞인 0번째와 1번째에 위치하게 되어 2번째 인덱스부터 출력하도록 하여 출력이 안되는 것을 의도) 야매스러운 방법이긴 하지만.... 그래도 어느 부분에서 예외가 발생했는지 확실히 알고 싶어 이렇게 질문드립니다!
답변 1
0
안녕하세요 영수님 ㅎㅎ
for(int i=0; i<9; i++){
for(int j=i+1; j<9; j++){
if(a[i] + a[j] == sub){
a[i] = 0;
a[j] = 0;
}
잘하셨습니다.
다만, 이 문제의 경우 이렇게 답이 되는 경우의 수가 많이 존재합니다.
문제 지문을 볼까요?
아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.
이렇게 되어있죠?
따라서 해당 부분을 찾을 경우 바로 break;를 걸어주는게 필요합니다.
어? 너 정답이야?
야야!! 바로 빠져나와!! 더 다른 정답인 경우의수가 있으니까.
이렇게요.
#include<bits/stdc++.h>
using namespace std;
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int a[9];
for(int i = 0; i < 9; i++){
cin >> a[i];
}
int sum = 0;
for(int i=0; i<9; i++){
sum += a[i];
}
int sub = sum-100;
for(int i=0; i<9; i++){
for(int j=i+1; j<9; j++){
if(a[i] + a[j] == sub){
a[i] = 0;
a[j] = 0;
break;
}
}
if(a[i] == 0)break;
}
sort(a, a+9);
for(int i=2; i<9; i++){
cout << a[i] << "\n";
}
return 0;
}
이렇게 고쳐보시겠어요?
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
완벽하게 이해했습니다! 감사합니다!!