굥뷰를 햡시댜

[Programmers] 기능개발 본문

알고리즘 문제 풀이/Programmers 문제 풀이

[Programmers] 기능개발

GodZ 2019. 11. 28. 23:36

https://programmers.co.kr/learn/courses/30/lessons/42586?language=python3

 

코딩테스트 연습 - 기능개발 | 프로그래머스

프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다. 또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다. 먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇

programmers.co.kr

 

큐를 이용해 푸는 문제

 

C++로도 풀어보고

 

python3을 사용해서도 풀어봤다.

 

- 풀이 방법

 

1. 입력으로 들어오는 progresses, speeds에 대해 각각 큐를 만들고 큐에다가 값을 넣었다.

 

2. 한번씩 speeds를 다 더해준다.

 

3. 100이 넘는 값이 있을 경우 큐의 pop 원리를 이용해서 값을 빼준다.

(없을 경우 반복문 종료)

 

4. 답을 출력한다.

 

- C++ 풀이

#include <string>
#include <vector>
#include <queue>

using namespace std;

queue<int> p_q, s_q;

vector<int> solution(vector<int> progresses, vector<int> speeds) {
    vector<int> answer;
    
    for (int i = 0; i < progresses.size(); i++) {
		p_q.push(progresses[i]);
		s_q.push(speeds[i]);
	}

	while (1) {
		if (p_q.empty()) break;

		queue<int> temp, temp_speed;

		int length = p_q.size();
		for (int i = 0; i < length; i++) {
			int p_front = p_q.front();
			int s_front = s_q.front();
			p_q.pop(), s_q.pop();
			temp.push(p_front + s_front);
			temp_speed.push(s_front);
		}	

		int cnt = 0;
		while (!temp.empty()) {
			int temp_front = temp.front();

			if (temp_front >= 100) {
				cnt += 1;
				temp.pop();
				temp_speed.pop();
			}
			else break;
		}

		int len = temp.size();
		for (int i = 0; i < len; i++) {
			p_q.push(temp.front());
			temp.pop();
			s_q.push(temp_speed.front());
			temp_speed.pop();
		}
		if(cnt != 0) answer.push_back(cnt);
	}
    
    return answer;
}

 

 

-python 풀이

from collections import deque

def solution(progresses, speeds):
    answer = []
    
    length = len(progresses)

    dq_progresses = deque()
    dq_speeds = deque()

    for i in range(0, length):
      dq_progresses.append(progresses[i])
      dq_speeds.append(speeds[i])

    while(True):
        if(len(dq_progresses) == 0):
            break

        sum_len = len(dq_progresses)

        for i in range(0, sum_len):
            dq_progresses[i] += dq_speeds[i]

        cnt = 0

        while(True):
            dq_len = len(dq_progresses)

            if dq_len == 0:
                break

            if dq_progresses[0] >= 100:
                cnt += 1
                dq_progresses.popleft()
                dq_speeds.popleft()
            else:
                break

        if cnt != 0:
            answer.append(cnt)
        
    return answer
Comments