https://school.programmers.co.kr/learn/courses/30/lessons/42586
현재 과정에서 + 속도가 100이 넘으면 dequeue에서 꺼내주는 방식으로 계속 돌리다가.
다음 인덱스가 100이 넘지 않으면 자연스럽게 종료를 해주는 방식으로 구현했다.
이를 위해서 pair를 사용하여 구현하였다.
내가 짠 코드
#include <string>
#include <vector>
#include <iostream>
#include <map>
#include <queue>
#include <deque>
#include<algorithm>
using namespace std;
vector<int> solution(vector<int> progresses, vector<int> speeds) {
vector<int> answer;
int cnt = 0;
deque<pair<int, int>> work;
for (int i = 0; i < progresses.size(); i++) {
work.push_back({progresses[i], speeds[i]});
}
while (!work.empty())
{
cnt = 0;
for (int i = 0; i < work.size(); i++) {
work[i].first+= work[i].second;
}
for (int i = 0; i < work.size(); i++) {
if (work[i].first >= 100) {
work.pop_front();
i--;
cnt++;
}
else {
if (cnt >= 1) answer.push_back(cnt);
break;
}
}
}
if (cnt >= 1) answer.push_back(cnt);
return answer;
}
이후 정답을 맞춘 뒤 가장 효율적인 코드가 어떤 것이 있었을까 하고 찾아보았다.
순차적으로 포문을 돌린 뒤, 이전의 작업에 소요되는 날을 구한다.
그 다음 작업들이 소요되는 날이 같거나, 그 날보다 작다면 back()++를 통해서 카운트를 늘렸다.
그렇게 비교하다가, 여태껏 소요되던 날보다 많으면 다음 빌드 일정으로 넘어가도록 짠 코드였다.
불필요한 int가 사용되지 않았다는 것에서 배울 점이 있었다.
또한 반복문 하나로 처리한다는 점에서 시간도 절약할 수 있었다.
다음부터는 최적화도 고려해야겠다.
반복문을 가장 적게 쓰고 짧은 코드
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;
}
'콘솔창 & 윈도우창 > 코딩 테스트' 카테고리의 다른 글
프로그래머스 LV.2 다음 큰 숫자 (0) | 2024.11.07 |
---|---|
프로그래머스 LV.1 과일 장수 (1) | 2024.11.05 |
[백준 실버3] 9095 1, 2, 3 더하기 (0) | 2024.10.28 |
프로그래머스 LV.2 멀리 뛰기 (0) | 2024.10.28 |
[백준 골드5] 2023 신기한 소수 (0) | 2024.10.27 |