BOJ

백준 1744 - 수 묶기

yanJuicy 2019. 10. 9. 20:52
반응형

문제

 

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

 

1744번: 수 묶기

길이가 N인 수열이 주어졌을 때, 그 수열의 합을 구하려고 한다. 하지만, 그냥 그 수열의 합을 모두 더해서 구하는 것이 아니라, 수열의 두 수를 묶으려고 한다. 어떤 수를 묶으려고 할 때, 위치에 상관없이 묶을 수 있다. 하지만, 같은 위치에 있는 수(자기 자신)를 묶는 것은 불가능하다. 그리고 어떤 수를 묶게 되면, 수열의 합을 구할 때 묶은 수는 서로 곱한 후에 더한다. 예를 들면, 어떤 수열이 {0, 1, 2, 4, 3, 5}일 때, 그냥 이 수열

www.acmicpc.net

 

 

풀이

 

1. 1 보다 큰 양수는 2개를 곱했을 때 더한 것 보다 무조건 크다. 그러므로 1보다 큰 두 수는 묶어야 한다. 1은 다른 수랑 곱하는 것보다 혼자 더 했을때 결과가 더 커진다.

2. 음수는 2개이상 있을 때 곱셈을 통해 양수가 되므로 2개 이상일 때 음수는 묶어야 한다.

3. 0은 2개로 묶여지지 않은 남겨진 음수와 묶어야 한다. 음수 보단 0이 더했을 때 결과가 더 커진다. 남은 음수가 없을 경우 0은 그냥 더하면 된다.

 

결과가 커지기 위해서 정렬을 먼저 하고 연산을 시작한다.

 

 

코드

 

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 N;
int result;
int arr[10000];
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(0);
 
    cin >> N;
 
    for (int i=0; i<N; i++cin >> arr[i];
 
    sort(arr, arr+N);
 
    // 음수 처리
    for (int i=0; arr[i] <= 0 && i < N;)
    {
        if (arr[i + 1<= 0 && i < N - 1)
        {
            result += arr[i] * arr[i+1];
            i+=2;
        }
        else result += arr[i++];
    }
 
    reverse(arr, arr+N);
 
    // 양수 처리
    for (int i=0; arr[i] > 0 && i < N;)
    {
        if (arr[i + 1> 1 && i < N - 1)
        {
            result += arr[i] * arr[i+1];
            i+=2;
        }
        else result += arr[i++];
    }
 
    cout << result;
    return 0;
}
cs

 

 

반응형

'BOJ' 카테고리의 다른 글

백준 1197 - 최소 스패닝 트리  (0) 2019.12.26
백준 1167 - 트리의 지름  (0) 2019.11.15
백준 1697 - 숨바꼭질  (0) 2019.10.02
백준 2875 - 대회 or 인턴  (0) 2019.09.30
백준 2304 - 창고 다각형  (0) 2019.09.29