[c++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค :: ์ž…๊ตญ์‹ฌ์‚ฌ (๋ฌธ์ œ ํ’€์ด, ์ฝ”๋“œ, ์ด๋ถ„ ํƒ์ƒ‰)

์ž…๊ตญ์‹ฌ์‚ฌ

https://programmers.co.kr/learn/courses/30/lessons/43238

๋ฌธ์ œ

๋ฌธ์ œ ์„ค๋ช…

n๋ช…์ด ์ž…๊ตญ์‹ฌ์‚ฌ๋ฅผ ์œ„ํ•ด ์ค„์„ ์„œ์„œ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ž…๊ตญ์‹ฌ์‚ฌ๋Œ€์— ์žˆ๋Š” ์‹ฌ์‚ฌ๊ด€๋งˆ๋‹ค ์‹ฌ์‚ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์ฒ˜์Œ์— ๋ชจ๋“  ์‹ฌ์‚ฌ๋Œ€๋Š” ๋น„์–ด์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ์‹ฌ์‚ฌ๋Œ€์—์„œ๋Š” ๋™์‹œ์— ํ•œ ๋ช…๋งŒ ์‹ฌ์‚ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ์•ž์— ์„œ ์žˆ๋Š” ์‚ฌ๋žŒ์€ ๋น„์–ด ์žˆ๋Š” ์‹ฌ์‚ฌ๋Œ€๋กœ ๊ฐ€์„œ ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋” ๋นจ๋ฆฌ ๋๋‚˜๋Š” ์‹ฌ์‚ฌ๋Œ€๊ฐ€ ์žˆ์œผ๋ฉด ๊ธฐ๋‹ค๋ ธ๋‹ค๊ฐ€ ๊ทธ๊ณณ์œผ๋กœ ๊ฐ€์„œ ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ตœ์†Œ๋กœ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ž…๊ตญ์‹ฌ์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‚ฌ๋žŒ ์ˆ˜ n, ๊ฐ ์‹ฌ์‚ฌ๊ด€์ด ํ•œ ๋ช…์„ ์‹ฌ์‚ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ๋‹ด๊ธด ๋ฐฐ์—ด times๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ๋ชจ๋“  ์‚ฌ๋žŒ์ด ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

์ œํ•œ์‚ฌํ•ญ

  • ์ž…๊ตญ์‹ฌ์‚ฌ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‚ฌ๋žŒ์€ 1๋ช… ์ด์ƒ 1,000,000,000๋ช… ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ ์‹ฌ์‚ฌ๊ด€์ด ํ•œ ๋ช…์„ ์‹ฌ์‚ฌํ•˜๋Š”๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ 1๋ถ„ ์ด์ƒ 1,000,000,000๋ถ„ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ์‹ฌ์‚ฌ๊ด€์€ 1๋ช… ์ด์ƒ 100,000๋ช… ์ดํ•˜์ž…๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ์˜ˆ

n times return
6 [7, 10] 28

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

๊ฐ€์žฅ ์ฒซ ๋‘ ์‚ฌ๋žŒ์€ ๋ฐ”๋กœ ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›์œผ๋Ÿฌ ๊ฐ‘๋‹ˆ๋‹ค.

7๋ถ„์ด ๋˜์—ˆ์„ ๋•Œ, ์ฒซ ๋ฒˆ์งธ ์‹ฌ์‚ฌ๋Œ€๊ฐ€ ๋น„๊ณ  3๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

10๋ถ„์ด ๋˜์—ˆ์„ ๋•Œ, ๋‘ ๋ฒˆ์งธ ์‹ฌ์‚ฌ๋Œ€๊ฐ€ ๋น„๊ณ  4๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

14๋ถ„์ด ๋˜์—ˆ์„ ๋•Œ, ์ฒซ ๋ฒˆ์งธ ์‹ฌ์‚ฌ๋Œ€๊ฐ€ ๋น„๊ณ  5๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค.

20๋ถ„์ด ๋˜์—ˆ์„ ๋•Œ, ๋‘ ๋ฒˆ์งธ ์‹ฌ์‚ฌ๋Œ€๊ฐ€ ๋น„์ง€๋งŒ 6๋ฒˆ์งธ ์‚ฌ๋žŒ์ด ๊ทธ๊ณณ์—์„œ ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›์ง€ ์•Š๊ณ  1๋ถ„์„ ๋” ๊ธฐ๋‹ค๋ฆฐ ํ›„์— ์ฒซ ๋ฒˆ์งธ ์‹ฌ์‚ฌ๋Œ€์—์„œ ์‹ฌ์‚ฌ๋ฅผ ๋ฐ›์œผ๋ฉด 28๋ถ„์— ๋ชจ๋“  ์‚ฌ๋žŒ์˜ ์‹ฌ์‚ฌ๊ฐ€ ๋๋‚ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜

โ€ป ๊ณต์ง€ - 2019๋…„ 9์›” 4์ผ ๋ฌธ์ œ์— ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋„์›€์„ ์ฃผ์‹  weaver9651 ๋‹˜๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

 

์ฝ”๋“œ

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

using namespace std;

long long solution(int n, vector<int> times) {
    long long answer = 0;
    vector<pair<long long,long long>> time_vec;

    sort(times.begin(), times.end());

    // setting
    for(long long i=0; i<times.size(); i++){
        time_vec.push_back(make_pair(times[i],0));
    }

    // ํ•œ๋ช…์”ฉ ๋„ฃ๊ธฐ
    while(n--){
        long long min_idx=0;
        for(int i=1; i<time_vec.size(); i++){ // ์ตœ์†Ÿ๊ฐ’ ๊ตฌํ•˜๊ธฐ
            if(time_vec[i].first+ time_vec[i].second < time_vec[min_idx].first+ time_vec[min_idx].second)
                min_idx = i;
        }
        for(int i=0; i<time_vec.size(); i++){ // ์‹œ๊ฐ„์ด ์ง€๋‚ฌ์Œ์„ ํ‘œ์‹œ
            if(i!=min_idx)
                time_vec[i].second-=time_vec[min_idx].second;
            if(time_vec[i].second<0) // ๋Œ€๊ธฐ ์ค‘์ธ ์‹ฌ์‚ฌ๋Œ€
                time_vec[i].second =0; // 0์œผ๋กœ ์ดˆ๊ธฐํ™”
        }
        answer+= time_vec[min_idx].second;
        time_vec[min_idx].second = time_vec[min_idx].first; // ๋“ค์–ด๊ฐ„ ๊ณณ์˜ ํ˜„์žฌ ๋‚จ์€ ์‹œ๊ฐ„ ์ดˆ๊ธฐํ™”
    }

    // ๋‚จ์€ ์‹œ๊ฐ„ ๋๋‚ด๊ธฐ
    long long max_time = 0;
    for(int i=0; i<time_vec.size(); i++){ // ์ตœ๋Œ“๊ฐ’ ๊ตฌํ•˜๊ธฐ
        if(time_vec[i].second > max_time)
            max_time = time_vec[i].second;
    }
    answer+=max_time;

    return answer;
}

 

ํ’€์ด

time_vec๋ผ๋Š” ๋ฒกํ„ฐ์— (์›๋ž˜ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„, ํ˜„์žฌ ๋‚จ์€ ์‹œ๊ฐ„)์„ ์ €์žฅํ•˜๋ฉด์„œ ๋‘ ์‹œ๊ฐ„์˜ ํ•ฉ์ด ์ตœ์†Œ์ธ ๋ฐ์Šคํฌ์— ํ•œ ๋ช…์”ฉ ์ง‘์–ด๋„ฃ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๋‘ ์‹œ๊ฐ„์˜ ํ•ฉ์ด ์ตœ์†Œ๋ผ๋ฉด ์ง€๊ธˆ ๋ฐ์Šคํฌ์— ๋“ค์–ด๊ฐ€์•ผํ•˜๋Š” ์‚ฌ๋žŒ์ด ์ผ์„ ๋๋งˆ์น˜๋Š” ์‹œ๊ฐ์ด ๊ฐ€์žฅ ๋น ๋ฅด๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜์˜€๋‹ค. ๋ชจ๋‘ ๋ฐ์Šคํฌ์— ๋“ค์–ด๊ฐ„ ํ›„์—๋Š” ๋๋งˆ์น˜๋Š” ์‹œ๊ฐ์ด ๊ฐ€์žฅ ๋Š๋ฆฐ ์‚ฌ๋žŒ์„ ๊ธฐ์ ์œผ๋กœ ์ข…๋ฃŒ ์‹œ๊ฐ์„ ์ธก์ •ํ•œ๋‹ค.

 

์ฑ„์  ๊ฒฐ๊ณผ

ใ…Žใ…Ž.. ์™œ ์•ˆ๋˜๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค. ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฌธ์ œ๋ผ๋ฉด ์œ„์˜ ํ…Œ์ŠคํŠธ 1,2,3์€ ๋งž์•„์•ผํ•˜๋Š”๋ฐ ๊ทธ๊ฒƒ๋„ ํ‹€๋ ธ๋‹ค. ๊ทผ๋ฐ ๋˜ 9๋ฒˆ์€ ํ†ต๊ณผ ใ…‡ใ……ใ…‡..?

 

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด

์ด๋ถ„ ํƒ์ƒ‰์ด๋ผ๋Š” ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋ณด๊ณ ์„œ๋„ ์–ด๋–ป๊ฒŒ ์ด๋ถ„ ํƒ์ƒ‰์„ ์ด์šฉํ•ด์•ผํ•˜๋Š”์ง€ ๊ฐ์ด ์•ˆ์™”๋Š”๋ฐ, ์ด๋ฒˆ ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด์„œ ๊ฐ์„ ์ข€ ์žก์€ ๊ฒƒ ๊ฐ™๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๊ธฐ์–ตํ•ด๋‘ฌ์•ผ๊ฒ ๋‹ค!

๋‹ค๋ฅธ ์‚ฌ๋žŒ์˜ ํ’€์ด๋ฅผ ๋ณด๊ณ  ๋‚ด ๋ฐฉ์‹๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

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

using namespace std;

unsigned long long solution(int n, vector<int> times) {
    unsigned long long answer = 1e18;

    sort(times.begin(), times.end());

    long long min = 1;
    long long max = 1e15;//(long long)times.back()*n; // ๊ฐ€์žฅ ๋Š๋ฆฐ ์‚ฌ๋žŒ์ด ๋ชจ๋‘ ์‹ฌ์‚ฌ

    while(min<=max){
        long long number=0;
        long long mid = (min+max)/2;
        for(int i=0; i<times.size(); i++) // ํ•ด๋‹น ์‹œ๊ฐ„๋™์•ˆ ์‹ฌ์‚ฌ๋ฅผ ๋๋‚ผ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ ์ˆ˜
            number+=(long long)mid/times[i];
        if(number<n)
            min = mid+1;
        else{
            // ๊ฐ€๋Šฅํ•˜๋ฉด
            if(mid<answer) // ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜ ์ฐพ๊ธฐ
                answer = mid;
            max = mid-1;
        }
    }

    return answer;
}

์ฃผ์˜ ํ•  ์ 

return ๊ฐ’์„ unsigned long long์œผ๋กœ ํ•˜์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ์ ˆ๋ฐ˜ ๊ฐ€๋Ÿ‰์ด ํ‹€๋ฆฌ๊ฒŒ ๋‚˜์˜จ๋‹ค.

๋ฐ˜์‘ํ˜•