Contents

κΈ°λŠ₯개발 (with.Java)

   Jun 6, 2024     6 min read

β€œκΈ°λŠ₯개발 (with.Java)” λ¬Έμ œμ— λŒ€ν•˜μ—¬ μ•Œμ•„λ³Έ κΈ€μž…λ‹ˆλ‹€.

μ½”λ”© ν…ŒμŠ€νŠΈ 문제λ₯Ό ν’€λ©°, ν’€μ—ˆλ˜ λ¬Έμ œμ— λŒ€ν•œ νšŒκ³ μ™€ λ‹€λ₯Έ 풀이 방법을 μ•Œμ•„λ³΄λ©°, μ•Œμ•„κ°€κ³ μž ν•©λ‹ˆλ‹€.

λ¬Έμ œμ— λŒ€ν•΄ λ¨Όμ € μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

문제

ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€ νŒ€μ—μ„œλŠ” κΈ°λŠ₯ κ°œμ„  μž‘μ—…μ„ μˆ˜ν–‰ μ€‘μž…λ‹ˆλ‹€.

각 κΈ°λŠ₯은 진도가 100%일 λ•Œ μ„œλΉ„μŠ€μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

또, 각 κΈ°λŠ₯의 κ°œλ°œμ†λ„λŠ” λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— 뒀에 μžˆλŠ” κΈ°λŠ₯이 μ•žμ— μžˆλŠ” κΈ°λŠ₯보닀 λ¨Όμ € 개발될 수 있고, μ΄λ•Œ 뒀에 μžˆλŠ” κΈ°λŠ₯은 μ•žμ— μžˆλŠ” κΈ°λŠ₯이 배포될 λ•Œ ν•¨κ»˜ λ°°ν¬λ©λ‹ˆλ‹€.

λ¨Όμ € λ°°ν¬λ˜μ–΄μ•Ό ν•˜λŠ” μˆœμ„œλŒ€λ‘œ μž‘μ—…μ˜ 진도가 적힌 μ •μˆ˜ λ°°μ—΄ progresses와 각 μž‘μ—…μ˜ 개발 속도가 적힌 μ •μˆ˜ λ°°μ—΄ speedsκ°€ μ£Όμ–΄μ§ˆ λ•Œ 각 λ°°ν¬λ§ˆλ‹€ λͺ‡ 개의 κΈ°λŠ₯이 λ°°ν¬λ˜λŠ”μ§€λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•˜μ„Έμš”.

μ œν•œμ‚¬ν•­

  • μž‘μ—…μ˜ 개수(progresses, speedsλ°°μ—΄μ˜ 길이)λŠ” 100개 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ§„λ„λŠ” 100 미만의 μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • μž‘μ—… μ†λ„λŠ” 100 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • λ°°ν¬λŠ” ν•˜λ£¨μ— ν•œ 번만 ν•  수 있으며, ν•˜λ£¨μ˜ 끝에 이루어진닀고 κ°€μ •ν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ§„λ„μœ¨μ΄ 95%인 μž‘μ—…μ˜ 개발 속도가 ν•˜λ£¨μ— 4%라면 λ°°ν¬λŠ” 2일 뒀에 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€.

μž…μΆœλ ₯ μ˜ˆμ‹œ

progressesspeedsreturn
[93, 30, 55][1, 30, 5][2, 1]
[95, 90, 99, 99, 80, 99][1, 1, 1, 1, 1, 1][1, 3, 2]

λ¬Έμ œμ— λŒ€ν•œ λ‚˜μ˜ 풀이

import java.util.Queue;
import java.util.LinkedList;
import java.util.ArrayList;

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

        for(int i = 0; i < progresses.length; i++){
            int temp = 100 - progresses[i];
            if(temp % speeds[i] == 0){
                que.add(temp / speeds[i]);
            }else{
                que.add(temp / speeds[i] + 1);
            }
        }

        int compare = que.poll();
        int count = 1;
        ArrayList<Integer> list = new ArrayList<>();
        while(!que.isEmpty()){
            if(compare >= que.peek()){
                count++;
                que.remove();

            }else{
                list.add(count);
                count = 1;
                compare = que.poll();
            }
        }
        list.add(count);

        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            answer[i] = list.get(i);
        }

        return answer;
    }
}

풀이 리뷰

