[Boj_1561] ๋†€์ด ๊ณต์›

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

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

 

โ–ธ ๋ฌธ์ œ

N๋ช…์˜ ์•„์ด๋“ค์ด ํ•œ ์ค„๋กœ ์ค„์„ ์„œ์„œ ๋†€์ด๊ณต์›์—์„œ 1์ธ์Šน ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ๋‹ค. ์ด ๋†€์ด๊ณต์›์—๋Š” ์ด M์ข…๋ฅ˜์˜ 1์ธ์Šน ๋†€์ด๊ธฐ๊ตฌ๊ฐ€ ์žˆ์œผ๋ฉฐ, 1๋ฒˆ๋ถ€ํ„ฐ M๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ๋งค๊ฒจ์ ธ ์žˆ๋‹ค.

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

๋†€์ด๊ธฐ๊ตฌ๊ฐ€ ๋ชจ๋‘ ๋น„์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ ์ฒซ ๋ฒˆ์งธ ์•„์ด๊ฐ€ ๋†€์ด๊ธฐ๊ตฌ์— ํƒ‘์Šนํ•œ๋‹ค๊ณ  ํ•  ๋•Œ, ์ค„์˜ ๋งˆ์ง€๋ง‰ ์•„์ด๊ฐ€ ํƒ€๊ฒŒ ๋˜๋Š” ๋†€์ด๊ธฐ๊ตฌ์˜ ๋ฒˆํ˜ธ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N(1 ≤ N ≤ 2,000,000,000)๊ณผ M(1 ≤ M ≤ 10,000)์ด ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” ๊ฐ ๋†€์ด๊ธฐ๊ตฌ์˜ ์šดํ–‰ ์‹œ๊ฐ„์„ ๋‚˜ํƒ€๋‚ด๋Š” M๊ฐœ์˜ ์ž์—ฐ์ˆ˜๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์šดํ–‰ ์‹œ๊ฐ„์€ 1 ์ด์ƒ 30 ์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋ฉฐ, ๋‹จ์œ„๋Š” ๋ถ„์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋งˆ์ง€๋ง‰ ์•„์ด๊ฐ€ ํƒ€๊ฒŒ ๋˜๋Š” ๋†€์ด๊ธฐ๊ตฌ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 1
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ์ด๋ถ„ ํƒ์ƒ‰, ๋งค๊ฐœ ๋ณ€์ˆ˜ ํƒ์ƒ‰
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

์ด ๋ฌธ์ œ๋Š” ๋‹จ์ˆœํžˆ ์„ ํ˜• ํƒ์ƒ‰์œผ๋กœ ์ ‘๊ทผํ•˜๋ฉด, ์•„์ด๋“ค์˜ ์ˆ˜๊ฐ€ ์ตœ๋Œ€ 20์–ต ๋ช…๊นŒ์ง€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ฌธ์ œ๋Š” ์ด๋ถ„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•˜์—ฌ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

โฑ ์•„์ด๋“ค์ด ํƒ‘์Šนํ•œ ์ธ์›์„ ์‹œ๊ฐ„ ๊ธฐ์ค€์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ธฐ

ํ•ต์‹ฌ ์•„์ด๋””์–ด๋Š”, ํŠน์ • ์‹œ๊ฐ„ t๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๊ทธ ์‹œ์ ๊นŒ์ง€ ๋ช‡ ๋ช…์˜ ์•„์ด๊ฐ€ ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ํƒ”๋Š”์ง€ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

  • 0๋ถ„์—๋Š” ๋ชจ๋“  ๋†€์ด๊ธฐ๊ตฌ๊ฐ€ ํ•œ ๋ฒˆ์”ฉ ์šดํ–‰์„ ์‹œ์ž‘ํ•˜๋ฏ€๋กœ, ์ฒ˜์Œ m๋ช…์˜ ์•„์ด๋“ค์ด ์ฆ‰์‹œ ํƒ‘์Šนํ•œ๋‹ค.
  • ์ดํ›„ ๊ฐ ๋†€์ด๊ธฐ๊ตฌ๋Š” ์ž์‹ ์˜ ์šดํ–‰ ์‹œ๊ฐ„์ด ์ง€๋‚  ๋•Œ๋งˆ๋‹ค ๋ฐ˜๋ณต์ ์œผ๋กœ ์•„์ด๋“ค์„ ํƒœ์šธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ฐ ๋†€์ด๊ธฐ๊ตฌ๋Š” t / time[i]๋งŒํผ์˜ ์•„์ด๋ฅผ ์ถ”๊ฐ€๋กœ ํƒœ์šธ ์ˆ˜ ์žˆ๋‹ค.
