[c++] ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค :: ์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ (๋ฌธ์ œ ํ’€์ด, ์ฝ”๋“œ)

์ง•๊ฒ€๋‹ค๋ฆฌ ๊ฑด๋„ˆ๊ธฐ

๋ฌธ์ œ

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

 

๋ฌธ์ œ ์„ค๋ช…

[๋ณธ ๋ฌธ์ œ๋Š” ์ •ํ™•์„ฑ๊ณผ ํšจ์œจ์„ฑ ํ…Œ์ŠคํŠธ ๊ฐ๊ฐ ์ ์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.]

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

  • ์ง•๊ฒ€๋‹ค๋ฆฌ๋Š” ์ผ๋ ฌ๋กœ ๋†“์—ฌ ์žˆ๊ณ  ๊ฐ ์ง•๊ฒ€๋‹ค๋ฆฌ์˜ ๋””๋”ค๋Œ์—๋Š” ๋ชจ๋‘ ์ˆซ์ž๊ฐ€ ์ ํ˜€ ์žˆ์œผ๋ฉฐ ๋””๋”ค๋Œ์˜ ์ˆซ์ž๋Š” ํ•œ ๋ฒˆ ๋ฐŸ์„ ๋•Œ๋งˆ๋‹ค 1์”ฉ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  • ๋””๋”ค๋Œ์˜ ์ˆซ์ž๊ฐ€ 0์ด ๋˜๋ฉด ๋” ์ด์ƒ ๋ฐŸ์„ ์ˆ˜ ์—†์œผ๋ฉฐ ์ด๋•Œ๋Š” ๊ทธ ๋‹ค์Œ ๋””๋”ค๋Œ๋กœ ํ•œ๋ฒˆ์— ์—ฌ๋Ÿฌ ์นธ์„ ๊ฑด๋„ˆ ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‹จ, ๋‹ค์Œ์œผ๋กœ ๋ฐŸ์„ ์ˆ˜ ์žˆ๋Š” ๋””๋”ค๋Œ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ๋ฌด์กฐ๊ฑด ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ๋””๋”ค๋Œ๋กœ๋งŒ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ˆ๋‹ˆ์ฆˆ ์นœ๊ตฌ๋“ค์€ ๊ฐœ์šธ์˜ ์™ผ์ชฝ์— ์žˆ์œผ๋ฉฐ, ๊ฐœ์šธ์˜ ์˜ค๋ฅธ์ชฝ ๊ฑด๋„ˆํŽธ์— ๋„์ฐฉํ•ด์•ผ ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„Œ ๊ฒƒ์œผ๋กœ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค.
๋‹ˆ๋‹ˆ์ฆˆ ์นœ๊ตฌ๋“ค์€ ํ•œ ๋ฒˆ์— ํ•œ ๋ช…์”ฉ ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ์•ผ ํ•˜๋ฉฐ, ํ•œ ์นœ๊ตฌ๊ฐ€ ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๋ชจ๋‘ ๊ฑด๋„Œ ํ›„์— ๊ทธ ๋‹ค์Œ ์นœ๊ตฌ๊ฐ€ ๊ฑด๋„ˆ๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋””๋”ค๋Œ์— ์ ํžŒ ์ˆซ์ž๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ๋‹ด๊ธด ๋ฐฐ์—ด stones์™€ ํ•œ ๋ฒˆ์— ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ๋Š” ๋””๋”ค๋Œ์˜ ์ตœ๋Œ€ ์นธ์ˆ˜ k๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, ์ตœ๋Œ€ ๋ช‡ ๋ช…๊นŒ์ง€ ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ ์ˆ˜ ์žˆ๋Š”์ง€ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”.

 

[์ œํ•œ์‚ฌํ•ญ]

  • ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„ˆ์•ผ ํ•˜๋Š” ๋‹ˆ๋‹ˆ์ฆˆ ์นœ๊ตฌ๋“ค์˜ ์ˆ˜๋Š” ๋ฌด์ œํ•œ ์ด๋ผ๊ณ  ๊ฐ„์ฃผํ•ฉ๋‹ˆ๋‹ค.
  • stones ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๋Š” 1 ์ด์ƒ 200,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • stones ๋ฐฐ์—ด ๊ฐ ์›์†Œ๋“ค์˜ ๊ฐ’์€ 1 ์ด์ƒ 200,000,000 ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.
  • k๋Š” 1 ์ด์ƒ stones์˜ ๊ธธ์ด ์ดํ•˜์ธ ์ž์—ฐ์ˆ˜์ž…๋‹ˆ๋‹ค.

