반응형

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

 

20366번: 같이 눈사람 만들래?

높이가 (2, 5), (3, 5)로 구성된 눈사람 둘을 만드는 것이 최적의 경우 중 하나이다. |7-8| = 1 다른 경우로는 (2, 9), (5, 5)로 두 눈사람을 만드는 경우가 있다. |11-10| = 1

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. arr 배열에 수들을 입력받고, 오름차순으로 정렬합니다.

 

2. 이중 for문을 통해 첫 번째 눈사람을 고정시키고, 두 번째 눈사람을 투 포인터를 이용하여 temp에 저장합니다.

 

3. 첫 번째 눈사람과 두 번째 눈사람의 높이 차의 절댓값 중 최솟값을 ans에 저장하고, ans가 0이라면 바로 출력하고 프로그램을 종료시킵니다.

 

4. ans를 출력합니다.

 

[ 소스코드 ]

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
52
53
54
55
56
57
#include<iostream>
#include<algorithm>
#include<cmath>
 
using namespace std;
 
int N;
int arr[600];
int ans = 2011111111;
 
int main()
{
    scanf("%d"&N);
 
    for (int i = 0; i < N; i++) {
        scanf("%d"&arr[i]);
    }
 
    sort(arr, arr + N);
 
    for (int i = 0; i < N ; i++) {
        for (int j = i + 1; j < N ; j++) {
            int H = arr[i] + arr[j];
            int s, e;
            s = i + 1;
            e = N - 1;
            while (s < e) {
                int temp = arr[s] + arr[e];
 
                if (s == i || s == j) {
                    s++;
                    continue;
                }
                if (e == i || e == j) {
                    e--;
                    continue;
                }
 
                ans = min(ans, abs(H - temp));
 
                if (ans == 0) {
                    printf("0");
                    return 0;
                }
 
                if (H - temp > 0) {
                    s++;
                }
                else {
                    e--;
                }
            }
        }
    }
 
    printf("%d", ans);
}
cs
반응형

+ Recent posts