๋ฌธ์ ๋งํฌ
https://school.programmers.co.kr/learn/courses/30/lessons/42586
๐ ๋ฌธ์ ์์ฝ
๊ฐ ๊ธฐ๋ฅ์ ์์๋๋ก ๊ฐ๋ฐ๋๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ๊ฐ์ง๋ค.
- ๊ธฐ๋ฅ๋ง๋ค ํ์ฌ ์งํ๋ฅ (progresses)๊ณผ ํ๋ฃจ ๊ฐ๋ฐ ์๋(speeds)๊ฐ ์ฃผ์ด์ง๋ค.
- ๊ธฐ๋ฅ์ ์์ ์๋ ๊ธฐ๋ฅ์ด ์๋ฃ๋์ด์ผ๋ง ๋ฐฐํฌ ๊ฐ๋ฅํ๋ค.
- ํ๋ฃจ๊ฐ ์ง๋ ๋๋ง๋ค ๋ชจ๋ ๊ธฐ๋ฅ์ ์งํ๋ฅ ์ด ์ฆ๊ฐํ๋ค.
- ๋ฐฐํฌ ์์๋ ์ฐ์๋ ๊ธฐ๋ฅ๋ค๋ง ํจ๊ป ๋ฐฐํฌ๋๋ค.
์ ์ถ๋ ฅ ์
| progres | speed | return |
| [93, 30, 55] | [1, 30, 5] | [2, 1] |
| [95, 90, 99, 99, 80, 99] | [1, 1, 1, 1, 1, 1] | [1, 3, 2] |
๐ญ ์ฒ์ ์ ๊ทผ: “์์ธํธ์ค ๋ฌธ์ ์ฒ๋ผ ์๋ฒ์ ๊ณ์ ๋๊ฒจ์ผ ํ๋ค?”
๋ฌธ์ ๋ฅผ ์ฒ์ ๋ดค์ ๋ ๋ ์ฌ๋ฆฐ ์๊ฐ์ ์ด๋ฌ๋ค.
- ์์ ๋ค์ด ์์๋๋ก ์ค์ ์ ์์
- ์ ์์ ์ด ๋๋์ผ ๋ค ์์ ๋ ๋๊ฐ ์ ์์
- ๋งค์ผ ๋ชจ๋ ์์ ์ ์งํ๋ฅ ์ด ์ฆ๊ฐํจ
๐ ์์๋ฅผ ์ ์งํ๋ฉด์ ๊ณ์ ์ํํด์ผ ํ๋ฏ๋ก
๐ ์์ฐ์ค๋ฝ๊ฒ Queue๊ฐ ๋ ์ฌ๋๋ค.
๊ทธ๋์ “ํ๋ฃจํ๋ฃจ ์งํ์ํค๋ ์๋ฎฌ๋ ์ด์ ” ๋ฐฉ์์ผ๋ก ํ์๋ค.
์ฒซ ๋ฒ์งธ ํ์ด (์๋ฎฌ๋ ์ด์ ๊ธฐ๋ฐ)
#include <string>
#include <vector>
#include <queue> //์ ๊ผญ queue์ฌ์ผ ํ๋์ง ์๊ฐ
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
queue<int> q;
queue<int> s;
//progresses๊ฐ ์ค์ด๋ค๋ฉด speeds๋ ์ค์ด๋ฆ -> ๋ฐ๋ณตํ์ ๋งค๋ฒ ๋ค๋ฆ
// ํ ๋ฒ์ ์ํ๋ speeds์ ๊ฐ์๋งํผ
vector<int> answer;
for(int i=0;i<progresses.size();i++){
q.push(progresses[i]);
s.push(speeds[i]);
}
int num;
while(!q.empty()){
num=0;
int l=s.size();
for(int j=0;j<l;j++){
int spe= s.front();
int tmp=q.front()+=spe;
q.pop();
s.pop();
q.push(tmp);
s.push(spe);
}
for(int j=0;j<l;j++){
int t= q.front();
if(t>=100){
q.pop();
s.pop();
num++;
}
}
if(num == 0) continue;
answer.push_back(num);
}
return answer;
}
๐ ๊ฒฐ๊ณผ๋ ๋ง์์ง๋ง, ์์งํ ๋งํด “์ด์ง ๋๋ ค๋ง์ถ ๋๋”์ด ๊ฐํ๋ค.
์ ์ด ๋ฌธ์ ๊ฐ ํ(Queue) ๋ฌธ์ ์ธ๊ฐ?
1. FIFO๊ฐ ๋ฐ๋์ ๋ณด์ฅ๋์ด์ผ ํ๋ค
๋ฌธ์ ์ ํต์ฌ ์กฐ๊ฑด:
๋ค์ ์๋ ๊ธฐ๋ฅ์ด ๋จผ์ ์์ฑ๋ผ๋,
์์ ์๋ ๊ธฐ๋ฅ์ด ๋ฐฐํฌ๋ ๋ ํจ๊ป ๋ฐฐํฌ๋๋ค
์ฆ,
- ์์๊ฐ ์ ๋ ๋ค๋ฐ๋๋ฉด ์ ๋จ
- ํญ์ ๋งจ ์(front)๋ง ํ์ธํ๋ฉด ๋จ
๐ FIFO(First-In First-Out) ๊ตฌ์กฐ๊ฐ ์ ํํ ๋ง์๋จ์ด์ง๋ค.
2. ์ ๋(Front)์ ์ํ๊ฐ ์ ์ฒด๋ฅผ ๊ฒฐ์ ํ๋ค
- ์ ๊ธฐ๋ฅ์ด 100%๊ฐ ์๋๋ฉด → ์๋ฌด๋ ๋ฐฐํฌ ๋ถ๊ฐ
- ์ ๊ธฐ๋ฅ์ด 100%๊ฐ ๋๋ฉด → ๋ค์์ ์ฐ์์ผ๋ก ๊ฐ๋ฅํ ๋งํผ ๋ฐฐํฌ
๐ ์ฐ๋ฆฌ๋ ํญ์ front๋ง ๊ด์ฐฐํ๋ฉด ๋๋ค.
3. ์๋ฃ๊ตฌ์กฐ ์ ํ ๋ง์ธ๋์
์ฝํ ์์ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฅผ ๋ ์ค์ค๋ก์๊ฒ ๋์ง๋ ์ง๋ฌธ:
- ๋จผ์ ๋ค์ด์จ ๊ฒ ๋จผ์ ๋๊ฐ์ผ ํ๋? → Queue
- ์ต๊ทผ ๊ฒ์ด ์ค์ํ๋? → Stack
- ์ค๊ฐ ์ฝ์ /์ญ์ ๊ฐ ๋ง๋? → Linked List
- ๋น ๋ฅธ ์กฐํ๊ฐ ์ค์ํ๊ฐ? → Hash(Map/Set)
๐ ์ด ๋ฌธ์ ๋
“์์ ๋ค์ด ์ค ์ ์๊ณ , ์์ฌ๋์ด ์ ๋๊ฐ๋ฉด ๋ท์ฌ๋๋ ๋ชป ๋๊ฐ๋ค”
→ Queue๊ฐ ์ ๋ต
ํ์ฌ ํ์ด์ ํ๊ณ
ํ์ฌ ํ์ด๋ “ํ๋ฃจํ๋ฃจ ์๋ฎฌ๋ ์ด์ ” ๋ฐฉ์์ด๋ค.
- ์์ ์ด 1% ๋จ๊ณ ์๋๊ฐ 1์ด๋ฉด → 99๋ฒ ๋ฐ๋ณต
- ์ต์ ์ ๊ฒฝ์ฐ ๋ถํ์ํ ๋ฐ๋ณต์ด ๋ง์์ง
๐ ์๊ฐ ๋ณต์ก๋๋ ๋ถํ์ํ๊ฒ ์ปค์ง๋ค
์ฌ๊ณ ์ ํ: ์๋ฎฌ๋ ์ด์ → ์ํ์ ๋ชจ๋ธ๋ง
ํต์ฌ ์์ด๋์ด
“๊ตณ์ด ํ๋ฃจ์ฉ ์งํํ ํ์๊ฐ ์์๊น?”
“๊ฐ ๊ธฐ๋ฅ์ด ๋ฉฐ์น ๋ค์ ๋๋๋์ง๋ง ์๋ฉด ๋์ง ์์๊น?”
์ต์ ํ ํฌ์ธํธ 1: ๋จ์ ์ผ์ ๊ณ์ฐ
- ๋จ์ ์์ ๋: 100 - progresses[i]
- ํ๋ฃจ ์์ ๋: speeds[i]
- ํ์ํ ์ผ์ (์ฌ๋ฆผ ์ฒ๋ฆฌ):
์ต์ ํ ํฌ์ธํธ 2: ์๋ฃ์ผ ๊ธฐ์ค ๋ฌถ๊ธฐ
- ์ ๊ธฐ๋ฅ์ ์๋ฃ์ผ์ ๊ธฐ์ค์ผ๋ก
- ๊ทธ๋ณด๋ค ๋นจ๋ฆฌ ๋๋๋ ๊ธฐ๋ฅ์ ํจ๊ป ๋ฐฐํฌ
๊ฐ์ ๋ ํ์ด (O(N))
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
queue<int> days;
// 1. ๋ชจ๋ ๊ธฐ๋ฅ์ 'ํ์ ์ผ์'๋ฅผ ๋ฏธ๋ฆฌ ๊ณ์ฐํด์ ํ์ ๋ฃ๊ธฐ
for (int i = 0; i < progresses.size(); i++) {
int day = (99 - progresses[i]) / speeds[i] + 1;
days.push(day);
}
// 2. ํ๊ฐ ๋น ๋๊น์ง ๋ฐฐํฌ ๋ฌถ์ ๊ณ์ฐ
while (!days.empty()) {
int current_deploy_day = days.front(); // ๊ธฐ์ค์ด ๋๋ ์์ ๊ธฐ๋ฅ์ ์์ฑ์ผ
days.pop();
int count = 1;
// ๊ธฐ์ค์ผ๋ณด๋ค ๋นจ๋ฆฌ ๋๋๋ ๋ค์ ๊ธฐ๋ฅ๋ค์ ํ๊บผ๋ฒ์ pop
while (!days.empty() && days.front() <= current_deploy_day) {
days.pop();
count++;
}
answer.push_back(count);
}
return answer;
}
์ด ๋ฌธ์ ์์ ๋ฐฐ์ด ์
- ์๋ฎฌ๋ ์ด์
vs ์ํ์ ์ ๊ทผ
- ์๋ฎฌ๋ ์ด์ ์ ์ง๊ด์ ์ด์ง๋ง ๋๋ฆด ์ ์์
- ๊ฒฐ๊ณผ๊ฐ(์๋ฃ์ผ)์ ๋ฏธ๋ฆฌ ๊ณ์ฐํ๋ฉด ํจ์ฌ ํจ์จ์
- ํ๋ ๋จ์ํ ์ ์ฅ์๊ฐ ์๋๋ค
- ๊ธฐ์ค(front)์ ์ก๊ณ
- ๊ทธ ๊ธฐ์ค๊ณผ ๋น๊ตํ๋ฉฐ ํ๋ฆ์ ์ ์ดํ๋ ๋๊ตฌ
- “์ ์ด ์๋ฃ๊ตฌ์กฐ์ธ๊ฐ?”๋ฅผ ์ค๋ช
ํ ์ ์์ด์ผ ํ๋ค
→ ์ด ๋ฌธ์ ๊ฐ ์ข์ ์ฐ์ต ๋ฌธ์ ์ธ ์ด์
๐ ๊ฐ์ธ ๋ฌธ์ ํ์ด ๋ ํฌ
'Algorithms > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๋ฐฑ์ค] ๋ฌธ์์ด ์งํฉ 14425 (Silver4) - C++ Hash ํจ์ (1) | 2026.01.21 |
|---|---|
| [๋ฐฑ์ค] ๋ ์์ ํฉ 3273 (Silver3) โ ํด์ ๊ฐ๋ ์ผ๋ก ์๊ฐ๋ณต์ก๋ ์ค์ด๊ธฐ (0) | 2026.01.21 |
| [๋ฐฑ์ค] ์์ธํธ์ค ๋ฌธ์ 1158 (Silver4) - C++ (0) | 2026.01.18 |
| [ํ๋ก๊ทธ๋๋จธ์ค] ๊ดํธ ํ์ ํ๊ธฐ 76502 (Level 2) - C++ (0) | 2026.01.18 |
| [ํ๋ก๊ทธ๋๋จธ์ค] ์คํจ์จ 42889 (Level 1) - C++ (1) | 2026.01.18 |