๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
  • ์žฅ์›์ต ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ
๐Ÿ’ป Computer Science/- Data Structure, Algorithm

[์•Œ๊ณ ๋ฆฌ์ฆ˜ PS] ๋ฐฑ์ค€ 1654๋ฒˆ ๋žœ์„  ์ž๋ฅด๊ธฐ ์ž๋ฐ” ๋ฌธ์ œํ’€์ด

by Wonit 2021. 2. 13.

๋ฌธ์ œ

ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ๋ฐฑ์ค€์˜ 1654๋ฒˆ ๋žœ์„  ์ž๋ฅด๊ธฐ ์˜ ์ ‘๊ทผ๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•œ ๊ธ€ ์ž…๋‹ˆ๋‹ค.
์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด๋ณด์ž.

๋ฌธ์ œ ์ ‘๊ทผ

๋ฌธ์ œ์—์„œ ์›ํ•˜๋Š” ๋‚ด์šฉ์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ๋ง ํ•˜์ž๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

K๊ฐœ์˜ ๋žœ์„ ์„ N๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด ์ž๋ฅผ ๋•Œ, ๊ฐ ๋žœ์„ ์˜ ๊ธธ์ด๊ฐ€ ์ตœ๋Œ€๊ฐ€ ๋˜๋Š” ๊ธธ์ด๋ฅผ ์ถœ๋ ฅํ•˜๋ผ.

 

๊ทธ๋Ÿผ ์šฐ์„ , ์•„๋ฌด๋Ÿฐ ์ƒ๊ฐํ•˜์ง€ ๋ง๊ณ  K๊ฐœ์˜ ๋žœ์„ ์„ N๊ฐœ๋กœ ๋‚˜๋ˆ„์–ด์„œ ์ž๋ฅผ ๋•Œ ์ตœ๋Œ€์˜ ๊ธธ์ด๋ฅผ ๊ตฌํ•ด๋ณด์ž.

 

์–ด๋– ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ƒ๊ฐ๋‚˜์ง€ ์•Š์•„๋„ ์ข‹๋‹ค.


์•„๋‹ˆ ์ƒ๊ฐํ•˜์ง€ ๋ง๊ณ  ํ•œ ๋ฒˆ ์งœ๋ณด์ž.

public static void main(String[] args) {
  int k = 4;
  int n = 11;

  int[] arr = {802, 743, 457, 539};
  Arrays.sort(arr);

  int quotient = 1;
  int answer = 1;

  while(quotient++ < arr[arr.length-1]) {
    int count = 0;
    for(int value : arr) {
      count += value / quotient;
    }

    if(n == count) { // n๊ณผ ๊ฐ™์œผ๋ฉด์„œ ๋‚˜๋ˆ„์–ด ๋–จ์–ด์ง€๋Š” ์ตœ๋Œ€๊ฐ’
      answer = quotient;
    }
  }
  System.out.println(answer); // 200
}

๊ทธ๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๋Š” 200์ด๋ผ๋Š” ์ˆ˜๊ฐ€ ์ฐพ์•„์ง€๊ฒŒ ๋œ๋‹ค.

 

๊ทธ๋Ÿผ ์ด๊ฒŒ ๋‹ต์ผ๊นŒ?

 

์šฐ์„  ๋…ผ๋ฆฌ์— ๋Œ€ํ•œ ๊ฒ€์ฆ๋ถ€ํ„ฐ ํ•ด๋ณด์ž.

 

๋ชซ์„ 1 ~ ์ž…๋ ฅ ๋ฐฐ์—ด์˜ ์ตœ๋Œ€๊ฐ’ ๊นŒ์ง€ 1์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉฐ ๋‚˜๋ˆ„์—ˆ์„ ๋•Œ, ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” n๊ฐœ์˜ ๋žœ์„ ์ด ๋  ์ตœ๋Œ€ ๊ฐ’์„ ๊ตฌํ•˜๋Š” ๋กœ์ง์ด๋‹ค.

 

์‚ฌ์‹ค์ƒ ๋กœ์ง์—๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์–ด ๋ณด์ธ๋‹ค.

 

๋กœ์ง์€ ํ†ต๊ณผํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ?

๊ทธ๋Ÿผ ์ด์ œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž.

 

