λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€/4단계

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ Lv4] : λ¬΄μ§€μ˜ λ¨Ήλ°© 라이브

by Jaeguk 2022. 7. 13.
문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/42891

 

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€

μ½”λ“œ μ€‘μ‹¬μ˜ 개발자 μ±„μš©. μŠ€νƒ 기반의 ν¬μ§€μ…˜ 맀칭. ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€μ˜ 개발자 λ§žμΆ€ν˜• ν”„λ‘œν•„μ„ λ“±λ‘ν•˜κ³ , λ‚˜μ™€ 기술 ꢁ합이 잘 λ§žλŠ” 기업듀을 맀칭 λ°›μœΌμ„Έμš”.

programmers.co.kr

무지가 라이브 방솑을 ν•˜κ³ μžˆλ‹€. K초 후에 λ„€νŠΈμ›Œν¬ μž₯μ• λ‘œ 인해 방솑이 μ€‘λ‹¨λœλ‹€. 쀑단 된 이후 λͺ‡ 번 μŒμ‹λΆ€ν„° λ¨Ήμ–΄μ•Όν•˜λŠ”μ§€ λ¬΄μ§€μ—κ²Œ μ•Œλ €μ£Όμž.

 

풀이

νš¨μœ¨μ„± ν…ŒμŠ€νŠΈμ—μ„œλŠ” k의 λ²”μœ„κ°€ 1λΆ€ν„°  2 x 10^13κΉŒμ§€ 주어지기 λ•Œλ¬Έμ— 직접 ν•˜λ‚˜μ”© λ¨Ήμ–΄μ„œ K초 ν›„ λͺ‡ λ²ˆμ„ λ¨ΉλŠ”μ§€ μ•Œμ•„λ‚΄λ €λ©΄ O(20μ‘°) 만큼의 μ‹œκ°„μ΄ κ±Έλ € μ‹œκ°„μ΄ˆκ³Όλ₯Ό λ°›κ²Œλœλ‹€.

직접 λ¨Ήμ–΄λ³΄λŠ” λ°©λ²•μœΌλ‘œλŠ” μ •ν™•μ„± ν…ŒμŠ€νŠΈλŠ” 톡과할 지라도 νš¨μœ¨μ„± ν…ŒμŠ€νŠΈλŠ” μ ˆλŒ€ ν†΅κ³Όν•˜μ§€ λͺ»ν•œλ‹€.

 

λ‚˜λŠ” κ³΅λΆ€ν•˜λŠ” μ‹λΉ΅λ§˜λ‹˜μ˜ λΈ”λ‘œκ·Έλ₯Ό μ°Έκ³ ν•˜λ©° κ³΅λΆ€ν–ˆλ‹€.

 

λ¨Όμ € 주어진 μ˜ˆμ‹œλ₯Ό μ‚΄νŽ΄λ³΄μž.

μž…λ ₯κ°’ 〉	[3, 1, 2], 5

1번 μŒμ‹λΆ€ν„° μ°¨λ‘€λ‘œ λ¨ΉλŠ”λ° 3, 1, 2초의 μ‹œκ°„μ΄ 걸리며 λ„€νŠΈμ›Œν¬ 였λ₯˜λŠ” 5초 후에 λ°œμƒν•œλ‹€.

 

λ‚¨μ•„μžˆλŠ” μŒμ‹λ“€ μ€‘μ—μ„œ κ°€μž₯ 적은 μ‹œκ°„μ΄ ν•„μš”ν•œ μŒμ‹μ„ μ†Œλͺ¨ν•  λ™μ•ˆμ€ λͺ¨λ“  μŒμ‹μ„ μ„­μ·¨ν•  수 μžˆλ‹€.

즉 μŒμ‹μ„ μ‹œκ°„ 순으둜 μ •λ ¬ν•˜λ©΄ [1, 2, 3] 이 되고

κ°€μž₯ 적은 μ‹œκ°„μ΄ μ†Œλͺ¨λ˜λŠ” μŒμ‹μ˜ μ†Œλͺ¨κΈ°κ°„은 1μ΄ˆμ΄λ‹€. ν•œ 바퀴 λ™μ•ˆμ€ λͺ¨λ“  μŒμ‹μ„ μ„­μ·¨ν•  수 μžˆλ‹€λŠ” λœ»μ΄λ‹€.

