본문 바로가기

CodingTest Exam/[C++] Algorithm Study

46. 멀티태스킹(카카오 먹방 문제 변형) (it 취업을 위한 알고리즘 문제풀이 입문 (with C/C++) : 코딩테스트 대비) ★★☆☆☆

#include <stdio.h>
#include <vector>

using namespace std;

int main()
{
	int n, k, tot = 0, cnt = 0, pos = 0;
	bool flag = false;
	scanf("%d", &n);
	
	vector<int> task(n+1, 0);
	for(int i = 1; i < task.size(); i++)
	{
		scanf("%d", &task[i]);
		tot += task[i];
	}
		
	scanf("%d", &k);
	
	if(k >= tot)
	{
		printf("%d", -1);
		return 0;
	}
	
	while(true)
	{
		pos++;
		if(pos > n) pos = 1;
		if(task[pos] == 0) continue;
		task[pos]--;
		cnt++;
		
		if(cnt == k) break;
	}
	
	while(true)
	{
		pos++;
		if(pos > n) pos = 1;
		if(task[pos] != 0)
		{
			printf("%d", pos);
			return 0;
		}
	}
	
	return 0;
}

1. 일의 개수를 n, 정전에 걸리는 시간을 k, 일을 하는데에 걸리는 시간을 tot, 일을 한 번 할 때마다 걸린 시간을 cnt, 현재 몇 번째 일을 하는지 알기 위한 pos 변수를 선언한다.

2. 일을 하는데에 걸리는 시간이 정전하기 전( k >= tot ) 이라면 정전하기 전에 모든 일이 끝났기 때문에 -1을 출력

3. 정전이 될 때까지 1번째 일부터 계속해서 일을 하고 정전이 되면 정전 직전에 했던 일 이후에 끝내지 못한(0이 아닌) 작업이 다시 시작해야하는 작업이다.

 

 

이 문제를 풀 때 문제를 잘 이해하지 못해서 정답임에도 오답이 나와서 애를 많이 먹었다.

입력이 3 1 2 3 5 가 들어오면 3번째 작업인 3이 0이 아니기 때문에 3을 출력하게 되는데,

문제에서 우연히 1,2,3 번째 작업이 1,2,3 인 게 나를 헷갈리게 만들었다.

 

예를 들어 3 244 300 500 5 가 들어오면 출력은 500부터 시작해야하기 때문에 3이 출력된다. 500이 3번째 작업이기 때문에... 500이 출력되어서는 안 된다는 것이다.