Skip to content

Conversation

@kangrae-jo
Copy link
Collaborator

@kangrae-jo kangrae-jo commented Aug 18, 2025

๐Ÿ”— ๋ฌธ์ œ ๋งํฌ

[์นด๋“œ ๊ฒŒ์ž„]

โœ”๏ธ ์†Œ์š”๋œ ์‹œ๊ฐ„

55m
(๋น ๋ฅด๊ฒŒ ๋‹ต ๋ดค์Šต๋‹ˆ๋‹ค.)

โœจ ์ˆ˜๋„ ์ฝ”๋“œ

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ์˜ ์‘์šฉ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋“ค๊ณ ์™€๋ดค์Šต๋‹ˆ๋‹ค.
์ €ํฌ๊ฐ€ ์ด์ „์— ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ ๋ฌธ์ œ๋ฅผ ๋‹ค๋ค˜๋Š”์ง€๋Š” ๊ธฐ์–ต์ด ์•ˆ๋‚˜๋Š”๋ฐ, ์ฒด๊ฐ์ƒ ๊ฑฐ์˜ ์ฒ˜์Œ ๋งŒ๋‚˜๋ณด๋Š” ์œ ํ˜•์ธ ๊ฒƒ ๊ฐ™๋„ค์š”.

์ €๋Š” ์ด ๋ฌธ์ œ๋ฅผ ์ฝ๊ณ  ์ฒ˜์Œ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘๊ทผ ํ–ˆ์–ด์š”.

1. blues ์ •๋ ฌ
2. upper_bound๋กœ red๋ฅผ ๋„˜๋Š” ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜ ์ฐพ๊ธฐ
3. erase๋กœ ํ•ด๋‹น ์ธ๋ฑ์Šค ์ง€์šฐ๊ธฐ

์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋‚  ๊ฒƒ ๊ฐ™์•˜์ง€๋งŒ ๊ตฌํ˜„์ด ์‰ฌ์šด ํŽธ์ด๋ผ ๋น ๋ฅด๊ฒŒ ์ œ์ถœ์„ ํ•œ ๋ฒˆ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
์—ญ์‹œ๋‚˜ ์‹œ๊ฐ„์ดˆ๊ณผ๋”๋ผ๊ตฌ์š”.

upper_bound ๋Š” ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ O(log M) ์ด์ง€๋งŒ, erase๊ฐ€ O(M) ์ด๊ธฐ ๋•Œ๋ฌธ์ด์—์š”. (๋ฐฐ์—ด ๋’ค์—๊ฒƒ์„ ๋‹ค ๋‹น๊ฒจ์˜ค๊ธฐ ๋•Œ๋ฌธ)
๊ทธ๋ฆฌ๊ณ  ์งˆ์˜๊ฐ€ ์ตœ๋Œ€ K๊ฐœ ์žˆ์œผ๋‹ˆ.... O(K * (log M + M)) ์ด๋„ค์š”.
M์ตœ๋Œ€๊ฐ€ 4,000,000 ์ด๊ณ  K ์ตœ๋Œ€๊ฐ€ 10,000์ด๋‹ˆ ์•ฝ 4 * 10^10์ด๋„ค์š”.. (๋กœ๊ทธ ๋ฌด์‹œํ•˜๊ณ  ๊ณ„์‚ฐ)

์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ฅผ ํ™œ์šฉํ•˜๋ฉด ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์›๋ž˜ ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋Š” ์„œ๋กœ์†Œ์˜ ์ง‘ํ•ฉ์„ ๊ด€๋ฆฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๊ณ  ํ•˜๋Š”๋ฐ์š”, ์—ฌ๊ธฐ์„œ ํ™œ์šฉ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ ์ธ๋ฑ์Šค๊ฐ€ ์ž๊ธฐ์ž์‹ ์ด๊ณ , ๊ฐ’์ด ๋ถ€๋ชจ(์—ฐ๊ฒฐ)์ธ ๋ฐฐ์—ดํ˜• ์ž๋ฃŒ๊ตฌ์กฐ๋กœ 'ํ˜„์žฌ ์„ ํƒํ•œ ์นด๋“œ๋ณด๋‹ค ๋ฐ”๋กœ ์œ„'์˜ ์นด๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์–ด์š”.
๋ง์ด ์ข€ ์–ด๋ ต๋„ค์š”..

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-08-18 13 50 24

