프로그래머스 Lv2. 기능개발 (Java / Python)

eora21·2022년 9월 2일
0

프로그래머스

목록 보기
10/38

문제 링크

문제 간단 해석

앞쪽에서 얻은 날짜를 기준으로, 100일을 넘길 수 있는 연속된 날짜를 구하는 문제.

Java

풀이 코드

import java.util.List;
import java.util.ArrayList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        List<Integer> answer = new ArrayList<>();
        int day = 0;
        double val, div;

        for (int i = 0; i < speeds.length; i++) {
            if (progresses[i] + day * speeds[i] < 100) {
                val = 100 - progresses[i];
                div = val / speeds[i];
                day = (int)Math.ceil(div);
                answer.add(1);
            } else {
                answer.set(answer.size() - 1, answer.get(answer.size() - 1) + 1);
            }
        }

        return answer.stream().mapToInt(i -> i).toArray();
    }
}

해석

List<Integer> answer = new ArrayList<>();
int day = 0;
double val, div;

값을 담을 answer와 날짜를 뜻할 day, 필요 진행도 val과 필요 진행도를 작업 속도로 나눈 div 선언.

for (int i = 0; i < speeds.length; i++) {
    if (progresses[i] + day * speeds[i] < 100) {
        val = 100 - progresses[i];
        div = val / speeds[i];
        day = (int)Math.ceil(div);
        answer.add(1);
    } else {
        answer.set(answer.size() - 1, answer.get(answer.size() - 1) + 1);
    }
}

주어진 작업의 갯수만큼 반복.

만약 작업 진행도 + 날짜 * 작업 속도가 100을 넘지 못 한다면, 필요 진행도 val를 구한 후 작업 속도로 나눈 div를 구한다.
div가 만약 3.47.. 이라면 4일이 더 있어야 100을 충족시킬 것이므로 div를 올림 후 day에 넣어준다.
해당 day를 기준으로 하나를 완료했으니 answer에 1을 넣어주자.

만약 현재 day에 특정 작업이 종료된다면, answer의 맨 마지막으로 가서 1을 올려주자.

return answer.stream().mapToInt(i -> i).toArray();

answer는 Integer List였기에 stream을 통해 반복가능한 형태로 만들고, mapToInt를 통해 내부 Integer 값을 int로 변환한다. 그 후 Array()를 통해 결과적으로 int array를 생성 후 반환.

Python

Java보다 비슷하지만 상대적으로 비효율적인 코드.

풀이 코드

def solution(progresses, speeds):
    answer = []
    days = 0
    for i in range(len(speeds)):
        if progresses[i] + speeds[i] * days < 100:
            days += (100 - progresses[i] - speeds[i] * days) // speeds[i]
            days += 1 if progresses[i] + speeds[i] * days < 100 else 0
            answer.append(1)
        else:
            answer[-1] += 1
    
    return answer

해석

answer = []
days = 0

값을 담을 answer와 날짜인 days를 선언.

for i in range(len(speeds)):
    if progresses[i] + speeds[i] * days < 100:
        days += (100 - progresses[i] - speeds[i] * days) // speeds[i]
        days += 1 if progresses[i] + speeds[i] * days < 100 else 0
        answer.append(1)
    else:
        answer[-1] += 1
        
return answer

이 역시 작업 갯수만큼 반복한다.

만약 현재 날짜를 기준으로 작업 진행도가 100을 넘지 않는다면, 필요 진행도를 구하고 작업 속도로 나눠준 후 days에 더한다.
만약 그럼에도 불구하고 100을 넘지 않았다면, 소수점 이슈로 인한 것이므로 1일을 더 더해준다.
그 후 answer에 1을 추가.

만약 현재 날짜를 기준으로 작업 진행도가 100을 넘었다면, answer의 마지막에 1을 더해준다.

for문이 끝난 후 answer return.

profile
나누며 타오르는 프로그래머, 타프입니다.

0개의 댓글