๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿš“ Self Study/๐Ÿ”“ Programmers

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (์ž…๊ตญ์‹ฌ์‚ฌ, ์ด๋ถ„ํƒ์ƒ‰) C++

by UKHYUN22 2022. 1. 1.
728x90

 

n ๋ช…์˜ ์‚ฌ๋žŒ๋“ค์ด times ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋งŒํผ์˜ ์ž…๊ตญ ์‹ฌ์‚ฌ๋ฅผ ๊ฐ€์žฅ ๋นจ๋ฆฌ ํ†ต๊ณผํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ž‘์„ฑํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค. ๋ณด์ž๋งˆ์ž while ๋ฌธ ์•ˆ์—์„œ sec๋ฅผ ํ•˜๋‚˜์”ฉ ์ฆ๊ฐ€ํ•ด์ฃผ๊ณ  ์นด์šดํŠธ๋ฅผ ํ•ด์ฃผ๋ฉด์„œ ๋งˆ์ง€๋ง‰ ํ•œ ๋ช…์ด ๋‚จ์•˜์„ ๋•Œ ์–ด๋Š ์ž…๊ตญ ์‹ฌ์‚ฌ๋Œ€๋ฅผ ํ†ต๊ณผํ•ด์•ผ ๊ฐ€์žฅ ์งง์€ ์‹œ๊ฐ„์ด ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋Š”์ง€ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์•˜๋‹ค.

 

๋‹ค์Œ์€ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ํ•˜๋‚˜๋ฅผ ํ†ต๊ณผํ•œ ์ฝ”๋“œ ์ž‘์„ฑ์ด๋‹ค.

 

#include <string>
#include <vector>
#include <iostream>

using namespace std;

long long solution(int n, vector<int> times) {
    long long answer = 0;
    int sec = 0;
    int sum = 0;
    long long min = 1000000001;
    int member = 0;
    vector<int> count(times.size(), 0);
    
    while(true) {
        if(member == n) break;
        
        
        for(int i = 0 ; i < times.size() ; i++) {
            if(sec % times[i] == 0) {
                count[i]++;  
                member++;
                if(member == n) {
                    for(int i = 0 ; i < times.size() ; i++) {
                        if(sec % times[i] != 0) {
                            if(min > (count[i]+1) * times[i]) {
                                min = (count[i]+1) * times[i]-1;
                            }
                        } else {
                            if(min > sec + times[i]) {
                                min = sec + times[i]-1;
                                sec--;
                            }
                        }
                    }
                    sec = min;
                }
            }
        }
        // cout << member << " ";
        sec++;   
    }
    
    answer = sec;
    
    return answer;
}

 

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

 ์ตœ์  ์‹œ๊ฐ„์„ ์ด๋ถ„ ํƒ์ƒ‰์œผ๋กœ Max์™€ Min์„ ์ค„์—ฌ๋‚˜๊ฐ€๋ฉด์„œ ์ฐพ๋Š” ๋ฐฉ๋ฒ•์ด ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๊ณ ๋ คํ•œ ๊ฒฝ์šฐ๊ฐ€ ๋˜๊ฒ ๋‹ค. ์ด ์ƒ๊ฐ์„ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ. ๋งจ ์ฒ˜์Œ ์ด ๋ฌธ์ œ๋ฅผ ๋ดค์„ ๋•Œ ๋ฌผ์–ด๋ณด๋Š” ๊ฒƒ์ด ์ตœ๋‹จ ์‹œ๊ฐ„์ด์—ˆ๊ณ , ํ ... ์–ด๋–ป๊ฒŒ ์ ‘๊ทผํ•  ์ง€ ์•„์ง ๊ฐ์ด ์•ˆ์˜จ๋‹ค... ์ข€ ๋” ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ด์•ผ ๊ฐ์ด ์˜ฌ ๊ฒƒ ๊ฐ™๋‹ค..

 

#include <algorithm>
#include <string>
#include <vector>

using namespace std;

long long solution(int n, vector<int> times) {
    long long answer = 0;
    
    // ์ž…๊ตญ ์‹ฌ์‚ฌ๋Œ€์˜ ์‹œ๊ฐ„ ์ˆœ์„œ์— ๋”ฐ๋ผ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌ์„ ํ•œ๋‹ค.
    sort(times.begin(), times.end());

    // ์ œ์ผ ์ž‘์€ ์‹œ๊ฐ„ ์ดˆ
    long long min = 1;
    
    // ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋Š” ์ œ์ผ ๊ธธ๊ฒŒ ๊ฑธ๋ฆฌ๋Š” ์‹ฌ์‚ฌ๋Œ€์— n๋ช…์ด ๊ฐ€์„œ ๊ฒ€์‚ฌ๋ฅผ ํ•˜๋Š” ๊ฒฝ์šฐ
    long long max = n * (long long)times.back();

    // Binary Search ์˜ ๊ฐœ๋…์„ ์ ์šฉํ•˜์—ฌ ๊ต์ฐจ๋˜๋Š” ์ˆœ๊ฐ„ while ๋ฌธ์„ ์ข…๋ฃŒ
    while (min <= max) {

        // ํ‰๊ท ์„ ๋จผ์ € ๊ณ„์‚ฐ์„ ํ•œ๋‹ค
        long long avg = (max + min) / 2;
        long long tmp = 0;

        // ๊ฐ ์‹ฌ์‚ฌ๋Œ€๊ฐ€ ํ‰๊ท  ์‹œ๊ฐ„ ๋‚ด์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์„ธ์„œ ๋ชจ๋‘ ๋”ํ•ด์ค€๋‹ค.
        for (int i = 0; i < times.size(); i++) {
            tmp += (avg / (long long) times[i]);
        }

        // ๋งŒ์•ฝ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด n๋ช… ๋ณด๋‹ค ๋งŽ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด max๋ฅผ avg๋ณด๋‹ค 1์ดˆ ์ž‘๊ฒŒ ์„ค์ •ํ•œ๋‹ค.
        if (tmp >= n) {
            max = avg - 1;
            answer = avg;
        }
        else min = avg + 1;
    }
    return answer;
}