private static long getChildNumInTime(long t) {
    long childNum = m;
    for (int i = 0; i < m; i++) {
        childNum += t/time[i];
    }

    return childNum;
}

 

๐Ÿง  ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ์ตœ์†Œ ์‹œ๊ฐ„ ์ฐพ๊ธฐ

๊ทธ๋Ÿผ ์ด์ œ N๋ฒˆ์งธ ์•„์ด๊ฐ€ ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋Š” ์ตœ์†Œ ์‹œ๊ฐ„์„ ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ ์ฐพ์•„์•ผ ํ•œ๋‹ค.

  • ๋ชจ๋“  ์•„์ด๋“ค์ด ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ํƒ€๋Š” ๋ฐ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„์€ n * 30๋ถ„์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ๊ฐ€์žฅ ๊ทน๋‹จ์ ์€ ์ƒํ™ฉ์ธ 20์–ต ๋ช…์˜ ์•„์ด๋“ค์ด ์šดํ–‰ ์‹œ๊ฐ„์ด 30๋ถ„์ธ 1๊ฐœ์˜ ๋†€์ด๊ธฐ๊ตฌ๋งŒ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ
  • ์ด๋ถ„ ํƒ์ƒ‰์„ ํ†ตํ•ด ํ•ด๋‹น ์‹œ๊ฐ„ ์•ˆ์— n๋ช… ์ด์ƒ์ด ํƒ‘์Šน ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ์ฒดํฌํ•˜๋ฉด ๋ฒ”์œ„๋ฅผ ์ขํ˜€๋‚˜๊ฐ„๋‹ค.
private static long binarySearch() {
    long left = 0;
    long right = n*30;

    while (left <= right) {
        long mid = (left+right)/2;
        long childNum = getChildNumInTime(mid);

        if (childNum < n) {
            left = mid+1;
        } else {
            right = mid-1;
        }
    }

    return left;
}
  • getChildNumInTime(mid)๋Š” mid ์‹œ์ ๊นŒ์ง€ ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ํƒ„ ์•„์ด๋“ค์˜ ์ด ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ด ๊ฐ’์ด n๋ณด๋‹ค ์ž‘์œผ๋ฉด ์•„์ง N๋ฒˆ์งธ ์•„์ด๊ฐ€ ํƒˆ ์ˆ˜ ์—†๋Š” ์‹œ๊ฐ„์ด๋ฏ€๋กœ left๋ฅผ ๋Š˜๋ฆฌ๊ณ ,
  • ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์‹œ๊ฐ„์ด๋ฏ€๋กœ right๋ฅผ ์ค„์—ฌ ๋” ๋น ๋ฅธ ์‹œ๊ฐ„๋Œ€๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.

์ตœ์ข…์ ์œผ๋กœ left์—๋Š” N๋ฒˆ์งธ ์•„์ด๊ฐ€ ํƒ‘์Šน ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ์‹œ๊ฐ„ t๊ฐ€ ๋‹ด๊ธฐ๊ฒŒ ๋œ๋‹ค.

 

๐ŸŽฏ ๋งˆ์ง€๋ง‰ ์•„์ด๊ฐ€ ํƒ„ ๋†€์ด๊ธฐ๊ตฌ ์ฐพ๊ธฐ

