본문 바로가기
Algorithm/문제 풀이 (Problem Solving)

[C++] 백준 2309번 일곱난장이 문제풀이

by matters_ 2019. 2. 14.

문제 링크

백준 2309번 일곱난장이

 

2309번: 일곱 난쟁이

아홉 개의 줄에 걸쳐 난쟁이들의 키가 주어진다. 주어지는 키는 100을 넘지 않는 자연수이며, 아홉 난쟁이의 키는 모두 다르며, 가능한 정답이 여러 가지인 경우에는 아무거나 출력한다.

www.acmicpc.net

 

DP관련 문제인 줄 알았더니 알고보니 짐승공격 문제였다. ㅎㅎㅎ

항상 9개가 입력되고 7개의 답안이 출력된다는 점에 착안해서 9개 중에 골라낼 가짓수 2개를 모두 하나하나 대입하여 제외하고 나머지 7개의 합이 100이 되는지 판단하는 문제이다.

vector와 sort함수를 이용하였다.   

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <vector>
#include <algorithm> 
using namespace std;
 
int main(){
    vector <int> h;
    int sum=0;
    for(int i=0;i<9;i++){
        int ht;
        cin>>ht;
        sum+=ht;
        h.push_back(ht);
    }
    for(int i=0;i<h.size();i++){
        int j=i+1;
        for(j;j<h.size();j++ ){
            int mus=h[i]+h[j];
            if(sum-mus==100){
            h.erase(h.begin()+i);
            h.erase(h.begin()+j-1);
            }
        }    
        
    }
    sort(h.begin(),h.end());
    for(int i=0;i<h.size();i++){
        cout<<h[i]<<"\n";
    }
    return 0;
}
cs

 

이번 문제에서 배운 점은 sort함수를 쓸 때 단순 배열의 경우 +N을 사용하여 정렬하지만 vector의 경우 begin(), end()함수를 사용하여 나타낸다는 점이다. 

또한 erase함수를 사용하여 지우는데 지워진 것을 고려하여 iterator를 사용해야 한다는 점이다. +j-1 를 사용한 이유도 그 점에서 사용하였다. 

댓글