펭로그

[C++] 삼성 SDS KOITP 큰수만들기 본문

Study/PS(Algorithm)

[C++] 삼성 SDS KOITP 큰수만들기

노랑펭귄 2018. 7. 22. 16:47
문제링크 : https://koitp.org/problem/SDS_TEST_BIGINT


[삼성 SDS 대학생 알고리즘 특강 사전 테스트 B Type 2번 문제]

int형을 사용하면 시간 초과가 나는 문제였다. 입력의 조건이 -1,000,000 ~ 1,000,000 이기 때문에 잘 확인해야 한다.

long int나 long, long long 어느 것으로 해도 상관없다.

다만, Windows 환경에선 long int와 long 형은 64비트 컴파일러(VS 기준) 4바이트로 인식하기 때문에 long long을 써야한다.

UNIX 64비트에선 long int와 long을 8바이트로 인식한다.

KOITP를 비롯한 대부분이 gcc 컴파일러를 사용하기 때문에 익숙해질 필요가 있다.



1. 맨 첫 입력은 고정이다.

2. 그 다음 입력부터 배열에 저장하여 정렬하면 쉽게 구할 수 있다.

3. 큰 숫자부터 차례로 덧셈을 하면 된다.

4. 덧셈 횟수 + 뺄셈 횟수가 어짜피 N-1이기 때문에 굳이 덧셈 횟수를 다 소진하면 굳이 뺄셈에 대한 조건을 따로 정의할 필요 없이 else로 처리하였다.



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
// KOITP_SDS_Btype_02
#include <bits/stdc++.h>
 
using namespace std;
 
int main() {
    // freopen("../input.txt", "r", stdin);
    int T;
    cin >> T;
    for (int t = 1; t <= T; t++) {
        int card, plus, minus;
        long int result;
        cin >> card >> plus >> minus;
        vector<long int> num(card - 1);
        cin >> result;
        for (int i = 0; i < card - 1; i++)
            cin >> num[i];
        sort(num.begin(), num.end());
        while (!num.empty()) {
            if (plus > 0) {
                result += num.back();
                plus--;
            } else {
                result -= num.back();
            }
            num.pop_back();
        }
        cout << "#" << t << " " << result << "\n";
    }
    return 0;
}
cs


Comments