문제 풀이/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. 실수를 혼용하여 올림 값을 구하자!

 

  1. 먼저, 스택 자료구조에 { 현재 작업율, 개발 속도 } 쌍 형식의 데이터를 삽입합니다.
  2. 스택의 가장 앞에 위치한 pair를 꺼내, ceil함수를 통해 남은 작업 기간을 계산하고, 스택을 순회하며 후순위 기능들 중 해당 작업 기간 내 완료가 가능한 작업들을 카운팅 하고, 스택에서 제거합니다.
  3. 마지막으로, 결과 값을 저장하며 스택을 모두 순회합니다.

 


 

#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;
}