CodingTest/Java

BOJ_2343 : 기타 레슨

Soom_1n 2024. 2. 5. 13:19

πŸ‘‰ 문제링크

 

2343번: 기타 레슨

κ°•ν† λŠ” μžμ‹ μ˜ 기타 κ°•μ˜ λ™μ˜μƒμ„ λΈ”λ£¨λ ˆμ΄λ‘œ λ§Œλ“€μ–΄ νŒλ§€ν•˜λ €κ³  ν•œλ‹€. λΈ”λ£¨λ ˆμ΄μ—λŠ” 총 N개의 κ°•μ˜κ°€ λ“€μ–΄κ°€λŠ”λ°, λΈ”λ£¨λ ˆμ΄λ₯Ό λ…Ήν™”ν•  λ•Œ, κ°•μ˜μ˜ μˆœμ„œκ°€ λ°”λ€Œλ©΄ μ•ˆ λœλ‹€. μˆœμ„œκ°€ λ’€λ°”λ€ŒλŠ” κ²½

www.acmicpc.net



πŸ”Έ 문제 뢄석 πŸ”Έ

  • N개의 μ˜μƒμ„ M개의 λΈ”λ£¨λ ˆμ΄μ— λ‚˜λˆ  μ €μž₯ν•˜λ €κ³  ν•œλ‹€.
  • ν•˜λ‚˜μ˜ λΈ”λ£¨λ ˆμ΄ 크기의 μ΅œμ†Œκ°’μ„ κ΅¬ν•œλ‹€.

πŸ”Έ 문제 풀이 πŸ”Έ

  • λΈ”λ£¨λ ˆμ΄ 크기λ₯Ό 이진 νƒμƒ‰μœΌλ‘œ μ°ΎλŠ”λ‹€.
    • μ΅œμ†Œ ν¬κΈ°λŠ” N개의 μ˜μƒ 쀑 μ΅œλŒ€κ°’
    • μ΅œλŒ€ ν¬κΈ°λŠ” N개의 μ˜μƒμ˜ 총합
    • 쀑앙값을 μ‹œμž‘μœΌλ‘œ M개의 λΈ”λ£¨λ ˆμ΄μ— λͺ¨λ‘ μ €μž₯ν•  수 있으면 크기λ₯Ό 쀄여보고,
      λͺ¨λ‘ μ €μž₯ν•  수 μ—†μœΌλ©΄ μ €μž₯ 크기λ₯Ό λŠ˜λ €λ³΄λŠ” μ‹μœΌλ‘œ νƒμƒ‰ν•œλ‹€.

πŸ”Έ μ½”λ“œ πŸ”Έ

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        StringBuilder sb = new StringBuilder();

        int N = Integer.parseInt(st.nextToken());
        int M = Integer.parseInt(st.nextToken());

        int[] arr = new int[N];
        st = new StringTokenizer(br.readLine());

        int start = 0; // μ‹œμž‘ 인덱슀 :
        int end = 0;

        for (int i = 0; i < N; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
            start = Math.max(start, arr[i]);
            end += arr[i];
        }

        while (start <= end) {
            int mid = (start + end) / 2;
            int sum = 0;
            int cnt = 0;
            for (int i = 0; i < N; i++) {
                if (sum + arr[i] > mid) {
                    sum = 0;
                    cnt++;
                }
                sum += arr[i];
            }
            if (sum > 0) cnt++;
            if (cnt > M) start = mid + 1;
            else end = mid - 1;
        }

        bw.write(Integer.toString(start));
        bw.flush();
    }
}

πŸ”Έ μ½”λ“œ 해석 πŸ”Έ

  • μ΄μ§„νƒμƒ‰μœΌλ‘œ λΈ”λ£¨λ ˆμ΄ 크기의 μ΅œμ†Œκ°’μ„ κ΅¬ν•œλ‹€.
    • μ‹œμž‘ μΈλ±μŠ€λŠ” μ˜μƒ 쀑 μ΅œλŒ€κ°’(λΈ”λ£¨λ ˆμ΄κ°€ 이 보닀 μž‘μœΌλ©΄ μ €μž₯ν•  수 μ—†λ‹€)
    • λ§ˆμ§€λ§‰ μΈλ±μŠ€λŠ” μ˜μƒμ˜ 총합(λΈ”λ£¨λ ˆμ΄κ°€ 더 컀질 ν•„μš”κ°€ μ—†λ‹€)
  • 쀑앙값 midλŠ” ν˜„μž¬ λΈ”λ£¨λ ˆμ΄μ˜ 크기이닀.
  • sum은 ν˜„μž¬ λΈ”λ£¨λ ˆμ΄μ— μ €μž₯ν•œ μ˜μƒ 길이의 ν•©, cntλŠ” ν˜„μž¬κΉŒμ§€ μ‚¬μš©ν•œ λΈ”λ£¨λ ˆμ΄μ˜ κ°œμˆ˜μ΄λ‹€.
    • μ €μž₯ν•œ μ˜μƒμ΄ mid보닀 κΈΈμ–΄μ§€λ©΄ cntλ₯Ό + 1ν•œλ‹€.
  • λͺ¨λ“  μ˜μƒμ„ ν™•μΈν•œ ν›„ λ‹€μŒ 탐색을 μ§„ν–‰ν•œλ‹€.
    • cnt > M 이면, λΈ”λ£¨λ ˆμ΄ 곡간이 λΆ€μ‘±ν–ˆλ‹€λŠ” κ²ƒμ΄λ―€λ‘œ startλ₯Ό mid+1둜 λ°”κΎΌλ‹€.
    • cnt <= M 이면, λΈ”λ£¨λ ˆμ΄ 곡간이 μ ν•©ν•˜κ±°λ‚˜ λ„˜μ³€λ‹€λŠ” κ²ƒμ΄λ―€λ‘œ endλ₯Ό mid-1둜 λ°”κΎΌλ‹€.

πŸ”Έ end πŸ”Έ

  • 이진 탐색을 λ‹¨μˆœ λ°°μ—΄ 탐색에 μ΄μš©ν•˜λŠ” 것이 μ•„λ‹ˆλΌ 값에 μ μš©ν•œ λ¬Έμ œμ΄λ‹€.
    • μ΄λ ‡κ²Œ μ“°μΈλ‹€λŠ” 것은 μ•Œκ³  μžˆμ—ˆμ§€λ§Œ, 아직 μ΅μˆ™ν•΄μ§€μ§€ μ•Šμ•˜λ‹€.
    • 이런 λ°©μ‹μ˜ 문제λ₯Ό 더 풀어봐야 ν•  것 κ°™λ‹€.
    • 이런 λ°©μ‹μ˜ 이진 탐색을 맀개 λ³€μˆ˜ 탐색이라고 λΆ€λ₯΄λŠ” 것 κ°™λ‹€.

 

728x90