1바퀴 * 3개(남은 μŒμ‹μ˜ 수) = 3초.

3μ΄ˆκ°€ μ§€λ‚˜κ³  λ‚˜μ„œ μ΅œμ†Œ ν•˜λ‚˜μ˜ μŒμ‹μ΄ λͺ¨λ‘ μ†Œλͺ¨λœλ‹€λŠ” λœ»μ΄λ‹€.

 

μš°λ¦¬λŠ” 직접 μˆœνšŒν•˜μ§€ μ•Šκ³ λ„, 남은 μŒμ‹ 쀑 처음 μŒμ‹μ΄ μ—†μ–΄μ§€λŠ” 데 κ±Έλ¦¬λŠ” μ‹œκ°„μ„ μ•Œ 수 μžˆλ‹€.

이후 μŒμ‹μ€ [0, 1, 2] κ°€ 되고 남은 μŒμ‹μ€ 2κ°œκ°€ λœλ‹€.

λ‚¨μ•„μžˆλ˜ μŒμ‹μ—μ„œ 0이 λ˜μ–΄λ²„λ¦° μŒμ‹μ˜ 수만큼 λΉΌμ„œ 남은 μŒμ‹μ˜ 수λ₯Ό μ•Œμ•„λ‚Έλ‹€.

남은 μŒμ‹ 쀑 μ†Œλͺ¨ 기간이 κ°€μž₯ 적은 μŒμ‹μ˜ μ†Œλͺ¨κΈ°κ°„은 1μ΄ˆλ‹€.

1바퀴 * 2개(남은 μŒμ‹μ˜ 수) = 2초.

2μ΄ˆκ°€ μ§€λ‚˜μ•Ό 또 μƒˆλ‘œμš΄ μŒμ‹μ΄ λͺ¨λ‘ μ†Œλͺ¨λœλ‹€.

2초 이후 남은 μŒμ‹μ€ [0, 0, 1] 이 λœλ‹€.

μ΄λ•Œ K = 3 + 2둜 5초.

 

λ„€νŠΈμ›Œν¬ λ§ˆλΉ„ μ‹œκ°„μΈ 5μ΄ˆκ°€ λ˜μ—ˆκ³ , λ‹€μŒμ— 먹을 μŒμ‹μ€ 남은 μŒμ‹λ“€ 쀑 첫 번째둜 λ“±μž₯ν•˜λŠ” μŒμ‹μ΄ 닡이 λœλ‹€.

ν•˜μ§€λ§Œ μ •λ ¬ ν•œ 이후이기 λ•Œλ¬Έμ— λ‚¨μ•„μžˆλŠ” μŒμ‹λ“€μ΄ 기쑴에 λͺ‡ 번째 μŒμ‹μ΄μ—ˆλŠ” 지 μ•Œ 수 μ—†λ‹€.

λ”°λΌμ„œ μŒμ‹μ„ μ •λ ¬ν•˜κΈ° μ „ foods λΌλŠ” μƒˆλ‘œμš΄ pair<int,int> 벑터λ₯Ό λ§Œλ“€μ–΄μ„œ

foods -> first μ—λŠ” μŒμ‹μ˜ μ†Œλͺ¨ μ‹œκ°„μ„, foods -> second μ—λŠ” μŒμ‹μ˜ 번호λ₯Ό μ €μž₯ν•΄λ‘”λ‹€.

 

μ˜ˆμ‹œλ₯Ό 쑰금 더 크게 λ“€μ–΄λ³΄μž.

μž…λ ₯κ°’ 〉	[4, 2, 2, 2, 15, 4], 16

6개의 μŒμ‹μ΄ μ‘΄μž¬ν•˜λ©°, λ„€νŠΈμ›Œν¬λŠ” 16초 후에 λ§ˆλΉ„ λœλ‹€.

 