์ด์ง„ ํƒ์ƒ‰์œผ๋กœ blues์—์„œ red๋ณด๋‹ค ํฐ ์นด๋“œ๋ฅผ ๊ณ ๋ฅด๊ณ ,
๊ทธ ์นด๋“œ๋ฅผ ์ฐพ๊ณ , ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด์ฃ . (๋ถ€๋ชจ ๋…ธ๋“œ์™€ ์ด์–ด์คŒ์œผ๋กœ์จ ํ‘œ์‹œ๊ฐ€ ๊ฐ€๋Šฅ)

์ฐจ๊ทผ์ฐจ๊ทผ ํ๋ฆ„์„ ๋”ฐ๋ผ๊ฐ€๋ณด์‹œ๋ฉด ์ดํ•ด๊ฐ€ ๋  ๊ฒ๋‹ˆ๋‹ค.
์ƒ๊ฐ์„ ์ž˜ ํ•ด๋†“๋Š”๋‹ค๋ฉด ๊ตฌํ˜„์„ ๊ฝค๋‚˜ ์‰ฌ์šธ ๊ฒƒ ๊ฐ™๋„ค์š”.

์ฐธ๊ณ ๋กœ ์ €๊ธฐ์„œ red๊ฐ€ 1์„ ํ•œ ๋ฒˆ ๋” ๋‚ธ๋‹ค๋ฉด blue๋Š” ๋ญ˜ ๋‚ด์•ผํ• ๊นŒ์š”??
...

แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2025-08-18 14 00 15

์ด๋ ‡๊ฒŒ p[4] = 4 ๊นŒ์ง€ ํƒ€๊ณ  ์˜ฌ๋ผ๊ฐ„ ๋‹ค์Œ ,
blues[4]์ธ 7์„ ์ถœ๋ ฅํ•˜๊ณ ,
p[4] = 5 ๋กœ ๋ฐ”๊พธ์–ด ์ฃผ๊ฒŒ ๋  ๊ฒƒ ์ž…๋‹ˆ๋‹ค.

๐Ÿ“š ์ƒˆ๋กญ๊ฒŒ ์•Œ๊ฒŒ๋œ ๋‚ด์šฉ

์˜ค๋žœ๋งŒ์— c++์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
numeric์— ์žˆ๋Š” iota() ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค.

iota(begin, end, startValue) ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ํ•ด๋‹น ๋ฒกํ„ฐ์˜ ์‹œ์ž‘ ๋ถ€ํ„ฐ ๋๊นŒ์ง€ startValue๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋Š” ๊ฐ’์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์–ด์š”.

startValue == 0์ด๋ผ๋ฉด ->> ์ธ๋ฑ์Šค = ๊ฐ’์ด ๋˜๊ฒ ์ฃ .
๊ทผ๋ฐ iota๋ฅผ ๋ชฐ๋ผ๋„ for(int i = 0; i < n; i++) p[i] = i; ์ด๋Ÿฌ๋ฉด ๋  ๊ฒƒ ๊ฐ™๋„ค์š”.

Copy link
Member

@9kyo-hwang 9kyo-hwang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์•„ C++์˜ set(Java์˜ TreeSet) ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์Šค๊ทผํ•˜๊ฒŒ ํ’€๋ฆฌ๊ฒ ๋‹ค~ ํ–ˆ๋Š”๋ฐ Set์˜ ๋‚ด๋ถ€ ๊ตฌํ˜„์ด ๋งค์šฐ ๋А๋ ค์„œ ํ†ต๊ณผ๊ฐ€ ์•ˆ๋˜๋„ค์š” ใ…Ž... ๋‚ ๋จน ์‹คํŒจ!

Set ์ฝ”๋“œ

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int N, M, K; cin >> N >> M >> K;
    
    vector<int> cardList(M);
    for(int& card : cardList) {
        cin >> card;
    }
    
    set<int> cards(cardList.begin(), cardList.end());
    
    while(K--) {
        int card; cin >> card;
        auto it = cards.upper_bound(card);
        cout << *it << endl;
        cards.erase(it);
    }

    return 0;
}

