b1450. ๋ƒ…์ƒ‰๋ฌธ์ œ

2025. 4. 10. 14:26ยทAlgorithm & Data Structures/BOJ

 

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

 

 

 

๐Ÿ“Œ ์ž๋ฐ”(Java)๋กœ ํ‘ธ๋Š” ๋ถ€๋ถ„ ์ˆ˜์—ด์˜ ํ•ฉ ๋ฌธ์ œ - ๋ฐฑ์ค€ 1450 ๐ŸŽ’

 

๐Ÿ”Ž ๋ฌธ์ œ ๊ฐœ์š”

 

๋ฐฑ์ค€ 1450๋ฒˆ - ๋ƒ…์ƒ‰ ๋ฌธ์ œ๋Š”

์ตœ๋Œ€ N = 30๊ฐœ์˜ ๋ฌผ๊ฑด์ด ์ฃผ์–ด์งˆ ๋•Œ,

๊ฐ ๋ฌผ๊ฑด์˜ ๋ฌด๊ฒŒ๋ฅผ ๋”ํ•ด ์ดํ•ฉ์ด C ์ดํ•˜์ธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

 

  • 1 ≤ N ≤ 30, 1 ≤ C ≤ 1e9
  • ๋ฌด์ž‘์ • ๋ชจ๋“  ์กฐํ•ฉ์„ ๋Œ๋ฆฌ๋ฉด 2³โฐ ≈ 10์–ต ๊ฐœ, ์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐœ์ƒโŒ
  • โžก ๊ทธ๋ž˜์„œ “Meet in the Middle(์ค‘๊ฐ„์—์„œ ๋งŒ๋‚˜๊ธฐ)” ์ „๋žต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

 


๐Ÿ›  ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ ‘๊ทผ ๋ฐฉ์‹: Meet in the Middle

 

 

โœ๏ธ ํ•ต์‹ฌ ์ „๋žต

 

  1. ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„๊ณ  ๊ฐ๊ฐ ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„ํ•ฉ์˜ ์กฐํ•ฉ์„ ๋ชจ๋‘ ๊ตฌํ•จ
  2. ํ•œ ์ชฝ ๋ฐฐ์—ด์˜ ์กฐํ•ฉ์„ ๊ธฐ์ค€์œผ๋กœ, ๋‚˜๋จธ์ง€์—์„œ ๋”ํ•ด๋„ C ์ดํ•˜๊ฐ€ ๋˜๋Š” ์กฐํ•ฉ ๊ฐœ์ˆ˜๋ฅผ ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์„ธ๊ธฐ

 

