[백준] 17124번 두 개의 배열 (C++)

2025. 8. 8. 19:08·Algorithm
728x90

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

 

 

이 문제는 배열 A와 배열 B가 주어졌을때 새로운 배열 C를 만들어야하는데 이때 배열 a[i]의 값과 가장 가까운 B의 배열요소를 찾아서 만들어야 하는 문제이다. 이때 A와 B의 배열 크기가 10^6이기 때문에

완전탐색 O(N^2)으로 풀면 시간초과가 난다.

따라서 O(N^2)이 아닌 다른 방법으로 풀어야 하는데 어차피 배열 a[i]의 값에 가장 인접해야 하기 때문에

배열 B의 값을 정렬하여 이분탐색을 사용하여 가장 차이가 작으며 작은 수를 찾으면 된다.

 

그렇게 된다면 시간복잡도는 O(N log M)이 되어 1초 안에 통과할 수 있다.

 

 

 

정답 코드

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

struct coordinate {
    int x;
    int y;
};

int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1};
int dy[] = {0, 1, 0, -1, -1, 1, -1, 1};
int T, N, M;
vector<int> arr1;
vector<int> arr2;

void solve() {
    sort(arr2.begin(), arr2.end());

    ll result = 0;

    for(int i = 0; i < N; i++) {
        int start = 0;
        int end = M-1;
        int tmp = MAX;		// 차이 값 초기엔 무한대로 두어 작게 update
        int res = 0;
        int stand = arr1[i];
        
        while(start <= end) {
            int mid = (start + end) / 2;

            int val = arr2[mid];

            int vals = abs(stand - val);		// 차이값 계산

            if(vals < tmp) {
                tmp = vals;
                res = val;
            }
            else if(vals == tmp) {				// 차이가 같은 경우 작은것으로 update
                if(res > val) res = val;
            }

            if(vals == 0) break;

            if(stand > val) {
                start = mid+1;
            }
            else {
                end = mid-1;
            }

        }
        result += res;
    }

    cout << result << endl;
}

void input() {
    cin >> T;

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

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

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

        solve();

        arr1.clear();
        arr2.clear();
    }
}

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

    input();
}

 

 

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

'Algorithm' 카테고리의 다른 글

[백준] 1726번 로봇 (C++)  (0) 2025.08.10
[백준] 13901번 로봇 (C++)  (0) 2025.08.09
[백준] 17141번 연구소 2 (C++)  (0) 2025.08.07
[백준] 2473번 세 용액 (C++)  (0) 2025.08.06
[백준] 12849번 본대 산책 (C++)  (0) 2025.08.05
'Algorithm' 카테고리의 다른 글
  • [백준] 1726번 로봇 (C++)
  • [백준] 13901번 로봇 (C++)
  • [백준] 17141번 연구소 2 (C++)
  • [백준] 2473번 세 용액 (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
    다익스트라
    DFS
    Bandit
    linux
    Leviathan
    백트래킹
    에라토스테네스의 체
    백준
    재귀
    우선순위큐
    그래프 이론
    c언어
    구현
    투포인터
    DP
    브루트포스
    BFS
    누적합
    트리
    깊이우선탐색
    이분탐색
    wargame
    시뮬레이션
    우선순위 큐
    비트마스킹
    그리디
    다이나믹 프로그래밍
    코딩
  • 최근 댓글

  • 최근 글

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

티스토리툴바