[프로그래머스] 기능개발 (Level 2)

유진·2024년 7월 22일
0

코딩테스트

목록 보기
5/18

📝 기능개발 (Level 2)

스택/큐
기능개발

🔹Python

  • GPT 코드
import math

def solution(progresses, speeds):
    answer = []
    days = [math.ceil((100 - progress) / speed) for progress, speed 
            in zip(progresses, speeds)]
    
    # Initialize the first deployment
    current_deployment = days[0]
    count = 0
    
    for day in days:
        if day <= current_deployment:
            count += 1
        else: # day > current_deployment
            answer.append(count)
            current_deployment = day
            count = 1
            
    # Append the count for the last deployment
    answer.append(count)
    
    return answer

math 메서드 이용해서 days 구하는 것까진 했는데 그 뒤에 배열 묶는 법을 생각 못하겠어서 gpt한테 물어봤다.. 그리고 원래 days 구할 때 for문으로 배열 직접 접근했는데 zip함수 사용하면 한줄로 코드를 끝낼 수 있었다.

  1. days[0]을 current_deployment로 초기화 한다.
  2. days안에 있는 요소가 current_deployment 보다 작거나 같으면 즉, 자기 자신이거나 더 작으면 count += 1을 한다. 반대로 day가 current_deployment보다 크면 저장하고 있던 count의 값을 answer 배열에 append하고 그 day를 current_deployment로 초기화 한다. 그리고 count를 1로 다시 설정한다.
  3. days의 요소들이 다 for문을 돌면 마지막 count값을 answer 배열에 추가한다.

🔸Java

import java.lang.Math;
import java.util.ArrayList;
import java.util.List;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int n = progresses.length;
        int[] days = new int[n];
        List<Integer> answerList = new ArrayList<>();
        
        for (int i = 0; i < n; i++) {
            int progress = progresses[i];
            int speed = speeds[i];
            days[i] = (int) Math.ceil((100.0 - progress) / speed);
        }
        
        int current_deployment = days[0];
        int count = 0;
        
       for (int i = 0; i < n; i++) {
           if (days[i] <= current_deployment) {
               count++;
           }
           else {
               answerList.add(count);
               current_deployment = days[i];
               count = 1;
           }
       }
        
        answerList.add(count);
        
        int[] answer = new int[answerList.size()];
        for (int i = 0; i < answerList.size(); i++) {
            answer[i] = answerList.get(i);
        }
        
        return answer;
    }
}

파이썬 코드 자바로 변경


  • 다른 사람의 풀이
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;
    }
}

double remain = (100 - progresses[i]) / (double) speeds[i];
double로 형변환을 해줘야 remain에도 double값이 들어간다.

int date = (int) Math.ceil(remain);
remain을 반올림해서 int 형변환을 해줘야 원하는 값이 date에 저장된다.

q.peek()

  • 큐의 맨 앞에 있는 값 반환
  • 비어있을 경우 null 반환

q.offer(x)

  • 해당 큐 맨 뒤에 값 삽입
  • 값 추가 성공 시 true 반환 / 값 추가 실패 시 false 반환

answerList라는 ArrayList를 만들어서 date의 크기에 따라 값을 넣고 clear 한다. 마지막으로 ArrayList를 Array로 바꾸어서 반환하면 성공! 큐를 이용한 정석적인 풀이라 생각한다.

profile
유진진입니덩

0개의 댓글