[백준] 9024번 두 수의 합 (C++)

2025. 8. 4. 19:18·Algorithm
728x90

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

 

 

정수인 요소 값들이 주어졌을때 2개의 요소를 선택하여 합이 K와 가까운 조합의 개수를 출력하는 문제이다.

 

요소의 개수가 100만이기 때문에 O(N^2)으로는 풀 수 없다 따라서 O(N)으로 풀 수 있는 방법을 찾아야 한다.

 

그렇기에 요소들의 크기가 서로 다르기 때문에 정렬하여 투 포인터 알고리즘을 사용하여 조합을 찾아보았다.

 

 

투포인터 알고리즘을 사용할때 left, right 포인터를 지정해야되는데 이때 음수의 값이 있기에 오른쪽 포인터는 맨 우측으로 잡으며 안쪽으로 좁혀 나갔다.

 

음수가 있고 K값에 근접해야하기 때문에 K값과 차이를 절댓값을 사용하여 갱신해 주었다. 

K값과 두 포인터들의 합의 차이의 절댓값이 0이랑 근접해야 가깝기 때문이다.

 

정답코드

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

int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
int T, N, K;
vector<int> v;

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

    int left = 0;
    int right = N-1;
    int cnt = 0;

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

        if(val == K) left++, right--;
        else if(val > K) right--;
        else if(val < K) left++;

        int vals = abs(K - val);

        if(vals == minval) cnt++;

        if(minval > vals) {
            cnt = 1;
            minval = vals;
        }
    }

    cout << cnt << endl;
}

void input() {
    cin >> T;

    while(T--) {
        cin >> N >> K;

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

        solve();

        v.clear();
    }
}

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

    input();
}

 

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

'Algorithm' 카테고리의 다른 글

[백준] 2473번 세 용액 (C++)  (0) 2025.08.06
[백준] 12849번 본대 산책 (C++)  (0) 2025.08.05
[백준] 25193번 곰곰이의 식단 관리 (C++)  (0) 2025.08.03
[백준] 3987번 보이저 1호 (C++)  (0) 2025.08.02
[백준] 20007번 떡 돌리기 (C++)  (0) 2025.08.01
'Algorithm' 카테고리의 다른 글
  • [백준] 2473번 세 용액 (C++)
  • [백준] 12849번 본대 산책 (C++)
  • [백준] 25193번 곰곰이의 식단 관리 (C++)
  • [백준] 3987번 보이저 1호 (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)
  • 블로그 메뉴

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

  • 공지사항

  • 인기 글

  • 태그

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

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.6
쿨쿨.
[백준] 9024번 두 수의 합 (C++)
상단으로

티스토리툴바