#1. 문제
2. 풀이
1. 스택
스택은 '후입 선출' 방식으로 동작하는 선형 자료구조입니다. 스택 자료구조는 동일한 형식의 데이터 항목을 데이터 목록의 한쪽 끝에서만 삽입/삭제하는 특징을 갖고 있습니다.
2. 데이터 유형의 일관성
int a = 30;
int b = ceil((100.0 - 30)/5)
연산 과정에서 실수형과 정수형의 혼용 발생 시, 데이터 유형의 일관성과 정확도를 유지하기 위해 100을 100.0으로 표현합니다. C++에서 정수형과 실수형을 함께 연산할 경우, 더 넓은 범위를 가진 데이터 유형으로 자동 형 변환이 이루어집니다.
3. ceil()
#include <cmath>
double ceil(double x);
ceil 함수는 C++ <cmath> 헤더 파일에 정의되어 있으며, 주어진 실수 값에 대해 가장 작지 않은 정수를 반환합니다. 즉, 인자로 주어진 값보다 크거나 같은 가장 작은 정수를 반환합니다. ceil 함수는 주로 실수 값을 정수로 올림 할 때 사용됩니다.
4. 실수를 혼용하여 올림 값을 구하자!
- 먼저, 스택 자료구조에 { 현재 작업율, 개발 속도 } 쌍 형식의 데이터를 삽입합니다.
- 스택의 가장 앞에 위치한 pair를 꺼내, ceil함수를 통해 남은 작업 기간을 계산하고, 스택을 순회하며 후순위 기능들 중 해당 작업 기간 내 완료가 가능한 작업들을 카운팅 하고, 스택에서 제거합니다.
- 마지막으로, 결과 값을 저장하며 스택을 모두 순회합니다.
#3. 코드
#include <string>
#include <vector>
#include <stack>
#include <cmath>
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
// pair < 현재 작업율, 작업의 개발 속도 >
stack<pair<int, int>> s;
for(int i=progresses.size()-1; i>=0; --i)
s.push({progresses[i], speeds[i]});
if(s.empty())
{
answer.push_back(0);
return answer;
}
while(!s.empty())
{
// #1. s.top()의 남은 작업 기간 계산
int days = ceil((100 - s.top().first)/s.top().second);
int cnt = 1;
s.pop();
// #2. 후순위 기능 중 현재 작업 기간 내 이미 끝나있는 작업들 계산
while(!s.empty() && (ceil((100 - s.top().first)/s.top().second) <= days))
{
cnt++;
s.pop();
}
answer.push_back(cnt);
}
return answer;
}
'문제 풀이 > Programmers 문제 풀이' 카테고리의 다른 글
[Programmers]#Level2_피로도, 완전 탐색, DFS, 깊이 우선 탐색, 백트래킹 (0) | 2024.04.08 |
---|---|
[Programmers]#Level2_프로세스, 큐, 우선순위 큐 (0) | 2024.04.08 |
[Programmers]#Level2_캐시, unordered_map 컨테이너, LRU, transform 알고리즘 (0) | 2024.03.21 |
[Programmers]#Level2_땅 따먹기, DP (0) | 2024.03.21 |
[Programmers]#Level2_의상, 해시, unordered_map (0) | 2024.03.21 |