본문 바로가기
Algorithm/BOJ

[BOJ]2309번: 일곱 난쟁이(java, c++)

by HBGB 2020. 1. 4.

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

 

2309번: 일곱 난쟁이

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

www.acmicpc.net

 

 

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
import java.io.*;
import java.util.Arrays;
 
public class Main {
    
     public static void main(String[] args) throws Exception {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
        // 입력, 총합sum 구하기
        int[] arrDwarfs = new int[9];
        int sum = 0;        
        for (int i = 0; i < 9; i++) {
            arrDwarfs[i] = Integer.parseInt(br.readLine());
            sum += arrDwarfs[i];
        }
        
        // 오름차순 정렬
        Arrays.sort(arrDwarfs);
        
        // 총합 - 2개요소 = 100 인 것을 구하기
        for (int i = 0; i < arrDwarfs.length; i++) {
            for (int j = i + 1; j < arrDwarfs.length; j++) {
                
                if (sum - arrDwarfs[i] - arrDwarfs[j] == 100) {
                    for (int k = 0; k < arrDwarfs.length; k++) {
                        
                        if (k == i || k == j) {
                            continue;
                        }
                        bw.write(arrDwarfs[k] + "\n");
                    }
                    bw.flush();
                    return;
                }
            }
        }
    }
}
Colored by Color Scripter

 

c++소스

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
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
    const int dwarfNum = 9;
    int dwarf[dwarfNum];
    
    // 입력. 난쟁이 키 총합 계산
    int sum = 0;
    for (int i = 0; i < dwarfNum; i++)
    {
        cin >> dwarf[i];
        sum += dwarf[i];
    }
 
    // 오름차순 정렬
    sort(dwarf, dwarf + dwarfNum);
 
    for (int i = 0; i < dwarfNum; i++)
    {
        for (int j = i + 1; j < dwarfNum; j++)
        {
            // 총합 - 난쟁이키 2명 = 100 일때 출력 후 종료.
            if (sum - (dwarf[i] + dwarf[j]) == 100)
            {
                for (int k = 0; k < dwarfNum; k++)
                {
                    if (k == i || k == j)
                    {
                        continue;
                    }
                    cout << dwarf[k] << '\n';
                }
                return 0;
            }
        }
    }
 
    return 0;
}
Colored by Color Scripter

 

조합으로 풀기도 했는데, 속도는 위에 3중 포문 돌린것과 같았다. 

입력 갯수가 많아지면 조합 또는 정렬이 더 적절할 것 같다. 

 

TIP

일곱 난쟁이의 키의 합이 100이 됨

 

9명 중 7명의 난쟁이의 키의 합이 100이라면,

총합에서 2명 키를 빼면 100이 된다라는 말과 같다.

 

문제를 조금만 더 생각하면 코드가 간결해진다!

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ]1476번: 날짜 계산(java, c++)  (0) 2020.01.06
[BOJ]3085번: 사탕 게임(java)  (0) 2020.01.05
[BOJ]2225번: 합분해(java)  (0) 2019.10.19
[BOJ]1699번: 제곱수의 합(java, c++)  (0) 2019.10.19
[BOJ]1912번: 연속합(java, c++)  (0) 2019.10.19

댓글