둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (201)
    • BOJ (159)
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (6)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (6)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (1)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • Thread
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

BOJ/재귀

24060번: 알고리즘 수업 - 병합 정렬 1

2025. 6. 2. 18:28

24060번: 알고리즘 수업 - 병합 정렬 1

사용 언어: C++

 

풀이

Merge Sort (병합 정렬) 문제.

기본 병합 정렬 구현 문제. 핵심은 정렬이 완료된 배열이 아니라, 정렬 중 원소가 배열 A에 저장되는 순간을 추적해서,
K번째로 저장되는 값을 출력하는 것.

병합 과정에서 A[i] = tmp[t]가 실행될 때마다 저장 횟수(cnt)를 세고,
cnt == K가 되면 해당 값을 result에 저장한다.

만약 저장 횟수가 K보다 작으면 -1 출력.

#include <iostream>
using namespace std;

int A[500001], tmp[500001];
int N, K, cnt = 0, result = -1;

void merge(int p, int q, int r) {
    int i = p, j = q + 1, t = 0;
    while (i <= q && j <= r) {
        if (A[i] <= A[j]) tmp[t++] = A[i++];
        else tmp[t++] = A[j++];
    }
    while (i <= q) tmp[t++] = A[i++];
    while (j <= r) tmp[t++] = A[j++];

    i = p; t = 0;
    while (i <= r) {
        A[i++] = tmp[t++];
        cnt++;
        if (cnt == K) {
            result = A[i - 1];
            break;
        }
    }
}

void merge_sort(int p, int r) {
    if (p < r) {
        int q = (p + r) / 2;
        merge_sort(p, q);
        merge_sort(q + 1, r);
        merge(p, q, r);
    }
}

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

    cin >> N >> K;
    for (int i = 0; i < N; i++) cin >> A[i];

    merge_sort(0, N - 1);
    cout << result << '\n';
    return 0;
}
저작자표시 (새창열림)

'BOJ > 재귀' 카테고리의 다른 글

9184번: 신나는 함수 실행  (0) 2025.06.09
14956번: Philosopher’s Walk (BOJ C/C++)  (0) 2022.08.31
2448번: 별 찍기 - 11 (BOJ C/C++)  (0) 2022.08.30
2447번: 별 찍기 - 10 (BOJ C/C++)  (0) 2022.08.29
1992번: 쿼드트리 (BOJ C/C++)  (0) 2022.08.27
    'BOJ/재귀' 카테고리의 다른 글
    • 9184번: 신나는 함수 실행
    • 14956번: Philosopher’s Walk (BOJ C/C++)
    • 2448번: 별 찍기 - 11 (BOJ C/C++)
    • 2447번: 별 찍기 - 10 (BOJ C/C++)
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바