λ¨Όμ € μŒμ‹λ“€μ„ μ‹œκ°„ μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•œλ‹€ => [2, 2, 2, 4, 4, 15] 

초기 λ‚¨μ•„μžˆλŠ” μŒμ‹μ˜ μˆ˜λŠ” 총 μŒμ‹μ˜ μˆ˜μ™€ κ°™λ‹€ N = 6.

μ†Œμ§„λ˜λŠ”λ° κ°€μž₯ 적은 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” μŒμ‹μ˜ μ†Œλͺ¨ μ‹œκ°„μ€ 2μ΄ˆλ‹€.

νšŒμ „νŒμ„ 두 바퀴λ₯Ό 돌 λ™μ•ˆμ—λŠ” μ™„μ „νžˆ μ†Œλͺ¨λ˜λŠ” μŒμ‹μ΄ μ—†λ‹€λŠ” μ˜λ―Έμ΄λ‹€.

2바퀴 * 6개(남은 μŒμ‹) = 12초.

12μ΄ˆκ°€ μ§€λ‚˜κ³  μƒˆλ‘­κ²Œ μ™„μ „νžˆ μ†Œλͺ¨λœ μŒμ‹μ΄ λ‚˜μ˜¨λ‹€λŠ” λœ»μ΄λ‹€.

2바퀴 ν›„ λͺ¨λ‘ μ†Œμ§„λœ μŒμ‹μ€ 3개. λ”°λΌμ„œ 남은 μŒμ‹μ€ 6 - 3 = 3개

ν˜„μž¬ νšŒμ „νŒμ˜ 상황은 [0, 0, 0, 2, 2, 15]

μ†Œμ§„λ˜λŠ”λ° κ°€μž₯ 적은 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” μŒμ‹μ˜ μ†Œλͺ¨ μ‹œκ°„μ€ 2μ΄ˆλ‹€.

2바퀴 * 3개(남은 μŒμ‹) = 6초.

또 λ‹€μ‹œ 6μ΄ˆκ°€ μ§€λ‚˜μ•Ό μƒˆλ‘œμš΄ μŒμ‹μ΄ μ™„μ „νžˆ μ†Œλͺ¨λœλ‹€.

그런데 12초 + 6초 = 18초 > k

μƒˆλ‘œμš΄ μŒμ‹μ΄ μ†Œλͺ¨λ˜κΈ° 전에 λ„€νŠΈμ›Œν¬ 였λ₯˜κ°€ λ°œμƒν•œλ‹€λŠ” λœ»μ΄λ‹€.

ν˜„μž¬ μ‹œκ°„μ€ 12μ΄ˆκ°€ μ§€λ‚œ μƒνƒœμ΄λ―€λ‘œ 4μ΄ˆλ’€μ— 였λ₯˜κ°€ λ°œμƒν•˜λŠ” 것을 μ•Œ 수 μžˆλ‹€.

남은 μŒμ‹μ€ 3개. 즉 ν•œλ°”ν€΄κ°€ λŒκ³ λ„ 1μ΄ˆκ°€ 지났을 λ•Œ 였λ₯˜κ°€ λ°œμƒν•œλ‹€.

λ”°λΌμ„œ 1μ΄ˆκ°€ μ§€λ‚œ ν›„ μ–΄λ–€ μŒμ‹μ„ 먹게 될지λ₯Ό κ΅¬ν•˜λŠ” 것과 λ˜‘κ°™λ‹€.

 k(남은 μ‹œκ°„) %= n(남은 μŒμ‹μ˜ 수) 의 과정을 톡해 μˆœνšŒν•˜λŠ” μ‹œκ°„μ„ 쀄여쀀닀.

남은 μŒμ‹λ“€ [ 2, 2, 15 ] 쀑 1초 후에 첫번째 μŒμ‹μ„ 먹게되고, 방솑을 λ‹€μ‹œ 켰을 λ•Œ λ¨Ήμ–΄μ•Ό ν•  μŒμ‹μ€ 두 λ²ˆμ§Έμ— μžˆλŠ” μŒμ‹μ΄λ‹€.

 