[์ž…์ถœ๋ ฅ ์˜ˆ]

stones k result
[2, 4, 5, 3, 2, 1, 4, 2, 5, 1] 3 3
 

 

์ฝ”๋“œ & ํ’€์ด & ์ฑ„์  ๊ฒฐ๊ณผ

์ •๋ง ์–ด๋ ต๊ฒŒ ์™„์„ฑํ•œ ๋ฌธ์ œ ํ’€์ด ใ… ใ…  ํ๋ฆ„์— ๋”ฐ๋ผ์„œ ๊ธฐ์ˆ ํ•ด๋ณด๊ฒ ๋‹ค.

 

๋ฌธ์ œ ๊ทธ๋Œ€๋กœ ํ•ด์„

์ฒ˜์Œ์—๋Š” ๋ฌธ์ œ๋ฅผ ๊ทธ๋Œ€๋กœ ํ•ด์„ํ•˜์—ฌ ํ•œ ๋ช…์ด ์ง€๋‚˜๊ฐˆ ๋•Œ๋งˆ๋‹ค ๊ฐ ์›์†Œ์—์„œ 1์”ฉ์„ ๋นผ๋ฉด์„œ ์—ฐ์†๋œ 0์˜ ๊ฐฏ์ˆ˜๋ฅผ counting ํ•˜๋Š” ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งฐ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•ด๋„ ๋™์ž‘์€ ์ž˜ ๋œ๋‹ค. ํšจ์œจ์„ฑ ์ธก๋ฉด์—์„œ ์•ˆ ์ข‹์„ ๋ฟ.

๋ชจ๋“  ์›์†Œ๋ฅผ ๊ฑฐ์น˜๋Š” ๋ฐ์— ์ตœ๋Œ€ n์˜ ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ๋“ค๊ณ  ์ด๋ฅผ while๋ฌธ์„ ํ†ตํ•ด k๋ฒˆ ๋ฐ˜๋ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ํ•ด๋‹น ์ฝ”๋“œ๋Š” O(nk)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„๋‹ค.

 
์ฝ”๋“œ
#include <string>
#include <vector>

using namespace std;

int solution(vector<int> stones, int k) {
    int answer = 0;
    int length = stones.size();
    int count =0;
    int max_count =0;

    while(max_count<k){
        count = 0;
        answer++;

        for(int i=0; i<length; i++){
            if(stones[i]>0) // ์ด๋ฏธ 0์ด๋ฉด ๋นผ์ง€ ๋ง๊ธฐ
                stones[i]-=1;
            if(stones[i]==0) // ๊ฒฐ๊ณผ๊ฐ€ 0์ด๋ฉด count ์ฆ๊ฐ€
                count++;
            else{ // ์ด์ „๊นŒ์ง€์˜ ์—ฐ์†๋œ 0์˜ ๊ฐฏ์ˆ˜ ์ €์žฅ
                if(max_count<count){
                    max_count=count;
                    if(max_count>=k)
                        break;
                }
                count=0;
            }
        }
        if(max_count<count){ // ๋งˆ์ง€๋ง‰ ์›์†Œ๊ฐ€ 0์ผ ๋•Œ count ํŒ๋‹จ
            max_count=count;
        }
    }

    return answer;
}
 
๊ฒฐ๊ณผ

8๋ฒˆ๊นŒ์ง€ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ธธ๋ž˜ ๋ฐ”๋กœ ๋‹ค์Œ ๋ฐฉ๋ฒ•์„ ์ฐพ์•„ํ—ค๋งธ๋‹ค.

 

