์ง๊ฒ๋ค๋ฆฌ ๊ฑด๋๊ธฐ
๋ฌธ์
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์ !
Comment