๊ฒฐ๊ตญ ๋ฐฐ์—ด์„ ์ •๋ ฌํ•˜๊ณ  ์ด์ง„ํƒ์ƒ‰์„ ๋Œ๋ ค์•ผ ํ•˜๋Š”๋ฐ, ์ฒ ์ˆ˜๊ฐ€ ๋‚ธ ์นด๋“œ๋ณด๋‹ค ํฐ ์นด๋“œ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฒƒ(upper_bound)์„ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์€ ์ข‹์€๋ฐ ์‚ฌ์šฉ๋œ ์นด๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š” ์ง€๊ฐ€ ๊ณ ๋ฏผ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์ด ์•ˆ์žกํ˜€์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ดค๋Š”๋ฐ, Disjoint Set์ด ์žˆ๊ธธ๋ž˜ "์ด๊ฒŒ ๋Œ€์ฒด ์–ด๋–ป๊ฒŒ ์“ฐ๋ž€ ๊ฑฐ์ง€...?" ์‹ถ์–ด์„œ ํ•œ์ฐธ ๋™๋™ ๋Œ”๋„ค์š”. ๊ทธ๋ž˜๋„ ์•ฝ๊ฐ„ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ํ•ด๋ณด๋‹ˆ๊นŒ ๊ฐ์„ ์žก์•˜์Šต๋‹ˆ๋‹ค.

์ฃผ์–ด์ง„ ์นด๋“œ๋ฅผ ์ •๋ ฌํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

2 3 4 5 7 8 9

์ฒซ ๋ฒˆ์งธ๋กœ ์นด๋“œ 4๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๋ณด๋‹ค ํฐ ์นด๋“œ์ธ [5 7 8 9] ์ค‘ ๊ฐ€์žฅ ์ž‘์€ 5๋ฅผ ๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 5๋ฅผ ๋‚ด๊ณ , 5 ๋ฐ”๋กœ ๋‹ค์Œ์œผ๋กœ ํฐ ์นด๋“œ์™€ ๋ฌถ์Šต๋‹ˆ๋‹ค

2 3 4 7 8 9
      5

๋‹ค์Œ์œผ๋กœ ์นด๋“œ 1์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 2๋ฅผ ๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. 2๋ฅผ ๋‚ด๊ณ , 2 ๋ฐ”๋กœ ๋‹ค์Œ์œผ๋กœ ํฐ ์นด๋“œ 3๊ณผ ๋ฌถ์Šต๋‹ˆ๋‹ค.

3 4 7 8 9
2   5

๋‹ค์‹œ ์นด๋“œ 1์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 3์„ ๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. FInd๋ฅผ ํ†ตํ•ด ์ตœ์ƒ๋‹จ ๋ถ€๋ชจ์ธ 3์„ ๋‚ด๊ณ , 3 ๋ฐ”๋กœ ๋‹ค์Œ์œผ๋กœ ํฐ ์นด๋“œ 4์™€ ๋ฌถ์Šต๋‹ˆ๋‹ค.

4 7 8 9
3 5
2

๋‹ค์Œ์€ ์นด๋“œ 3์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 4๋ฅผ ๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. FInd๋ฅผ ํ†ตํ•ด 4๋ฅด ๋‚ด๊ณ , 4 ๋ฐ”๋กœ ๋‹ค์Œ์œผ๋กœ ํฐ ์นด๋“œ 7๊ณผ ๋ฌถ์Šต๋‹ˆ๋‹ค.

7 8 9
5
4
3
2

