본문 바로가기
알고리즘

[프로그래머스] 기능개발

by steadyMan 2022. 1. 21.

스택/큐가 주제인 문제라서 큐를 활용하여 풀이했습니다. 

 

연산 마지막에 ArrayList에 데이터를 입력하는 이유는 반복문에 끝에 

count가 1인 상태로 종료가 되기때문에 마지막 데이터를 입력하기 위해서 추가했습니다.

public int[] solution(int[] progresses, int[] speeds) {
		Queue<Integer> queue = new LinkedList<Integer>();
		List<Integer> an = new ArrayList<Integer>();
		for (int i = 0; i < progresses.length; i++) {
			int data = ((100 - progresses[i]) / speeds[i]);
			data += ((100 - progresses[i]) % speeds[i] > 0) ? 1 : 0;
			queue.add(data);
		}
		// 삭제 하고 리턴
		int index = queue.poll();
		int count = 1;
		while (!queue.isEmpty()) {
			int next = queue.poll();
			if (index >= next) {
				count++;
			} else {
				an.add(count);
				count = 1; // 카운트 초기화
				index = next; // 기준점 변경
			}
		}

		an.add(count);

		int[] answer = new int[an.size()]; // ArrayList size 크기만큼 생성 
		for (int i = 0; i < an.size(); i++) {
			answer[i] = an.get(i);
		}
		return answer;
	}

 

 

 

큐 자료구조를 효율적으로 사용한 다른분의 풀이를 빌렸습니다. 

 

큐에 데이터입력(offer)을 전제로 다음에오는 비교값(date)가 queue의 첫 번째 값보다 크면

결과를 반환할 ArrayList에 데이터를 입력하고 큐를 초기화한다.

import java.util.*;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        Queue<Integer> q = new LinkedList<>();
        List<Integer> answerList = new ArrayList<>();

        for (int i = 0; i < speeds.length; i++) {
            double remain = (100 - progresses[i]) / (double) speeds[i];
            int date = (int) Math.ceil(remain);

            if (!q.isEmpty() && q.peek() < date) {
                answerList.add(q.size());
                q.clear();
            }

            q.offer(date);
        }

        answerList.add(q.size());

        int[] answer = new int[answerList.size()];

        for (int i = 0; i < answer.length; i++) {
            answer[i] = answerList.get(i);
        }

        return answer;
    }
}

 

'알고리즘' 카테고리의 다른 글

[알고리즘] 다양한 정렬 알고리즘  (0) 2022.04.28
[알고리즘] 숫자를 뒤집기  (0) 2022.04.06
[프로그래머스] 모의고사  (0) 2022.03.04
[프로그래머스] 주식가격  (0) 2022.02.01
[프로그래머스] 프린트  (0) 2022.01.23

댓글