문제 풀이/Programmers 문제 풀이
[Programmers]#Level2_기능 개발, 스택, ceil(), 실수와 정수의 혼용 연산
Hardii2
2024. 3. 21. 16:35
#1. 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
2. 풀이
1. 스택
[자료 구조]#0_선형 자료구조
[자료 구조] #0_선형 자료구조 선형 자료구조에 대해 알아보겠습니다. Overview 개념 스택 큐 원형 큐 덱 배열 벡터 리스트 이중 연결 리스트 #0. 개념 1. 선형 자료구조? [정의] : 선형 자료구조는 데
webddevys.tistory.com
스택은 '후입 선출' 방식으로 동작하는 선형 자료구조입니다. 스택 자료구조는 동일한 형식의 데이터 항목을 데이터 목록의 한쪽 끝에서만 삽입/삭제하는 특징을 갖고 있습니다.
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;
}