๋งˆ์ง€๋ง‰์œผ๋กœ ์นด๋“œ 8์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 9๋ฅผ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. 9๋Š” ์ฃผ์–ด์ง„ ์นด๋“œ์˜ ๋งˆ์ง€๋ง‰ ์นด๋“œ์ด๋ฏ€๋กœ, ๋ณ„๋„๋กœ Union์„ ์ง„ํ–‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋กœ์ง์„ ํ†ตํ•ด, ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์นด๋“œ ์ค‘ upper_bound ์นด๋“œ์˜ ๋ฐ”๋กœ ๋‹ค์Œ ์นด๋“œ๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ฝ‘์•„๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int N, M, K; cin >> N >> M >> K;
    
    vector<int> cards(M);
    for(int& card : cards) {
        cin >> card;
    }
    
    sort(cards.begin(), cards.end());
    
    vector<int> parents(M + 1);
    iota(parents.begin(), parents.end(), 0);
    
    auto Find = [&](int x) {
        while(x != parents[x]) {
            parents[x] = parents[parents[x]];
            x = parents[x];
        }
        
        return parents[x];
    };
    
    auto Union = [&](int u, int v) {
        u = Find(u);
        v = Find(v);
        
        if(u == v) {
            return false;
        }
        
        parents[u] = v;
        return true;
    };

    while(K--) {
        int card; cin >> card;
        
        int index = Find(upper_bound(cards.begin(), cards.end(), card) - cards.begin());
        cout << cards[index] << "\n";
        
        if(index + 1 < M) {
            Union(index, index + 1);
        }
    }

    return 0;
}

์‚ฌ์‹ค ์ธ๋ฑ์Šค๋ฅผ ๊ธฐ์ค€์œผ๋กœ Union-Find ํ•ด์•ผ ํ•˜๋Š”๋ฐ, ๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ํ•ด๋ฒ„๋ฆฐ ๊ฑด ์•ˆ ๋น„๋ฐ€... ใ…Ž

Copy link
Collaborator

@g0rnn g0rnn left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

์ •๋ง ์–ด๋ ต๊ตฐ์š”.. ๊ตฌ๊ธ€์— ๊ด€๋ จ ๋ ˆํผ๋Ÿฐ์Šค๋ฅผ ๊ฒ€์ƒ‰ํ•ด๋ณด๋‹ˆ ์˜ˆ์ „์—” ํ”Œ๋ ˆํ‹ฐ๋„˜ ๋ฌธ์ œ์˜€๋‚˜๋ด…๋‹ˆ๋‹ค ํ—ˆํ—ˆ

์ฒ˜์Œ์—” ์‚ฌ์‹ค PriorityQueue๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋‚ ๋จน ํ•˜๋ ค ํ–ˆ์œผ๋‚˜ 57ํผ์—์„œ ์‹คํŒจํ•˜๋”๊ตฐ์š”. ์ฒ ์ˆ˜์˜ ์นด๋“œ๋ณด๋‹ค ํฐ ์นด๋“œ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์นด๋“œ๋งŒ์„ ์ฐพ์œผ๋ ค๋Š” ์‹ค์ˆ˜ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Fail 57%
import java.util.*;
import java.io.*;

public class Main {
    static int n, m, k;
    static int[] answer;
    static PriorityQueue<Integer> minsu = new PriorityQueue<>();
    static PriorityQueue<int[]> chulsu = new PriorityQueue<>((a, b) -> {
        if (a[0] == b[0]) return Integer.compare(a[1], b[1]);
        return Integer.compare(a[0], b[0]);
    });

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < m; i++) {
            minsu.add(Integer.parseInt(st.nextToken()));
        }

        st = new StringTokenizer(br.readLine());
        for (int i = 0; i < k; i++) {
            int card = Integer.parseInt(st.nextToken());
            chulsu.add(new int[]{card, i});
        }
        br.close();

        answer = new int[k];
        while (!chulsu.isEmpty()) {
            int blue = minsu.poll();
            int red = chulsu.peek()[0];
            int index = chulsu.poll()[1];

            while (red >= blue) { // ๋ฏผ์ˆ˜๊ฐ€ ๋‚ผ ์นด๋“œ๊ฐ€ ์ฒ ์ˆ˜๋ณด๋‹ค ๋” ์ปค์งˆ ๋•Œ๊นŒ์ง€ ์นด๋“œ๋ฅผ ์ฐพ์Œ
                blue = minsu.poll();
            }

            answer[index] = blue;
        }

        for (int i = 0; i < k; i++) {
            System.out.println(answer[i]);
        }
    }
}