solution λ©”μ„œλ“œλŠ” 두 개의 λ°°μ—΄ progresses와 speedsλ₯Ό μž…λ ₯으둜 λ°›μŠ΅λ‹ˆλ‹€.

μž‘μ—…μ˜ 진행 상황과 속도λ₯Ό μ΄μš©ν•˜μ—¬ 각 μž‘μ—…μ΄ μ™„λ£Œλ˜λŠ” 데 ν•„μš”ν•œ 일 수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

Queue 객체 queλ₯Ό μƒμ„±ν•˜μ—¬ 각 μž‘μ—…μ˜ μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” 일 수λ₯Ό μ €μž₯ν•©λ‹ˆλ‹€.

첫 번째 for 루프λ₯Ό 톡해 각 μž‘μ—…μ— λŒ€ν•΄ ν•„μš”ν•œ 일 수λ₯Ό κ³„μ‚°ν•˜κ³ , 이λ₯Ό que에 μ €μž₯ν•©λ‹ˆλ‹€. λ§Œμ•½ 속도에 따라 μž‘μ—… μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” 일 μˆ˜κ°€ μ†Œμˆ˜μ μœΌλ‘œ λ‚˜λˆ„μ–΄ 떨어지지 μ•ŠμœΌλ©΄ μ˜¬λ¦Όν•˜μ—¬ κ³„μ‚°ν•©λ‹ˆλ‹€.

compare λ³€μˆ˜μ— 첫 번째 μž‘μ—…μ˜ ν•„μš”ν•œ 일 수λ₯Ό μ €μž₯ν•˜κ³ , count λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

두 번째 while 루프λ₯Ό 톡해 queκ°€ 빌 λ•ŒκΉŒμ§€ λ°˜λ³΅ν•˜λ©° 각 μž‘μ—…μ˜ μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” 일 수λ₯Ό λΉ„κ΅ν•˜μ—¬ μ²˜λ¦¬ν•©λ‹ˆλ‹€.

compare와 ν˜„μž¬ μž‘μ—…μ˜ ν•„μš”ν•œ 일 수λ₯Ό λΉ„κ΅ν•˜μ—¬ μž‘κ±°λ‚˜ κ°™μœΌλ©΄ μž‘μ—…μ„ μ™„λ£Œν–ˆμœΌλ―€λ‘œ countλ₯Ό μ¦κ°€μ‹œν‚€κ³  queμ—μ„œ μž‘μ—…μ„ μ œκ±°ν•©λ‹ˆλ‹€.

그렇지 μ•ŠμœΌλ©΄ μƒˆλ‘œμš΄ μž‘μ—…μ΄ μ‹œμž‘λ˜μ—ˆμœΌλ―€λ‘œ list에 ν˜„μž¬κΉŒμ§€ μ™„λ£Œλœ μž‘μ—…μ˜ 수λ₯Ό μΆ”κ°€ν•˜κ³  countλ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. λ˜ν•œ compareλ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ list에 μ €μž₯된 값을 λ°°μ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.

이 μ½”λ“œλŠ” 각 μž‘μ—…μ΄ μ™„λ£Œλ˜λŠ” 데 ν•„μš”ν•œ 일 수λ₯Ό κ³„μ‚°ν•˜κ³ , 각 λ‚ μ§œλ³„λ‘œ μ™„λ£Œλ˜λŠ” κΈ°λŠ₯의 수λ₯Ό κ³„μ‚°ν•˜μ—¬ λ°˜ν™˜ν•˜λŠ” 문제λ₯Ό ν•΄κ²°ν•©λ‹ˆλ‹€.

λ°°μ—΄λ‘œλ„ ν’€μ–΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

λ¬Έμ œμ— λŒ€ν•œ λ‚˜μ˜ 풀이

import java.util.ArrayList;

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {

        ArrayList<Integer> list = new ArrayList<>();
        int day = 0;
        int count = 1;
        int idx = 0;
        for(int i = 0; i < progresses.length; i++){
            if(day * speeds[i] + progresses[i] >= 100){
                count++;
            }else if(i != 0){
                list.add(count);
                count = 1;
            }
            int temp = 100 - progresses[i];
            if(temp % speeds[i] == 0){
                int temp2 = temp / speeds[i];
                if(day < temp2){
                    day = temp2;
                }
            }else{
                int temp2 = temp / speeds[i] + 1;
                if(day < temp2){
                    day = temp2;
                }
            }
        }
        if(day * speeds[progresses.length - 1] + progresses[progresses.length - 1] >= 100){
            list.add(count);
        }



        int[] answer = new int[list.size()];
        for(int i = 0; i < list.size(); i++){
            answer[i] = list.get(i);
        }

        return answer;
    }
}
풀이 리뷰

