백준 문제풀이/BRONZE

[백준 / BOJ / BRONZE 2] 2309 번 : 일곱 난쟁이

지나가던 개발자 2020. 3. 3. 21:52
반응형

https://www.acmicpc.net/problem/2309

 

2309번: 일곱 난쟁이

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

www.acmicpc.net

문제 접근 방법

  • 일곱 난쟁이의 키의 합이 100이 되어야 한다.
  • 전체 난쟁이의 키의 합을 구한뒤, 2명의 키를 빼서 100이 되는 경우를 구하면 된다.

아래는 코드입니다.

일반 배열과 vector를 사용하여 푼 방법 2가지가 있습니다.

문제의 푸는 방식은 거의 동일합니다.

 

일반 배열을 사용한 첫 번째 코드입니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int num[9];
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int sum = 0;
 
    for (int i = 0; i < 9; i++)
    {
        cin >> num[i];
        sum += num[i];
    }
 
    sort(num, num + 9);
 
    for (int i = 0; i < 9; i++)
    {
        for (int j = i + 1; j < 9; j++)
        {
            if (sum - num[i] - num[j] == 100) // 정답에 해당하는 조건을 찾았을 때
            {
                for (int k = 0; k < 9; k++)
                {
                    if (k == i || k == j) // 해당하는 num[i], num[j]는 출력을 하지 않음
                    {
                        continue;
                    }
                    cout << num[k] << "\n";
                }
                return 0;
            }
        }
    }
 
    return 0;
}
Colored by Color Scripter
 

 

vector를 사용한 두 번째 코드입니다.

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    int sum = 0;
    vector<int> vec;
 
    for (int i = 0; i < 9; i++)
    {
        int a;
        cin >> a;
        vec.push_back(a);
        sum += a;
    }
    sort(vec.begin(), vec.end());
 
    for (int i = 0; i < 9; i++
    {
        for (int j = i + 1; j < 9; j++)
        {
            if ((sum - vec[i] - vec[j]) == 100)
            {
                if (i > j) // 조건을 만족한 위치를 찾아 vector에서 제거합니다.
              { // 뒤쪽 벡터값부터 제거합니다.
                    vec.erase(vec.begin() + i);
                    vec.erase(vec.begin() + j);
                }
                else
                {
                    vec.erase(vec.begin() + j);
                    vec.erase(vec.begin() + i);
                }
 
                for (int k = 0; k < vec.size(); k++)
                {
                    cout << vec[k] << "\n";
                }
 
                return 0;
            }
        }
    }
    return 0;
}
Colored by Color Scripter
 
반응형