queue를 사용한 코드
#include <string>
#include <vector>
#include <queue>
#include <cmath>
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
queue<pair<int, int>> que;
for(int i = 0; i < progresses.size(); i++){
que.push({progresses[i], speeds[i]});
}
int day, count = 0;
while(!que.empty()){
pair<int, int> qq = que.front();
day = ceil((double)(100 - qq.first) / qq.second);
count = 0;
while(!que.empty()){
pair<int, int> qqq = que.front();
if(qqq.first + (day * qqq.second) >= 100) {
que.pop();
count++;
}
else break;
}
answer.push_back(count);
}
return answer;
}
풀이:
1. <int, int>형태인 큐에 progresse와 speed를 모두 넣고 난 후, 하나씩 꺼낸다
2-1. 꺼내진 progresse의 완료일을 구하고 큐에 넣어진 progresses를 하나씩 꺼내면서 완료일에 대입한다+count++
2-2. progresse가 완료일에도 기한이 남는다면 2번을 반복한다 +answer.push_back(count)
다른 방법을 사용한 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
int day;
int max_day = 0;
for (int i = 0; i < progresses.size(); ++i)
{
day = (99 - progresses[i]) / speeds[i] + 1;
if (answer.empty() || max_day < day)
answer.push_back(1);
else
++answer.back();
if (max_day < day)
max_day = day;
}
return answer;
}
풀이 :
1. progresse를 하나씩 꺼내보며 완료일을 구한다
2. 자기보다 큰 완료일이 나올 때까지 progresse를 완료시킨다 (++answer.back())
3. 큰 완료일이 나왔다면 answer에 새 공간을 만들고 큰 완료일로 2번을 반복한다 (answer.push_back(1))
내 코드와 다른 사람의 코드의 차이점
완료일을 구하는 식
day = (99 - progresses[i]) / speeds[i] + 1; // 다른 사람의 코드
day = ceil((double)(100 - qq.first) / qq.second); // 내 코드
기본 바탕이 되는 식은 ( 100 - progresses[i] ) / speeds[i]..인데
여기서 갈라지게 되는 이유는 나눗셈으로 인해 생긴 소수점을 어떻게 처리하느냐..이다
내 코드는 캐스터를 사용해서 소수점을 만들고, ceil()로 올림 하는 방법을 썼다
다른 사람의 코드는 소수점이 사라지는걸 이용해서 나누기 전에 -1을 하고 나눈 후에 +1을 해서 자동적으로 올림이 되게 만들었다
궁금한 점
Q. 그냥 소수점이 있는채로 계산하면 되지 않나
A. 계산하면 100이 나와야 하는데 부동소수점의 영향으로 99.9999...가 나올 수 있기 때문에 주의해야 한다
'프로그래밍 문제집 > 프로그래머스' 카테고리의 다른 글
[코딩테스트 연습] hash-전화번호목록 (0) | 2022.02.16 |
---|