728x90

 0. [c++] 백준


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


 1. 풀이


1) 1번 풀이는 이전에 백준 2470 - 두 용액을 풀면서 활용했었던 방법을 동일하게 활용하기 위해서 만든 코드이다.


기본적으로 3개의 합의 최솟값을 구하는 방법은 N^3의 방법으로 풀 수 있는데, 이러한 방법을 사용하면 5000^3은 1억이 넘는 계산이 필요해지면서 시간초과가 발생하게 된다.


이를 해결하기 위한 방법으로 미리 2개의 수를 더한 이후, 나머지 한개를 더해주어서 결과를 구해내는 방법이었다.


어떻게 하여 마무리를 하였지만, 아무리 생각해도 이게 슬라이딩 윈도우라는 생각이 들지 않아서 구글링을 해보았다.




2) 구글링을 통해 https://jaimemin.tistory.com/679에 들어가보았는데, 내가 원하던 방식의 풀이를 볼 수 있었다.


사실 밑의 코드보다 이 코드가 더 좋으니 찾아보시길 ㅜㅜ



 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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include<iostream>
#include<vector>
#include<algorithm>
 
using namespace std;
 
vector<long long> Acid;
vector<long long> Basic;
 
vector<pair<long longpair<intint> > > AcidSum;
vector<pair<long longpair<intint> > > BasicSum;
 
long long Solve[3];
 
bool cmp(long long a, long long b) {
    return abs(a) < abs(b);
}
 
bool cmp2(pair<long longpair<intint> > a, pair<long longpair<intint> > b) {
    return abs(a.first) < abs(b.first);
}
 
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
 
    int T;
    long long temp;
    
 
    //입력을 받아오자.
    cin >> T;
    for (int i = 0; i < T; i++) {
        cin >> temp;
        if (temp < 0)
            Basic.push_back(temp);
        else
            Acid.push_back(temp);
    }
    //가져온 입력을 정렬해준다.
    sort(Acid.begin(), Acid.end());
    sort(Basic.begin(), Basic.end(), cmp);
 
    long long SUM = 3000000000;
 
    if (Basic.size() >= 3) {
        SUM = Basic[0+ Basic[1+ Basic[2];
        SUM = abs(SUM);
        Solve[2= Basic[0];
        Solve[1= Basic[1];
        Solve[0= Basic[2];
    }
 
    if (Acid.size() >= 3) {
        if (SUM > Acid[0+ Acid[1+ Acid[2]) {
            Solve[0= Acid[0];
            Solve[1= Acid[1];
            Solve[2= Acid[2];
        }
    }
 
    //3가지를 모두 더하도록 함수를 만든다면, 5000*5000*5000으로 시간초과를 하게된다.
//따라서 2개를 더한 배열을 만든 이후, 나머지 하나를 더해주는 방식을 택한다면? 5000*5000 + x*5000으로 시간 내 해결 가능!
    if (Acid.size() >=2) {
    
        for (int i = 0; i < Acid.size() - 1; i++)
            for (int j = i + 1; j < Acid.size(); j++) {
                AcidSum.push_back({ Acid[i] + Acid[j], {i,j} });
            }
        for (int i = 0; i < Basic.size(); i++)
            AcidSum.push_back({ Basic[i], {i,-1} });
        sort(AcidSum.begin(), AcidSum.end(), cmp2);
        for (int i = 0; i < AcidSum.size() - 1; i++) {
            //인접한 두개의 부호가 다른 경우
            if (AcidSum[i].first * AcidSum[i + 1].first <= 0) {
                if (SUM > abs(AcidSum[i].first + AcidSum[i + 1].first)) {
                    SUM = abs(AcidSum[i].first + AcidSum[i + 1].first);
                    if (AcidSum[i].first < 0) {
                        Solve[0= AcidSum[i].first;
                        Solve[1= Acid[AcidSum[i + 1].second.first];
                        Solve[2= Acid[AcidSum[i + 1].second.second];
                    }
                    else {
                        Solve[0= AcidSum[i + 1].first;
                        Solve[1= Acid[AcidSum[i].second.first];
                        Solve[2= Acid[AcidSum[i].second.second];
                    }
                }
            }
        }
    }
    
 
 
 
    
 
    if (Basic.size() >= 2) {
        for (int i = 0; i < Basic.size() - 1; i++)
            for (int j = i + 1; j < Basic.size(); j++) {
                BasicSum.push_back({ Basic[i] + Basic[j], {j, i} });
            }
        for (int i = 0; i < Acid.size(); i++)
            BasicSum.push_back({ Acid[i], {i,-1} });
        sort(BasicSum.begin(), BasicSum.end(), cmp2);
        for (int i = 0; i < BasicSum.size() - 1; i++) {
            //인접한 두개의 부호가 다른 경우
            if (BasicSum[i].first * BasicSum[i + 1].first <= 0) {
                if (SUM > abs(BasicSum[i].first + BasicSum[i + 1].first)) {
                    SUM = abs(BasicSum[i].first + BasicSum[i + 1].first);
                    if (BasicSum[i].first < 0) {
                        Solve[2= BasicSum[i + 1].first;
                        Solve[0= Basic[BasicSum[i].second.first];
                        Solve[1= Basic[BasicSum[i].second.second];
                    }
                    else {
                        Solve[2= BasicSum[i].first;
                        Solve[0= Basic[BasicSum[i + 1].second.first];
                        Solve[1= Basic[BasicSum[i + 1].second.second];
                    }
                }
            }
        }
    }
    
    for (int i = 0; i < 3; i++) {
        cout << Solve[i] << " ";
    }
    return 0;
}
cs


 3. 참고




질문이나 지적 있으시면 댓글로 남겨주세요~

도움 되셨으면 하트 꾹!


+ Recent posts