굥뷰를 햡시댜

[2018 Kakao Blind] 무지의 먹방 라이브 본문

알고리즘 문제 풀이/2019 Kakao Blind 문제 풀이

[2018 Kakao Blind] 무지의 먹방 라이브

GodZ 2019. 8. 12. 15:10

https://programmers.co.kr/learn/courses/30/lessons/42891

 

코딩테스트 연습 - 무지의 먹방 라이브 | 프로그래머스

 

programmers.co.kr

 

일단 결과부터 말하면 정확성 부분만 통과했다.

 

효율성까지 고려해서 풀어보려고 했지만 아이디어는 생각났는데 구현을 못했다.

 

결국 정확성 부분만 풀고 다른 사람의 풀이를 확인했더니 내 아이디어랑 일치해서 조금 놀랐다.

 

그건 그 사람의 풀이고 일단 내가 정확성 부분만 통과한 풀이방법에 대해 설명해보려고 한다.

 

- 풀이 방법

1. 가장 먼저 입력으로 들어온 음식이 0이 아닐 경우부터 세줬다.

(나중에 0일 경우 답이 -1이기 때문에)

 

2. 음식을 1씩 빼주면서 0이 될 경우 1번에서 카운트한 변수를 1씩 빼줬다.

 

3. 루프를 돌고 있는 인덱스가 n-1일 경우 다음 인덱스는 0이 되고 그 외의 경우는 인덱스에 1을 더해줬다.

 

4. 그리고 k초가 지나면 현재의 인덱스에 1을 더해서 답을 구했다.(food_times는 0번째부터 시작하기 때문에 1을 더해줌)

 

#include <string>
#include <vector>

using namespace std;

int solution(vector<int> food_times, long long k) {
    int answer = 0;
    
    int n = food_times.size();
	int zero_cnt = 0;

	for (int i = 0; i < n; i++) {
		if (food_times[i] != 0) {
			zero_cnt += 1;
		}
	}

	bool flag = true;
	int i = 0;

	while (1) {

		if (food_times[i] != 0) {
			food_times[i] -= 1;

			if (food_times[i] == 0) {
				zero_cnt -= 1;

				if (zero_cnt == 0) {
					flag = false;
					answer = -1;
					break;
				}
			}

			if (i + 1 == n) i = 0;
			else i += 1;

			if (k - 1 == 0) {
				int j = i;
				while (1) {
					if (food_times[j] != 0) {
						flag = false;
						i = j;
						break;
					}
					else {
						if (j == n - 1) j = 0;
						else j += 1;
					}
				}
				if (!flag) break;
			}
			else k -= 1;
		}

		else {

			if (i + 1 == n) i = 0;
			else i += 1;
		}

		if (!flag) break;
	}

	if (zero_cnt == 0) {
		answer = -1;
	}
	else answer = i + 1;
    
    return answer;
}

 

Comments