์ด์ œ ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์‹ถ์€ ๊ฒƒ์€, N๋ฒˆ์งธ ์•„์ด๊ฐ€ ์–ด๋–ค ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ํƒ”๋Š”์ง€์ด๋‹ค.

  • ๋จผ์ € t-1 ์‹œ์ ๊นŒ์ง€ ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ํƒ„ ์•„์ด๋“ค์˜ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•œ๋‹ค.
  • ์ด์ œ t ์‹œ์ ์—์„œ ๋น„๊ฒŒ ๋˜๋Š” ๋†€์ด๊ธฐ๊ตฌ๋“ค์„ ์ฐจ๋ก€๋กœ ํ™•์ธํ•˜๋ฉด์„œ, ์•„์ด๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ํƒœ์šด๋‹ค.
  • ๊ทธ์ค‘ N๋ฒˆ์งธ ์•„์ด๊ฐ€ ํƒ‘์Šนํ•˜๊ฒŒ ๋˜๋Š” ์ˆœ๊ฐ„, ํ•ด๋‹น ๋†€์ด๊ธฐ๊ตฌ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด ๋œ๋‹ค.
long child = getChildNumInTime(min-1); // min์€ ์ตœ์†Œ ์‹œ๊ฐ„
for (int i = 0; i < m; i++) {
    if (result%time[i] == 0) {
        child++;
    }
    if (child == n) { 
        System.out.println(i+1);
        break;
    }
}
  • result%time[i] == 0์ด๋ผ๋Š” ์กฐ๊ฑด์€ ๋†€์ด๊ธฐ๊ตฌ i๊ฐ€ t ์‹œ์ ์— ์•„์ด๋ฅผ ํƒœ์šธ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ์ž„์„ ์˜๋ฏธํ•œ๋‹ค.
  • ์ด ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋†€์ด๊ธฐ๊ตฌ๋“ค์„ ๋ฒˆํ˜ธ์ˆœ์œผ๋กœ ํ™•์ธํ•˜๋ฉด์„œ ์•„์ด๋ฅผ ํƒœ์šด๋‹ค.
  • ๋ˆ„์ ํ•œ ์•„์ด ์ˆ˜๊ฐ€ n๋ฒˆ์งธ๊ฐ€ ๋˜๋Š” ์ˆœ๊ฐ„, ํ•ด๋‹น ๋†€์ด๊ธฐ๊ตฌ๊ฐ€ ๋ฐ”๋กœ N๋ฒˆ์งธ ์•„์ด๊ฐ€ ํƒ‘์Šนํ•œ ๋†€์ด๊ธฐ๊ตฌ๊ฐ€ ๋œ๋‹ค.

 