๊ฒฐ๊ตญ O(2^(N/2) * log(2^(N/2)) ≈ 2^15 * 15 ≈ ์ˆ˜์‹ญ๋งŒ ์—ฐ์‚ฐ์œผ๋กœ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ

 


๐Ÿ”น Java ์ฝ”๋“œ ์„ค๋ช…

sumCombination(0, N/2, left, 0);
sumCombination(N/2, N, right, 0);

โœ” ์ž…๋ ฅ ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆ„์–ด, ๊ฐ๊ฐ ๋ชจ๋“  ์กฐํ•ฉ์˜ ํ•ฉ์„ ๋ฆฌ์ŠคํŠธ์— ์ €์žฅ

โœ” ์˜ˆ: [1,2,3] → ๊ฐ€๋Šฅํ•œ ๋ถ€๋ถ„ํ•ฉ: 0, 1, 2, 3, 1+2, 2+3, ...

 

private static void sumCombination(int start, int end, ArrayList<Long> list, long sum) {
    if(end == start){
        if(sum <= C) list.add(sum);
        return;
    }
    sumCombination(start + 1, end, list, sum);
    sumCombination(start + 1, end, list, sum + weights[start]);
}

โœ” ๋ถ€๋ถ„ ์กฐํ•ฉ์„ DFS ๋ฐฉ์‹์œผ๋กœ ํƒ์ƒ‰

โœ” ๊ฐ ๋ถ„ํ• ๋œ ๊ตฌ๊ฐ„์— ๋Œ€ํ•ด ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋ถ€๋ถ„ํ•ฉ์„ ๊ธฐ๋ก

 

Collections.sort(right);

โœ” ์˜ค๋ฅธ์ชฝ ๋ฆฌ์ŠคํŠธ๋Š” ์ด์ง„ ํƒ์ƒ‰์„ ์œ„ํ•ด ์ •๋ ฌ

 


for (long sumL : left) {
    if (sumL > C) continue;
    long remain = C - sumL;
    int idx = upperBound(right, remain);
    count += idx;
}

โœ” ์™ผ์ชฝ ์กฐํ•ฉ์„ ๊ธฐ์ค€์œผ๋กœ,

โœ” ์˜ค๋ฅธ์ชฝ์—์„œ sumL + sumR ≤ C๋ฅผ ๋งŒ์กฑํ•˜๋Š” sumR ๊ฐœ์ˆ˜๋ฅผ upperBound()๋กœ ๊ตฌํ•จ

 

 

๐Ÿ“Œ upperBound ํ•จ์ˆ˜

private static int upperBound(ArrayList<Long> list, long remain) {
    int leftIdx = 0, rightIdx = list.size();
    while(leftIdx < rightIdx){
        int mid = (leftIdx + rightIdx) / 2;
        if(list.get(mid) <= remain){
            leftIdx = mid + 1;
        } else rightIdx = mid;
    }
    return leftIdx;
}

โœ” list[i] ≤ remain์„ ๋งŒ์กฑํ•˜๋Š” ์ตœ๋Œ€ ์ธ๋ฑ์Šค๋ฅผ ์ฐพ๋Š” upper bound

โœ” leftIdx๊ฐ€ ๊ณง ๊ฐ€๋Šฅํ•œ ์ˆ˜์˜ ๊ฐœ์ˆ˜๊ฐ€ ๋จ

 


๐Ÿ† ์ •๋ฆฌ

 

 

โœ… ํ•ต์‹ฌ ํฌ์ธํŠธ

 

  • N์ด ์ž‘์ง€๋งŒ, ๋ถ€๋ถ„์ง‘ํ•ฉ์ด ๋„ˆ๋ฌด ๋งŽ์„ ๋•Œ๋Š” → Meet in the Middle ์ „๋žต
  • ์ „์ฒด ์กฐํ•ฉ์„ ๋‚˜๋ˆ ์„œ ๊ฐ๊ฐ ๋ถ€๋ถ„ํ•ฉ์„ ์ €์žฅํ•˜๊ณ , ์ด์ง„ ํƒ์ƒ‰์œผ๋กœ ์นด์šดํŠธ
  • upperBound๋ฅผ ํ™œ์šฉํ•œ ๋น ๋ฅธ ๋ฒ”์œ„ ๋‚ด ์กฐํ•ฉ ๊ฐœ์ˆ˜ ๊ณ„์‚ฐ
 

 

'Algorithm & Data Structures > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

b14002. ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด 4  (0) 2025.04.15
b12852. 1๋กœ ๋งŒ๋“ค๊ธฐ 2  (0) 2025.04.14
b3665. ์ตœ์ข…์ˆœ์œ„  (0) 2025.04.09
b.2696 ์ค‘์•™๊ฐ’ ๊ตฌํ•˜๊ธฐ  (0) 2025.04.07
b.2075 N๋ฒˆ์งธ ํฐ ์ˆ˜  (0) 2025.04.04
'Algorithm & Data Structures/BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • b14002. ๊ฐ€์žฅ ๊ธด ์ฆ๊ฐ€ํ•˜๋Š” ๋ถ€๋ถ„์ˆ˜์—ด 4
  • b12852. 1๋กœ ๋งŒ๋“ค๊ธฐ 2
  • b3665. ์ตœ์ข…์ˆœ์œ„
  • b.2696 ์ค‘์•™๊ฐ’ ๊ตฌํ•˜๊ธฐ
Geisha
Geisha
๊ฐœ๋ฐœ ์ผ๊ธฐ
  • Geisha
    Geisha
    Geisha
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (316) N
      • Algorithm & Data Structures (238) N
        • BOJ (96) N
        • SWEA (1)
        • Programers (137)
        • Data Structures (3)
      • DB (25)
        • SQL (19)
        • RDBMS (2)
      • Java (1)
        • Class (1)
      • Spring (5)
        • Spring MVC (1)
        • Annotations (1)
      • CS (36)
        • ์šด์˜์ฒด์ œ (13)
        • ๋„คํŠธ์›Œํฌ (5)
      • Tool (6)
        • Git (5)
        • AWS (1)
      • Project (1)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    unionfind
    programmers
    ๋‹ค์ต์ŠคํŠธ๋ผ
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    Dijkstra
    ์œ ๋‹ˆ์˜จํŒŒ์ธ๋“œ
    DynamicProgramming
    ํˆฌํฌ์ธํ„ฐ
    SQL
    dfs
    algorithm
    PriorityQueue
    ์Šคํƒ
    dp
    Stack
    Java
    ๊ฒฝ๋กœ์••์ถ•
    ๊ณจ๋“œ
    ํ›„์œ„์ˆœํšŒ
    ๊ตฌํ˜„
    ์ด๋ถ„ํƒ์ƒ‰
    ์ „์œ„์ˆœํšŒ
    ๋™์ ๊ณ„ํš๋ฒ•
    Union-Find
    ๋ฐฑํŠธ๋ž˜ํ‚น
    binarySearch
    BFS
    ๋ฐฑ์ค€
    ์•Œ๊ณ ๋ฆฌ์ฆ˜
    baekjoon
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.0
Geisha
b1450. ๋ƒ…์ƒ‰๋ฌธ์ œ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”