solution λ©”μ„œλ“œλŠ” 두 개의 λ°°μ—΄ progresses와 speedsλ₯Ό μž…λ ₯으둜 λ°›μŠ΅λ‹ˆλ‹€.

μž‘μ—…μ˜ 진행 상황과 속도λ₯Ό μ΄μš©ν•˜μ—¬ 각 μž‘μ—…μ΄ μ™„λ£Œλ˜λŠ” 데 ν•„μš”ν•œ 일 수λ₯Ό κ³„μ‚°ν•˜κ³ , 이λ₯Ό κΈ°μ€€μœΌλ‘œ 각 λ‚ μ§œλ³„λ‘œ μ™„λ£Œλ˜λŠ” κΈ°λŠ₯의 수λ₯Ό κ³„μ‚°ν•©λ‹ˆλ‹€.

λ¨Όμ € ArrayList 객체 listλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이 λ¦¬μŠ€νŠΈμ—λŠ” 각 λ‚ μ§œλ³„ μ™„λ£Œλ˜λŠ” κΈ°λŠ₯의 μˆ˜κ°€ μ €μž₯λ©λ‹ˆλ‹€.

day, count, idx λ³€μˆ˜λ₯Ό μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€. dayλŠ” μ΄μ „κΉŒμ§€μ˜ μ΅œλŒ€ μ™„λ£Œ 일 수λ₯Ό μ €μž₯ν•˜λŠ” λ³€μˆ˜μ΄κ³ , countλŠ” ν˜„μž¬κΉŒμ§€ μ§„ν–‰λœ κΈ°λŠ₯의 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λ³€μˆ˜μž…λ‹ˆλ‹€.

for 루프λ₯Ό 톡해 각 μž‘μ—…μ— λŒ€ν•΄ 처리λ₯Ό μ‹œμž‘ν•©λ‹ˆλ‹€.

각 μž‘μ—…μ΄ μ™„λ£Œλ˜λŠ” 데 ν•„μš”ν•œ 일 수λ₯Ό κ³„μ‚°ν•˜κ³ , 이λ₯Ό 톡해 count λ³€μˆ˜λ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

λ§Œμ•½ 이전 μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμœΌλ©΄ (day * speeds[i] + progresses[i] >= 100), countλ₯Ό μ¦κ°€μ‹œν‚΅λ‹ˆλ‹€.

그렇지 μ•ŠμœΌλ©΄ (i != 0), countλ₯Ό λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•˜κ³  countλ₯Ό 1둜 μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.

각 μž‘μ—…μ˜ μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” 일 수λ₯Ό κ³„μ‚°ν•˜κ³ , 이λ₯Ό 톡해 dayλ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

속도에 λ”°λ₯Έ μž‘μ—… μ™„λ£ŒκΉŒμ§€ κ±Έλ¦¬λŠ” 일 수λ₯Ό κ³„μ‚°ν•˜κ³ , μ΄μ „κΉŒμ§€μ˜ μ΅œλŒ€ 일 μˆ˜λ³΄λ‹€ 큰 κ²½μš°μ—λ§Œ dayλ₯Ό μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ λ§ˆμ§€λ§‰ μž‘μ—…μ— λŒ€ν•œ 처리λ₯Ό μ§„ν–‰ν•©λ‹ˆλ‹€. λͺ¨λ“  μž‘μ—…μ— λŒ€ν•΄ 반볡문이 λλ‚œ ν›„ λ§ˆμ§€λ§‰ μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμœΌλ©΄ countλ₯Ό λ¦¬μŠ€νŠΈμ— μΆ”κ°€ν•©λ‹ˆλ‹€.

list에 μ €μž₯된 값을 λ°°μ—΄λ‘œ λ³€ν™˜ν•˜μ—¬ λ°˜ν™˜ν•©λ‹ˆλ‹€.