์ด๊ฑด ๋‹ค์Œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—์„œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋ฏผ์ˆ˜๊ฐ€ ๋‚ผ ์นด๋“œ๊ฐ€ ์ฒ ์ˆ˜๊ฐ€ ๋‚ธ ์นด๋“œ๋ณด๋‹ค ์ „๋ถ€ ํฌ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

100 4 3
30 40 50 60
29 1 24
out:
30
40
50

๊ทธ๋ž˜์„œ ํ’€์ด๋ฅผ ๋ดค์Šต๋‹ˆ๋‹ค. ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ผ๋Š” ์•ฝ๊ฐ„ ์ƒ์†Œํ•œ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€์Šต๋‹ˆ๋‹ค. ์˜ˆ์ „์— ๋ˆ„๊ฐ€ ์นœ๊ตฌ ์ฐพ๋Š” ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ ธ์—ˆ๋Š”๋ฐ ๊ทธ ๋•Œ ์‚ฌ์šฉํ–ˆ์—ˆ๋˜๊ฑฐ ๊ฐ™์•„์š”. ๋„ˆ๋ฌด ์˜›๋‚ ์ด๋ผ ๊ธฐ์–ต์ด ์ž˜ ์•ˆ๋‚˜์ง€๋งŒ..

๊ทผ๋ฐ ๋„ˆ๋ฌด ์™€๋‹ฟ์ง€ ์•Š์•„์„œ ์ข€ ๊ณ ๋ฏผํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ž€ ์›๋ž˜ ๋‘ ์ง‘ํ•ฉ์ด ์„œ๋กœ์†Œ์ธ์ง€๋ฅผ ํŒ๋ณ„ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‘ ๋„คํŠธ์›Œํฌ ๊ฐ„ ์—ฐ๊ฒฐ์ง€์ ์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ ์‚ฌ์šฉ๋˜์ฃ .

ํ•˜์ง€๋งŒ ์ด ๋ฌธ์ œ๋Š” ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ฅผ ํ’€ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐœ๋…์„ ์•ฝ๊ฐ„ ์‘์šฉํ•ด์•ผ ํ•˜๋„ค์š”. ์ง‘ํ•ฉ์„ ๊ตฌ์„ฑํ•  ๋•Œ ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ์„ ์ฆ๋ช…ํ•˜๋Š” DSU๋Š” ์ž์‹ ์˜ ๋ถ€๋ชจ ๋…ธ๋“œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๋ฐ ์ด๊ฑธ ๋”ฐ๋ผ๋‹ค๊ฐ€ ๋ณด๋ฉด ๊ฐ ์ง‘ํ•ฉ์˜ ๋Œ€ํ‘œ ๋…ธ๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ์ด ๋•Œ ๋Œ€ํ‘œ๋…ธ๋“œ๋ฅผ ์•„์ง ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๋‚˜๋ณด๋‹ค ํฐ ๋…€์„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

find๋ผ๋Š” ๋ฉ”์„œ๋“œ๋กœ๋Š” ์ด ๋Œ€ํ‘œ๋…ธ๋“œ๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ด๊ณ , use๋Š” ํ•ด๋‹น ์ธ๋ฑ์Šค๋Š” ์‚ฌ์šฉํ–ˆ์œผ๋‹ˆ ๋Œ€ํ‘œ๋…ธ๋“œ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ฉ”์„œ๋“œ์ฃ . (๋‹จ, DSU๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ๋• ์ž๊ธฐ ์ž์‹ ์„ ๋Œ€ํ‘œ๋…ธ๋“œ๋กœ ์„ค์ •)

์žฌ๋ฏธ๋‚œ ๋ฌธ์ œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋„

package beakjoon;

import java.util.*;
import java.io.*;