์ž…๋ ฅ k๋Š” 1 ~ 10,000 ์‚ฌ์ด์˜ ๊ฐ’์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  N์€ 1 ~ 1,000,000 ์ดํ•˜์˜ ์ •์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋žœ์„ ์˜ ๊ธธ์ด๋Š” 2^31 ์ฆ‰ 21์–ต cm์˜ ๊ธธ์ด๊ฐ€ ๋œ๋‹ค๊ณ  ํ•œ๋‹ค.

์ตœ์•…์˜ ๊ฒฝ์šฐ 21์–ต๋ฒˆ ๋ฐ˜๋ณต์„ ๋Œ์•„์•ผ ํ•˜๋ฏ€๋กœ ์‹œ๊ฐ„๋ณต์žก๋„์—์„œ ์‹คํŒจ

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ?

 

์ง€๊ธˆ๊นŒ์ง€ ๋ณด๋ฉด ์–ด์ฉ” ์ˆ˜ ์—†์ด 1๋ถ€ํ„ฐ 21์–ต์˜ ๊ธธ์ด๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.


ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ์ƒ๊ฐ์„ ํ•ด๋ณธ๋‹ค๋ฉด 1๋ถ€ํ„ฐ 21์–ต ๊นŒ์ง€์˜ ํƒ์ƒ‰์„ ์ˆ ๋จน์œผ๋ฉฐ ์ž์ฃผ ํ–ˆ๋˜ ์—…๋‹ค์šด ๊ฒŒ์ž„ ๋ฐฉ์‹์œผ๋กœ ์ค„์ผ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

 

๋งž๋‹ค.


์ด ์—…๋‹ค์šด ๊ฒŒ์ž„ ์ž์ฒด๋Š” ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ์ตœ์ ํ™” ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ด ๋ฌธ์ œ๋„ ์ด๋ถ„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

 

ํ•ด๊ฒฐ๋ฒ•

์•ž์„œ ๋ง ํ–ˆ๋“ฏ, ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜ค๋Š” ๋ฐฐ์—ด arr ์˜ ์›์†Œ๋ฅผ ๋‚˜๋ˆˆ ๋ชซ๋“ค์˜ ํ•ฉ์ด ๋ฐ”๋กœ ๋žœ์„ ์˜ ๊ฐฏ์ˆ˜๊ฐ€ ๋œ๋‹ค.

 

๊ทธ๋Ÿผ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“œ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ arr ์˜ ์›์†Œ๋ฅผ x๋กœ ๋‚˜๋ˆด์„ ๋•Œ, ๋ชซ๋“ค์˜ ํ•ฉ์ด n์ด ๋˜๋Š” x๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๊ณผ์ •์ด ๋  ๊ฒƒ์ด๊ณ , ์ด ํ›„๋ณด๋“ค์„ ์ด๋ถ„ ํƒ์ƒ‰ํ•˜๋ฉด ๋  ๊ฒƒ ๊ฐ™๋‹ค.

 

x์˜ ํ›„๋ณด

์šฐ๋ฆฌ๋Š” ์ด x์˜ ๋ฒ”์œ„๋Š” 1์—์„œ ๋ฐฐ์—ด ํ•ญ๋ชฉ์˜ ์ตœ๋Œ€๊ฐ’์ธ 802 ๊นŒ์ง€๊ฐ€ ๋œ๋‹ค.

 

์ด๋“ค์„ ๋ฐ˜์”ฉ ์ค„์—ฌ๊ฐ€๋ฉฐ ํ˜น์€ ๋Š˜๋ ค๊ฐ€๋ฉฐ ์ด๋ถ„ ํƒ์ƒ‰์„ ์‹œ๋„ํ•˜๋Š”๋ฐ, ๋Š˜๋ฆฌ๊ณ  ์ค„์ด๊ณ ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ฒฐ์ •ํ• ๊นŒ?

 