์œ„ ํ’€์ด์˜ ์ฝ”๋“œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ „์ฒด์ ์ธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 13196KB
์‹œ๊ฐ„ : 108ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main {
    static long n;
    static int m;
    static int[] time;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Long.parseLong(st.nextToken()); // ์•„์ด๋“ค ์ˆ˜
        m = Integer.parseInt(st.nextToken()); // ๋†€์ด๊ธฐ๊ตฌ ์ข…๋ฅ˜

        st = new StringTokenizer(br.readLine());
        time = new int[m]; // ๊ฐ ๋†€์ด๊ธฐ๊ตฌ์˜ ์šดํ–‰ ์‹œ๊ฐ„
        for (int i = 0; i < m; i++) {
            time[i] = Integer.parseInt(st.nextToken());
        }

        // ์•„์ด๋“ค ์ˆ˜๊ฐ€ ๋†€์ด๊ธฐ๊ตฌ ์ข…๋ฅ˜๋ณด๋‹ค ์ž‘๋‹ค๋ฉด
        // ๋ชจ๋‘ ๋ฐ”๋กœ ํƒ‘์Šน ๊ฐ€๋Šฅ
        if (n <= m) {
            System.out.println(n);
            return;
        }

        long min = binarySearch(); // n๋ฒˆ์งธ ์•„์ด๊นŒ์ง€ ํƒ‘์Šน ๊ฐ€๋Šฅํ•œ ์ตœ์†Œ ์‹œ๊ฐ„
        long child = getChildNumInTime(min-1); // n๋ฒˆ์งธ ์•„์ด๊ฐ€ ํƒ‘์Šนํ•˜๊ธฐ ์ง์ „๊นŒ์ง€ ํƒ‘์Šนํ•œ ์•„์ด ์ˆ˜

        for (int i = 0; i < m; i++) {
            if (min%time[i] == 0) { // ๋†€์ด๊ธฐ๊ตฌ i๋Š” ์ƒˆ ์•„์ด๋ฅผ ํƒœ์šธ ์ค€๋น„๊ฐ€ ๋œ ์ƒํƒœ
                child++; // ํ•œ ๋ช… ํƒ‘์Šน
            }
            if (child == n) { // ๋ชจ๋‘ ํƒ‘์Šนํ–ˆ๋‹ค๋ฉด
                System.out.println(i+1); // ๋งˆ์ง€๋ง‰ ์•„์ด๊ฐ€ ํƒ€๊ฒŒ ๋˜๋Š” ๋†€์ด๊ธฐ๊ตฌ์˜ ๋ฒˆํ˜ธ ์ถœ๋ ฅ
                break;
            }
        }

        br.close();
    }

    private static long binarySearch() {
        long left = 0; // ์ตœ์†Œ ์‹œ๊ฐ„
        long right = n*30; // ์ตœ๋Œ€ ์‹œ๊ฐ„, ๋ชจ๋“  ์•„์ด๋“ค์ด ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ์‹œ๊ฐ„

        while (left <= right) {
            long mid = (left+right)/2;
            long childNum = getChildNumInTime(mid); // mid ๋™์•ˆ ๋†€์ด๊ธฐ๊ตฌ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ๋Š” ์•„์ด๋“ค์˜ ์ˆ˜

            if (childNum < n) {
                left = mid+1;
            } else {
                right = mid-1;
            }
        }

        return left;
    }

    private static long getChildNumInTime(long t) {
        long childNum = m; // 0๋ถ„์— ์•„์ด๋“ค์ด ์ฐจ๋ก€๋Œ€๋กœ m๊ฐœ์˜ ๋†€์ด๊ธฐ๊ตฌ ํƒ‘์Šน
        for (int i = 0; i < m; i++) {
            // ๊ฐ ๋†€์ด๊ธฐ๊ตฌ ๋‹น t๋ถ„ ๋™์•ˆ ํƒˆ ์ˆ˜ ์žˆ๋Š” ์ธ์› ์ˆ˜ ๋ˆ„์ 
            childNum += t/time[i];
        }

        return childNum;
    }
}

 

๋ฌธ์ œ์—์„œ ์ž…๋ ฅ ๋ฒ”์œ„๊ฐ€ ๊ต‰์žฅํžˆ ํฐ ๊ฒƒ์„ ๋ณด๊ณ  ์ด๋ถ„ ํƒ์ƒ‰์„ ํ™œ์šฉํ•ด์„œ ํ•ด๊ฒฐํ•˜๋Š” ๋ฌธ์ œ์ž„์€ ์บ์น˜ํ–ˆ๋Š”๋ฐ, ๋ฌด์—‡์„ ๊ธฐ์ค€์œผ๋กœ ์ด๋ถ„ ํƒ์ƒ‰์„ ํ•ด์•ผ ํ• ์ง€ ๊ต‰์žฅํžˆ ์˜ค๋žœ ์‹œ๊ฐ„ ๊ณ ๋ฏผํ–ˆ๋‹ค. ์ฒ˜์Œ์—” ์‚ฌ๋žŒ ์ˆ˜, ๋†€์ด ๊ธฐ๊ตฌ ์ˆ˜ ๋“ฑ ์—ฌ๋Ÿฌ ์กฐ๊ฑด์„ ๊ธฐ์ค€์œผ๋กœ ์‚ผ์•„๋ณด๋ ค ํ–ˆ์ง€๋งŒ ์ ์ ˆํ•œ ๊ธฐ์ค€์ด ์•„๋‹ˆ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๊ณ , ๊ฒฐ๊ตญ ๋‹ค๋ฅธ ๋ถ„์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜์—ฌ ์‹œ๊ฐ„์„ ๊ธฐ์ค€์œผ๋กœ ์žก์•„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์—ญ์‹œ ์ด๋ถ„ ํƒ์ƒ‰์€ ํƒ์ƒ‰ ๋Œ€์ƒ์„ ์ ์ ˆํ•˜๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊นจ๋‹ฌ์•˜๋‹ค. ๐Ÿค”๐Ÿ’ญ

 

 

 

 

 

๐Ÿ“ƒ reference