public class Sol16566 {
    static int n, m, k;
    static int[] cards;
    static int[] parent;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());
        k = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        cards = new int[m];
        for (int i = 0; i < m; i++) {
            cards[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(cards);

        // DSU: ์„œ๋กœ ๊ฒน์น˜์ง€ ์•Š๋Š” ์ง‘ํ•ฉ
        parent = new int[m + 1];
        for (int i = 0; i <= m ; i++) {
            parent[i] = i;
        }

        st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();
        while(st.hasMoreTokens()) {
            int x = Integer.parseInt(st.nextToken());

            int idx = upperBound(cards, x);
            int p = find(idx);
            sb.append(cards[p]).append('\n');
            use(p);
        }
        System.out.println(sb);
    }

    private static int upperBound(int[] cards, int x) {
        int l = 0, r = cards.length;
        while (l < r) {
            int mid = (l + r) / 2;
            if (cards[mid] <= x) l = mid + 1;
            else r = mid;
        }
        return l;
    }

    private static int find(int x) {
        if (parent[x] == x) return x;
        return parent[x] = find(parent[x]);
    }

    private static void use(int idx) {
        parent[idx] = find(idx + 1);
    }
}

Copy link
Collaborator

@kokeunho kokeunho left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ํ’€์ด๋ฒ•์€ ์‰ฝ๊ฒŒ ๋– ์˜ฌ๋ฆด ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทผ๋ฐ upperBound, lowerBound ๊ตฌํ˜„์ด ์•„์ง ๋ฏธ์ˆ™ํ•ด์„œ
๊ตฌํ˜„์€ ์ข€ ์ฐธ๊ณ ๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ œ๊ฐ€ ๋– ์˜ฌ๋ฆฐ ํ’€์ด๋ฒ•์€
upperBound์œผ๋กœ ๋ฏผ์ˆ˜๋Š” ๋ฑ์—์„œ target๋ณด๋‹ค ํฐ ์ˆ˜ ์ค‘ ์ฒซ ๋ฒˆ์งธ ์นด๋“œ๋ฅผ ๋ƒ…๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  M์ด ์ตœ๋Œ€ 4,000,000, K๋Š” ์ตœ๋Œ€ 10,000๋ผ ์‚ฌ์šฉํ•œ ์นด๋“œ๋ฅผ ๋ฐฐ์—ด์—์„œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์€ ๋ถ€๋‹ด์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ•˜์ง€๋งŒ ์žฌํ™œ์šฉ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•˜๋‹ˆ ์‚ฌ์šฉํ–ˆ๋‹ค๋Š” ํ‘œ์‹œ๋ฅผ visited[]๋กœ ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
(๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰์—์„œ ํ•˜๋„ visited๋กœ ์‚ฌ์šฉํ•˜๋‹ˆ ๋ฐฐ์—ด๋ช…์„ ์Šต๊ด€๋Œ€๋กœ ์ ์—ˆ๋„ค์š”.)

๊ธฐ์กด์˜ upperBound ์ฝ”๋“œ์—์„œ ๊ฒฐ์ •๋œ ์ธ๋ฑ์Šค์˜ ์นด๋“œ๊ฐ€ ์ด๋ฏธ ์‚ฌ์šฉ๋œ ์นด๋“œ๋ผ๋ฉด
๊ทธ ๋‹ค์Œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์นด๋“œ๋“ค ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜์˜ ์นด๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ˆ˜์ •ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฐ ์œ ํ˜•์˜ ํ’€์ด๋ฅผ ์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ๋ผ๊ณ  ํ•˜๋Š”๊ตฐ์š”.
๊ฐ•๋ž˜๋‹˜์˜ PR ์ฐธ๊ณ ํ•ด์„œ ๋” ๊ณต๋ถ€ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

์ˆ˜๊ณ ํ•˜์…จ์Šต๋‹ˆ๋‹ค!

(๋ฆฌ๋ทฐ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ณด๋‹ˆ ๋‹ค๋ฅธ ๋ถ„๋“ค์€ ๋งŽ์ด ๊ณ ๋ฏผํ•œ ๊ฒƒ ๊ฐ™๋„ค์š”.
์ €๋Š” ๋‹จ์ˆœํ•˜๊ฒŒ ๋– ์˜ฌ๋ฆฐ ํ’€์ด๋ฅผ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ ํ’€๋ ธ์Šต๋‹ˆ๋‹ค.
ํ˜น์‹œ ๊ทธ๋ƒฅ ์šด์ด ์ข‹์•˜๋˜ ๊ฒƒ์ผ๊นŒ์š”...? ๋ถˆ์•ˆํ•˜๋„ค์š”)

Details

import java.util.*;
import java.io.*;

public class Main {
    static int N, M, K;
    static int[] minsuDecks, cheolsuCards;
    static boolean[] visited;

    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        K = Integer.parseInt(st.nextToken());

        st = new StringTokenizer(br.readLine());
        minsuDecks = new int[M];
        for (int i = 0; i < M; i++) {
            minsuDecks[i] = Integer.parseInt(st.nextToken());
        }
        Arrays.sort(minsuDecks);

        st = new StringTokenizer(br.readLine());
        cheolsuCards = new int[K];
        for (int i = 0; i < K; i++) {
            cheolsuCards[i] = Integer.parseInt(st.nextToken());
        }

        visited = new boolean[M];
        StringBuilder sb = new StringBuilder();
        for (int card : cheolsuCards) {
            sb.append(minsuDecks[upperBound(card)]).append("\n");
        }

        System.out.print(sb);
    }

    static int upperBound(int target) {
        int left = 0, right = minsuDecks.length;

        while (left < right) {
            int mid = (left + right) / 2;
            if (minsuDecks[mid] <= target) {
                left = mid + 1;
            } else {
                right = mid;
            }
        }

        while (left < minsuDecks.length && visited[left]) {
            left++;
        }
        visited[left] = true;
        
        return left;
    }
}

@kangrae-jo
Copy link
Collaborator Author

@kokeunho ์ €๋Š” ์˜คํžˆ๋ ค ๊ทธ๋Ÿฐ ์ ‘๊ทผ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ด ๋ฌธ์ œ๋Š” ๋ฌด์Šจ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๊ณ , ์–ด๋–ค ๋กœ์ง์„ ์‚ฌ์šฉํ•˜๊ณ  ๊ทธ๋Ÿฐ๊ฑธ ์•„๋Š” ๊ฒƒ ๋ณด๋‹ค
์ง„์งœ ์ˆœ์ˆ˜ํ•œ ์ž์‹ ์˜ ํž˜์œผ๋กœ ์ •๋‹ต๊ณผ ์œ ์‚ฌํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ด๋‚ด๋Š”๊ฒŒ ๋” ์–ด๋ ต๋‹ค๊ณ  ์ƒ๊ฐํ•ด์š”.

๋ญ”๊ฐ€ visited ๋ฐฐ์—ด์„ ์‚ฌ์šฉ ํ•˜๋Š” ๊ฒƒ๊ณผ left๋ฅผ ++ ์‹œ์ผœ์„œ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ ์ค‘์— answer์ธ ๋…€์„์„ ์ฐพ๋Š” ๊ณผ์ •์ด
์œ ๋‹ˆ์˜จ ํŒŒ์ธ๋“œ์™€ ๋น„์Šทํ•˜๊ตฐ์š”.

์ €๋Š” ํ’€์ด๋Š” ๋– ์˜ค๋ฅด์ง€ ์•Š์•˜์–ด์„œ ๋ฐ”๋กœ ๋‹ต์„ ๋ดค๋˜ ๊ฒƒ ๊ฐ™๋„ค์š”. ๋ฐ˜์„ฑํ•ฉ๋‹ˆ๋‹ค!!!

๊ทธ๋Ÿฐ๋ฐ ์ตœ์•…์˜ ์ผ€์ด์Šค์—์„œ๋Š” ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋– ์•ผํ•  ๊ฒƒ๊ฐ™์€๋ฐ....
k๋ฒˆ์€ ์ตœ๋Œ€ 1๋งŒ๋ฒˆ์ด์–ด์„œ ๊ดœ์ฐฎ์€ ๊ฑธ๊นŒ์š”.

์งˆ๋ฌธ ๊ฒŒ์‹œํŒ์„ ๋ณด๋‹ˆ ๊ทผํ˜ธ๋‹˜๊ณผ ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์žˆ๋„ค์š”.

@kangrae-jo kangrae-jo merged commit 6bf70c1 into main Nov 11, 2025
@kangrae-jo kangrae-jo deleted the 33-kangrae-jo branch November 11, 2025 07:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants