[백준] 1253번: 좋다

2022. 9. 3. 17:29TIL💡/Algorithms

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

 

1253번: 좋다

첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)

www.acmicpc.net

문제 자체는 어렵지 않지만 조건을 나누는 것이 상당히 까다롭다.

코딩테스트 풀 때도 이 문제 풀이 능력을 살리기 위해서 최대한 쉽게 코드를 짜려고 해보았다.

 

고려한 엣지 케이스

1. 0이 있는 경우

- 0, 3, -3

- 0, 1, 2

 

2. 음수가 있는 경우

- -1, -2, -4

 

3. 동일한 값이 여러 개 있는 경우

- 1, 1, 2

이 때문에 multiset을 썼다.

 

4. 복합적인 케이스

- 0, 0 3, 3, 3, 3

 

 

이러한 케이스들을 고려해서 코드를 짜려다보니 제일 간단하게 처리하기 위해선

처음부터 어떤 수와, 다른 수 두 개 각각이 우선 일치하지 않은 것부터 체크하는 것이 필요하다.

그리고 특이 케이스를 나눈다.

그 중 가장 특이한 케이스는 0, 0, 0이므로 주의를 다해야 한다.

한 수 다른 수 어떤 수
0 8 8
8 0 8
0 0 0
4 4 8
3 4 7
#include <iostream>
#include <algorithm>
#include <set>
using namespace std;
multiset<long long> s;
int main(void) {
    int n;
    int answer = 0;
    cin >> n;
    for(int i = 0;i < n;i++) {
        long long num;
        cin >> num;
        s.insert(num);
    }
    
    for(auto num = s.begin();num != s.end();num++) {
        for(auto i = s.begin();i != s.end();i++) {
            if(i == num) {
                continue;
            }
            long long j = *num - *i;
            
            if(s.find(j) != s.end()) {
                if(*i == *num && *i == j && s.count(j) > 2) {
                    answer++;
                    break;
                }
                else if(j == *num && *i != j && s.count(j) > 1) {
                    answer++;
                    break;
                }
                else if(*i == j && j != *num && s.count(j) > 1) {
                    answer++;
                    break;
                }
                else if(*i != j && *num != j) {
                    answer++;
                    break;
                }
            }
        }
    }
    cout << answer << '\n';
}