๊ธธ์ด x๋กœ ์ž๋ฅธ ๋žœ์„ ๋“ค์˜ ๊ฐฏ์ˆ˜๊ฐ€ n๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ์ž‘๊ฑฐ๋‚˜๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ?

 

  • ๊ธธ์ด x๋กœ ์ž๋ฅธ ๋žœ์„ ๋“ค์˜ ๊ฐฏ์ˆ˜๊ฐ€ n๋ณด๋‹ค ํด ๋•Œ : x๋กœ ์ž˜๋ž๋”๋‹ˆ ๋žœ์„ ์ด ๋” ๋งŽ์•„์กŒ๋‹ค? => x๋ณด๋‹ค ๋” ํฐ ๊ธธ์ด๋กœ ์ž˜๋ผ์•ผ ํ•œ๋‹ค.
  • ๊ธธ์ด x๋กœ ์ž๋ฅธ ๋žœ์„ ๋“ค์˜ ๊ฐฏ์ˆ˜๊ฐ€ n๋ณด๋‹ค ์ž‘์„ ๋•Œ : x๋กœ ์ž˜๋ž๋”๋‹ˆ ๋žœ์„ ์ด ๋” ์ ์–ด์กŒ๋‹ค? => x๋ณด๋‹ค ๋” ์ž‘์€ ๊ธธ์ด๋กœ ์ž˜๋ผ์•ผ ํ•œ๋‹ค.

์ด ์กฐ๊ฑด์„ ํ†ตํ•ด์„œ ์ด๋ถ„ ํƒ์ƒ‰์˜ start์™€ end๋ฅผ ๋งค ๋ฐ˜๋ณต๋งˆ๋‹ค ์žฌ์ •์˜ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ •๋‹ต ์ฝ”๋“œ

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));
        String[] kn = br.readLine().split(" ");
        int k = Integer.parseInt(kn[0]);
        int n = Integer.parseInt(kn[1]);
        long[] arr = new long[k];

        long max = 0;

        for(int i = 0; i < k; i++) {
            arr[i] = Long.parseLong(br.readLine());
            max = Math.max(max, arr[i]);
        }

        long start = 1;
        long end = max;
        long answer = 0;

        while(start <= end) {
            int count = 0;
            long mid = start + (end - start) / 2; // ๋‚˜๋ˆŒ ๊ฐ’
            for(int i = 0; i < arr.length; i++) {
                count += arr[i] / mid;
            }

            if(count >= n) {
                answer = Math.max(answer, mid);
                start = mid + 1;
            }else {
                end = mid - 1;
            }
        }


        bw.write(String.valueOf(answer));
        bw.flush();
        bw.close();
    }
}

๋ฌธ์ œ ํšŒ๊ณ 

์ด๋ถ„ ํƒ์ƒ‰ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ’€์—ˆ๋˜ ์ฒซ ๋ฌธ์ œ์ด๋‹ค.
์ด๋ก ์—์„œ ์ด๋ถ„ ํƒ์ƒ‰์€ ์ง€์ •๋œ ๋ฆฌ์ŠคํŠธ ๋‚ด์—์„œ ๋ถ„ํ•  ์ •๋ณต์„ ํ•œ๋‹ค๊ณ  ์ดํ•ดํ–ˆ๋Š”๋ฐ, ํ‹€์— ๋ฐ•ํ˜€์žˆ์–ด์„œ ๊ณ„์† ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜จ arr ์ด๋ผ๋Š” ๋ฆฌ์ŠคํŠธ ๋‚ด์—์„œ๋งŒ ์ƒ๊ฐ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.
arr ๋ฆฌ์ŠคํŠธ ๋‚ด์—์„œ ์–ด๋–ป๊ฒŒ mid ๊ฐ’์„ ์ฐพ์„์ง€๋ฅผ ๊ณ ๋ฏผํ–ˆ๋Š”๋ฐ, ์‚ฌ์‹ค์€ ์ด๋ถ„ ํƒ์ƒ‰์„ ํ•ด์•ผํ•  ๋ฆฌ์ŠคํŠธ ์ž์ฒด๊ฐ€ ๋‹ฌ๋ž๋‹ค.
์ด๋ถ„ ํƒ์ƒ‰์„ ํ•ด์•ผํ•  ๋ฆฌ์ŠคํŠธ๋Š” 1 ~ arr์˜ ์ตœ๋Œ€๊ฐ’ ๊นŒ์ง€ ๋‚˜๋ˆ„๋ ค ํ•˜๋Š” ๊ฐ’์˜ ๋ฆฌ์ŠคํŠธ ์˜€์—ˆ๋‹ค.
ํ™•์‹คํžˆ ์•Œ๊ณ ๋ฆฌ์ฆ˜ PS๋Š” ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™๋‹ค.

์ •๋‹ต ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•˜์‹œ๋ ค๋ฉด solve url ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋Œ“๊ธ€