특별한 먹방을 하려는 무지. 회전테이블에 각각의 음식을 놓아두고 자신 앞의 음식을 1초 동안 섭취 한 다음 회전판에 의해 다음 음식을 1초동안 섭취하는 특이한...
자세한 문제 설명과 제한 사항은 프로그래머스 홈페이지 참고.
문제풀러가기
정확성만 생각한다면 1초 지날 때마다 검사하는 시뮬레이션을 통해 답을 도출해 내면 된다.
효율성을 생각한다면 남아있는 음식의 접시와 회전수를 조사하여 O(nlgn) 시간에 도출해야한다.
프로그래머스 사이트가 아닌, visual studio 에서 코드를 작성해서 그대로 가져온 것 입니다. 일부 테스트 코드가 존재합니다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(vector<int> food_times, long long k);
int main() {
vector<int> input = { 3, 1, 2 };
vector<int> input2 = { 4,2,3,6,7,1,5,8 };
int k = 5; // answer 1
int k2 = 16; // answer 3
int answer = solution(input, k);
}
int solution(vector<int> food_times, long long k) {
int answer = 0;
vector<int> sortedTime = food_times;
sort(sortedTime.begin(), sortedTime.end());
sortedTime.push_back(0);
long long foodNum = food_times.size();
long long rotateNum = 0;
for (int i = 0; i < sortedTime.size(); i++) {
int ateFoodNum = 1;
while (sortedTime[i] == sortedTime[i + 1]) {
i++;
ateFoodNum++;
}
if (k - (foodNum * (sortedTime[i] - rotateNum)) <= 0) {
break;
}
k = k - (foodNum * (sortedTime[i] - rotateNum));
foodNum -= ateFoodNum;
rotateNum = sortedTime[i];
}
if (foodNum <= 0) return -1;
while (k - foodNum > 0) {
k = k - foodNum;
rotateNum++;
}
for (size_t i = 0; i < food_times.size(); i++)
{
if (food_times[i] > rotateNum)
k--;
else
continue;
if (k == 0) {
for (size_t j = 1; j <= food_times.size(); j++)
{
if ((i + j) % food_times.size() == 0) rotateNum++;
if (food_times[(i + j) % food_times.size()] > rotateNum)
return (i + j) % food_times.size() + 1;
}
}
}
return -1;
}
문제 자체는 어렵지 않으나 구현 할 때 숫자 하나 차이로 풀리지 않을 수도 있기 때문에 주의를 요한다.
무지는 정말 대식가이다 지구에 있는 모든 음식을 다 먹을 수 있겠다.