k ๋ฌถ์Œ์˜ ์ตœ๋Œ“๊ฐ’ ์ค‘ ์ตœ์†Œ๋ฅผ ์ฐพ๋Š” ๋ฐฉ๋ฒ•

 ์ด ๋ฐฉ๋ฒ•์€ k๋ฒˆ์„ ๊ณง์ด ๊ณง๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ฒ—์–ด๋‚˜ ํ•œ ๋ฒˆ์— 0์˜ ๊ฐฏ์ˆ˜๋ฅผ ์ธก์ •ํ•˜๊ณ ์ž ํ•ด์„œ ๋‚˜์˜จ ๋ฐฉ๋ฒ•์ด๋‹ค. ์ฃผ์–ด์ง„ stones ๋ฐฐ์—ด์„ k๊ฐœ์”ฉ ๋ฌถ์€ ํ›„ k๊ฐœ ์ค‘ ๊ฐ€์žฅ ํฐ ์š”์†Œ๋ฅผ ํƒํ•˜๋ฉด ํ•ด๋‹น ์š”์†Œ์˜ ์‚ฌ๋žŒ์ด ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„œ์„ ๋•Œ ๋ฌถ์ธ ์š”์†Œ๋“ค์€ ๋ชจ๋‘ 0 ์ดํ•˜๊ฐ€ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ ํ•œ ๋ฒˆ์— ๋ฌถ์ธ k๊ฐœ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

 

 ์ด๋ ‡๊ฒŒ ์—ฐ์†๋œ k๊ฐœ๋ฅผ 0์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ฌถ์Œ์˜ ์ตœ๋Œ“๊ฐ’ ์ค‘ ์ตœ์†Œ๋ฅผ ์ฐพ์•„์•ผํ•œ๋‹ค. ์ด ๊ฐ’์ด ์†ํ•œ ๋ฌถ์Œ์ด ๋ชจ๋‘ 0์ด ๋˜๋ฉด ์–ด์ฐจํ”ผ ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๋ชป ๊ฑด๋„ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ณด๋‹ค ํฐ ๊ฐ’์€ ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.

 ์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๋ฉด k๋ฌถ์Œ์˜ ์ตœ๋Œ€๊ฐ’์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์— nk๋งŒํผ์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•˜๊ณ  ์ตœ๋Œ€๊ฐ’์˜ ์ตœ์†Œ๋ฅผ ๊ตฌํ•˜๋Š” ๊ฒƒ์— k๋งŒํผ์˜ ์‹œ๊ฐ„์ด ํ•„์š”ํ•ด์„œ ๋˜‘๊ฐ™์ด O(nk)์ด๋‹ค.

 

 ์ค‘๊ฐ„์— ํ•œ ๋ป˜์ง“์œผ๋กœ๋Š” ์ตœ์†Œํ•ฉ์„ ๊ฐ€์ง„ k๋ฌถ์Œ์„ ๊ตฌํ•˜์—ฌ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ๊ธฐ (์ตœ์†Œํ•ฉ์ด๋ผ๊ณ ํ•ด์„œ ์ตœ๋Œ€๊ฐ’์ด ์ตœ์†Œ์ธ ๊ฒƒ์ด ์•„๋‹˜), ํƒ‘ ๋ฌธ์ œ์ฒ˜๋Ÿผ ์ƒ๊ฐํ•ด์„œ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ตฌ๊ฐ„ ์ฐพ๊ธฐ (์–ด์ฐจํ”ผ ์ตœ๋Œ€๊ฐ’์„ ์ฐพ์•„์•ผํ•ด์„œ ์‹œ๊ฐ„ ๋ณต์žก๋„๊ฐ€ ๋˜‘๊ฐ™์Œ)

 
์ฝ”๋“œ
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int solution(vector<int> stones, int k) {
    int answer = 0;
    int size = stones.size();

    answer = *max_element(stones.begin(), stones.begin()+k); // ์ฒซ k๋ฌถ์Œ ์ค‘ ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ

    for(int i=1; i<size-k+1; i++){
        int max = *max_element(stones.begin()+i, stones.begin()+i+k); // k๊ฐœ์”ฉ ๋ฌถ์œผ๋ฉด์„œ ์ตœ๋Œ€๊ฐ’ ์ฐพ๊ธฐ
        if(max<answer)
            answer = max; // ์ตœ๋Œ€๊ฐ’ ์ค‘ ์ตœ์†Œ๊ฐ’ ์ฐพ๊ธฐ
    }

    return answer;
}
 
๊ฒฐ๊ณผ

๋ฐ˜์ฏค์€ ํ†ต๊ณผํ–ˆ์ง€๋งŒ ๋ฐ˜์€ ์‹คํŒจ๋‹ค.


 

