| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
- 구현
- dfs
- 프로그래머스
- 동적계획법
- 다이나믹 프로그래밍
- 백준
- cpp
- 이분탐색
- BFS
- kotlin
- c++
- 자바
- 통신 인터페이스
- 컴퓨터비전
- 컴퓨터 비전
- C
- 다이나믹프로그래밍
- 그리디
- java
- dp
- 우선순위큐
- lv2
- 코틀린
- Stack
- level3
- 누적합
- 임베디드
- JavaScript
- level2
- 2018 KAKAO BLIND RECRUITMENT
- Today
- Total
코드를 느껴바라
2473번 : 세 용액 [C++] 본문
문제 링크
성공 여부(걸린 시간): 성공 (19분 25초)
아이디어
문제 자체는 간단하다. 세 용액의 합이 0에 제일 가까운 값을 만드는 세 용액을 구해 오름차순으로 출력하는 것이다.
그렇게 하기 위해서는 우선 이분탐색 또는 투포인터로 가능했는데 나는 투포인터를 사용해서 풀어주었다.
그렇게 하기 위해서는 우선 입력 받은 값들을 정렬해주고 첫번째 용액을 for문으로 선택 후
나머지 두 배열을 현재 바로 다음 순서의 용액과 마지막 용액을 각각 left, right로 잡고
sum이란 변수에 arr[i], arr[left], arr[right]의 합을 저장해주고
sum의 값에 따른 분기를 통해서 다음 동작을 제어한다.
1. 만약 sum이 0이다?
-> 그럼 최소값을 이루는 조합 중에 하나임이 틀림없기에 바로 출력해주고 return해준다.
2. 만약 sum값의 절대값이 지금까지의 세 용액의 합의 절대값 중의 최소값 보다 작다?
-> 세 용액의 조합을 저장 + 최소값 최신화 해준다.
3. sum > 0이다?
-> 합을 더 줄일 필요가 있기에 right를 1 감소시켜준다.
4. sum < 0이다?
-> 합을 키울 필요가 있기에 left를 1 증가시켜준다.
그런데 약간의 우여곡절
처음에는 arr는 어차피 입력이 절대값 10이 최대이기 때문에 sum부분만 long값으로 해줬더니 틀렸다는 결과가 나와서 전부 long long으로 통일 시켜주었더니 통과했다. 그이유는 바로 ...
..
..
..

long = int + int + int 라고 했을때
long에다가 int형인 값을 더하는 것이 아니라 = 하기 전까지 int로 계산이 되기때문에 오버플로우가 난 것이다.
풀이코드
#include<iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N;
cin >> N;
vector<ll> arr(N, 0);
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
sort(arr.begin(), arr.end());
vector<ll> answers(3, 0);
ll answer = 0x7fffffffffffffff;
for (int i = 0; i < N - 2; i++) {
int left = i + 1;
int right = N - 1;
while (left < right) {
ll sum = arr[i] + arr[left] + arr[right];
if (sum == 0) {
cout << arr[i] << " " << arr[left] << " " << arr[right];
return 0;
}
if (abs(sum) < answer) {
answer = abs(sum);
answers = { arr[i], arr[left], arr[right] };
}
if (sum<0) {
left++;
}
else {
right--;
}
}
}
cout << answers[0] << " " << answers[1] << " " << answers[2];
return 0;
}'PS > 백준(Baekjoon)' 카테고리의 다른 글
| 13022번 : 늑대와 올바른 단어 [C++] (5) | 2026.02.02 |
|---|---|
| 1135번 : 뉴스 전하기 [C++] (1) | 2026.02.02 |
| [보안] 자동차 사이버보안 트렌드, ISO/SAE 21432 (0) | 2026.01.28 |
| 2295번 : 세 수의 합 [C++] (2) | 2026.01.25 |
| 32867번 : 피아노 [C++] (0) | 2026.01.15 |
