[백준] 1253번: 좋다
2022. 9. 3. 17:29ㆍTIL💡/Algorithms
https://www.acmicpc.net/problem/1253
문제 자체는 어렵지 않지만 조건을 나누는 것이 상당히 까다롭다.
코딩테스트 풀 때도 이 문제 풀이 능력을 살리기 위해서 최대한 쉽게 코드를 짜려고 해보았다.
고려한 엣지 케이스
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';
}
'TIL💡 > Algorithms' 카테고리의 다른 글
[백준] 7573번: 고기잡이 (0) | 2022.09.04 |
---|---|
[백준] 14658번: 하늘에서 별똥별이 빗발친다. (0) | 2022.09.04 |
[백준] 4485번: 녹색 옷 입은 애가 젤다지? (0) | 2022.09.03 |
[백준] 13549: 숨바꼭질3 with Deque (0) | 2022.09.02 |
[Programmers] 전화번호 목록 with Hash (0) | 2022.08.03 |