์—ฌ๊ธฐ๊นŒ์ง€ ์ •๋ฆฌํ•ด๋ณด๋ฉด n ์ž์ฒด๊ฐ€ 2*10^5์ด๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ O(n^2)๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๊ฒŒ ๋˜๋ฉด ํ’€๊ธฐ ์–ด๋ ต๋‹ค. ํ•˜์ง€๋งŒ ์œ„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์˜ ๋Œ€๋ถ€๋ถ„ O(n^2)์— ๊ฐ€๊น๊ณ , O(nlgn) ์ •๋„์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฐพ์„ ์ˆ˜๊ฐ€ ์—†์—ˆ๋‹ค. stones ๋ฐฐ์—ด์„ ํ•œ ๋ฒˆ์€ ํ›‘์–ด์•ผํ•ด์„œ n๋งŒํผ์˜ ์‹œ๊ฐ„์€ ํ•„์š”ํ•˜์ง€๋งŒ ํ›‘์œผ๋ฉด์„œ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์จ์•ผ lgn ๋งŒ์— ์ •๋‹ต์„ ์ฐพ์„ ์ˆ˜ ์žˆ์„๊นŒ๋ฅผ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๊ฒฐ๊ตญ ์งˆ๋ฌธํ•˜๊ธฐ๋ฅผ ํ†ตํ•ด์„œ ๋‹ต์„ ์–ป์—ˆ๋‹ค.

๋ณธ์ธ์€ ๋ฐฐ์—ด์„ ๋ฌด์กฐ๊ฑด ํ›‘์œผ๋ฉด์„œ ํ•œ ๋ฒˆ์— ๋‹ต์„ ์ฐพ์•„์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ›‘์–ด๋ณด๋Š”๋ฐ์— n์ด๋ผ๋Š” ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋‹ˆ๊นŒ ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ํ›‘์–ด๋ณด๋ฉด n*(ํ›‘์–ด๋ณธ ํšŸ์ˆ˜)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ •๋‹ต ์š”์†Œ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด์—์„œ ๋ช‡ ๋ฒˆ์„ ํƒ์ƒ‰ํ•ด์•ผํ• ๊นŒ๋ฅผ ์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹ต์€ ๊ฐ„๋‹จํ•˜๋‹ค. lgn์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง„ ์ด์ง„ ํƒ์ƒ‰์ด ๋‹ต์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ด์ง„ ํƒ์ƒ‰์„ ์‹œ๋„ํ•˜์—ฌ k๋ฅผ ์ถ”์ธกํ•ด๋‚˜๊ฐ€๋Š” ๊ฒƒ์ด ์ด ๋ฌธ์ œ์˜ ํ•ต์‹ฌ์ด๋‹ค.

 


 

์ด์ง„ ํƒ์ƒ‰

์ฝ”๋“œ
#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int isItWork(int num, vector<int>& stones){ 
    int max = 0;
    int zero_num = 0;
    for(int i=0; i<stones.size(); i++){
        if(stones[i]<=num)
            zero_num++;
        else{
            if(max<zero_num)
                max = zero_num;
            zero_num=0;
        }  
    }
    if(max<zero_num)
        max = zero_num;
    return max; // ์ฃผ์–ด์ง„ ์ˆ˜์˜ ์ธ์›์ด ์ง•๊ฒ€๋‹ค๋ฆฌ๋ฅผ ๊ฑด๋„œ์„ ๋•Œ 0์ด ๋˜๋Š” ๋Œ์˜ ๊ฐฏ์ˆ˜
}

int solution(vector<int> stones, int k) {
    int answer = 0;
    int s = 1;
    int e = *max_element(stones.begin(), stones.end());
    int mid;

    while(s!=e){
        mid = (int)((s+e)/2); // ์ค‘๊ฐ„ ๊ฐ’ ํƒ์ƒ‰
        int res = isItWork(mid, stones);
        if(res>=k){ // k๋ณด๋‹ค 0์ด ๋˜๋Š” ๋Œ์˜ ์ˆ˜๊ฐ€ ๋” ๋งŽ์œผ๋ฉด, ๋” ์ž‘์€ ๋ฒ”์œ„์—์„œ ์ฐพ๊ธฐ
            e = mid;
        }else if(res<k){
            s = mid+1;
        }
    }  
    answer = s;

    return answer;
}
 
๊ฒฐ๊ณผ

๋“œ๋””์–ด 100์ !

๋ฐ˜์‘ํ˜•