남은 μŒμ‹λ“€μ„ 기쑴의 μŒμ‹ 번호 μˆœμ„œλŒ€λ‘œ μ •λ ¬ν•΄ μ€€ ν›„, k λ²ˆμ§Έμ— μžˆλŠ” μŒμ‹μ˜ μŒμ‹ 번호λ₯Ό λ¦¬ν„΄ν•˜λ©΄ λœλ‹€.

 

μ½”λ“œ μž‘μ„±
 
#include <bits/stdc++.h>
using namespace std;
 
bool cmp(const pair<int,int>& a, const pair<int,int>& b){
    if(a.second < b.second)
        return true;
    return false;
}
 
int solution(vector<int> food_times, long long k) {
    int answer = 0;
    vector<pair<int,int>> foods;
    for(int i = 0; i<food_times.size(); i++)
        foods.push_back({food_times[i], i + 1}); //κ±Έλ¦¬λŠ” μ‹œκ°„, μ›λž˜ μˆœμ„œ
    //μ •λ ¬ ν›„에도 μ›λž˜ μˆœμ„œλ₯Ό μžƒμ§€ μ•ŠκΈ°μœ„ν•΄μ„œ
    
    sort(foods.begin(), foods.end());//λ¨ΉλŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μˆœμ— λ”°λΌ μ •λ ¬
 
    int n = food_times.size(); //λ‚¨μ•„μžˆλŠ” μŒμ‹μ˜ κ°œμˆ˜
    int pre = 0//직전 μŒμ‹μ„ λ‹€λ¨Ήμ€ μ‹œκ°„
    
    for(vector<pair<int,int>>::iterator it = foods.begin(); it != foods.end(); it++){
        long long spend = (long long)(it->first - pre) * n;
        if(spend == 0){ //이미 μ‹œκ°„이 κ³„μ‚°λœ μŒμ‹μž„
            n--;
            continue;
        }
        if(spend <= k){ //아직 λ°©μ†‘이 μ’…λ£Œλ˜μ§€ μ•ŠμŒ
            k -= spend;
            pre = it->first;
            n--;
        }
        else//λ°©μ†‘μ‹œκ°„ μ΄ˆκ³Ό => μˆœνšŒλ₯Ό ν†΅ν•΄ λͺ‡ λ²ˆμ§Έ μŒμ‹μ„ λ¨Ήμ–΄μ•Όν• μ§€ μ°Ύμ•„야함
            k %= n; //kκ°€ λ‚¨μ•„μžˆλŠ” μŒμ‹ μˆ˜λ³΄λ‹€ λ§ŽμœΌλ©΄ μ—¬λŸ¬λ²ˆ νšŒμ „해야함
            sort(it, foods.end(), cmp); //λ‚¨μ•„μžˆλŠ” μŒμ‹μ„ λ²ˆν˜Έμˆœμ„œλŒ€λ‘œ μ •λ ¬
            return (it + k)->second;
        }
    }
    return -1;
}
cs

 

ν•œ 바퀴λ₯Ό λ„λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μ΄, 남은 μŒμ‹μ˜ μˆ˜μ™€ 같을 κ²ƒμ΄λΌλŠ” 생각은 ν–ˆμ§€λ§Œ

λ‚˜λŠ” ν•œ λ²ˆμ— ν•œ 바퀴씩 λŒμ•„μ„œ μ‹œκ°„μ΄ˆκ³Όλ₯Ό λ°›μ•˜λ‹€.

μ—¬λŸ¬λ°”ν€΄λ₯Ό ν•œ λ²ˆμ— κ³„μ‚°ν•˜λ € ν–ˆμ§€λ§Œ, λ§Œμ•½ kλ₯Ό λ„˜κ²Œλμ„ λ•Œ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•΄μ•Όν•  지 λͺ°λΌμ„œ λͺ» ν’€μ—ˆλ‹€.

 

μ•Œκ³ λ¦¬μ¦˜μ„ μž˜ν•˜λŠ” μ‚¬λžŒλ“€μ„ 보면 μ–΄λ–»κ²Œ 이런 방법을 생각 ν•΄λ‚΄λŠ” 지 μ‹ κΈ°ν•˜λ‹€.

728x90