[백준] 2473번 세 용액 (C++)

2025. 8. 6. 16:21·Algorithm
728x90

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

 

 

이 문제는 이전 비슷한 문제 두 용액 문제와 비슷한 문제이다.

서로 다른 용액의 크기가 주어졌을때 3개의 용액을 합하여 용액의 크기가 0에 가깝게 만드는 용액을 출력하는 문제이다.

 

용액의 수가 최대 5000 이기 때문에 완전탐색 O(N^3) -> 10억 정도 들기 때문에 시간초과가 난다.

 

따라서 O(N)으로 최적으로 풀 수 있는 알고리즘을 사용해서 풀어야 한다.

 

 

따라서 O(N)으로 풀기 위해서 두포인터 알고리즘을 사용하는데 다른 하나의 포인터를 임의로 고정시켜서 모든 요소를 하나씩 선택하여 구하였다.

이때 오른쪽 포인터는 배열 끝을 선택하여 안쪽으로 좁혀나가는 방식으로 구하였다.

그 이유는 음수가 있기 때문에 0에 가깝게 하기위한 차이를 구하기 위해서이다.

 

정답 코드

#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
#define endl "\n"
#define MAX 3e9

int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
int N;
vector<ll> v;
ll res1, res2, res3;

void solve() {
    sort(v.begin(), v.end());
    ll minval = MAX;

    for(int i = 0; i < N-2; i++) {
        int left = i+1;
        int right = N-1;

        while(left < right) {
            ll val = v[i] + v[left] + v[right];

            ll vals = abs(val);

            if(minval > vals) {
                minval = vals;
                res1 = v[i];
                res2 = v[left];
                res3 = v[right];
            }

            if(val == 0) {
                cout << v[i] << " " << v[left] << " " << v[right];
                exit(0);
            }
            else if(val > 0) right--;
            else left++;
        }
    }

    cout << res1 << " " << res2 << " " << res3;
}

void input() {
    cin >> N;

    for(int i = 0; i < N; i++) {
        ll a;
        cin >> a;
        v.push_back(a);
    }
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);

    input();
    solve();
}

 

 

회고록

자꾸 범위 설정을 int로 하는 것이 버릇이 되서 크기를 설정할때 유심히 봐야하는 습관이 필요한것 같다.

3개의 합이 최대 3억이 될 수 있기 때문에 차이를 좁혀나가는 과정에서 차이값을 3억으로 설정해야했었는데

1억으로 설정하여 중간에 틀렸다

728x90
저작자표시 (새창열림)

'Algorithm' 카테고리의 다른 글

[백준] 17124번 두 개의 배열 (C++)  (0) 2025.08.08
[백준] 17141번 연구소 2 (C++)  (0) 2025.08.07
[백준] 12849번 본대 산책 (C++)  (0) 2025.08.05
[백준] 9024번 두 수의 합 (C++)  (0) 2025.08.04
[백준] 25193번 곰곰이의 식단 관리 (C++)  (0) 2025.08.03
'Algorithm' 카테고리의 다른 글
  • [백준] 17124번 두 개의 배열 (C++)
  • [백준] 17141번 연구소 2 (C++)
  • [백준] 12849번 본대 산책 (C++)
  • [백준] 9024번 두 수의 합 (C++)
쿨쿨.
쿨쿨.
  • 쿨쿨.
    All of the life
    쿨쿨.
  • 전체
    오늘
    어제
    • 분류 전체보기 (287) N
      • Programming (54) N
        • C, C++ (18)
        • Python (6)
        • Java (1)
        • HTML,CSS,JS (3)
        • SQL(DB) (13)
        • SpringBoot (10) N
        • Android (2)
        • CI,CD (1)
      • Algorithm (173)
        • Review (4)
      • Security (14)
        • WebHacking (3)
        • Websecurity (11)
      • OS (19)
        • Linux (12)
        • Mac os (2)
      • 머신러닝 (1)
      • CS(Computer Science) (12)
        • 컴퓨터 네트워크 (3)
        • 컴퓨터 구조 (1)
        • 인공지능 (8)
      • Docker (2)
      • Dev Book Review (3)
        • Clean Code (1)
        • Effective Java (0)
        • Real MySQL (2)
      • SWM (1)
      • Review (6)
      • AWS (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    이분탐색
    linux
    백준
    Bandit
    우선순위 큐
    정렬
    구현
    Leviathan
    깊이우선탐색
    우선순위큐
    시뮬레이션
    코딩
    에라토스테네스의 체
    다이나믹 프로그래밍
    DFS
    DP
    wargame
    누적합
    다익스트라
    그리디
    브루트포스
    WebSecurity
    재귀
    백트래킹
    비트마스킹
    c언어
    트리
    투포인터
    그래프 이론
    BFS
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 2473번 세 용액 (C++)
상단으로

티스토리툴바