🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

CodingTest/Programmers

[프로그래머스/Programmers] 기능개발 (Java - Level2)

JONG_UK 2023. 1. 16. 15:54
728x90
반응형
SMALL
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


⭐️ 코드

import java.util.*;
class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int completed = 0; // 완료한 index

        // answer배열을 얼마나 만들어야 할지 모르기 때문에 ArrayList 생성
        ArrayList<Integer> result = new ArrayList<Integer>();
        
        while (!(completed == progresses.length)) {
            for(int i = 0; i < progresses.length; i++) {
                progresses[i] += speeds[i];
            }
            
            int res = completed; // 이미 완료한 개수 빼주기
            if(progresses[completed] >= 100) {
                completed++;
                // 나머지 완료한거 카운트
                for(int i = completed; i<progresses.length; i++) {
                    if(progresses[completed] >= 100) {
                        completed++;
                    }
                }
                result.add(completed - res); // 이미 완료한거 제외하고 계산
            }
        }
        
        int[] answer = new int[result.size()]; // return 값 저장되는 배열
        for(int i = 0; i<answer.length; i++) {
            answer[i] = result.get(i);
        }
        return answer;
    }
}

💡 문제 풀이

문제를 읽으면서 처음에는 Queue로 풀어야만 하는 줄 알았다. 하지만 생각해 보니 ArrayList와 그냥 Array를 이용하여 계산하면 수준 낮은 나에게 알맞은 연산 방식으로 바꿀 수 있었다. 

HashMap, LinkedHashMap, Queue, ArrayDeque 등 여러 방식을 써봤는데 항상 데이터의 index 계산이 어려워서 풀 수가 없었다. 

그래서 그냥 단순하게 생각을 바꿔서 진행해 보았다. 

 

위에서 문제를 해결한 방식이 무조건적으로 맞다고는 생각이 들지는 않지만 일단 정답은 나왔으니 한번 써본다...

 

문제 풀이 방법은 크게 어렵지 않다.

// 완료한 index
int completed = 0; 
// answer배열을 얼마나 만들어야 할지 모르기 때문에 ArrayList 생성
ArrayList<Integer> result = new ArrayList<Integer>();

 progressess 배열의 크기만큼 완료한 개수를 담아줄 completed 변수와, 문제에서 return 타입은 Array 형태인데 아직 몇 개가 반환되는지 모르기 때문에 ArrayList를 이용하여 동적으로 하나씩 늘려주는 형태로 진행했다.

 

while (!(completed == progresses.length)) {
    for(int i = 0; i < progresses.length; i++) {
        progresses[i] += speeds[i];
    }
    int res = completed;
    if(progresses[completed] >= 100) {
        completed++;
        for(int i = completed; i<progresses.length; i++) {
            if(progresses[completed] >= 100) {
                completed++;
            }
        }
        result.add(completed - res);
    }
}

 while문에서 매일 speeds만큼  작업 진행도가 올라가기 때문에 조건 없이 하루하루 늘려주는 형태로 했다.

앞에서부터 100%로 완료가 되어야지 다음 것도 배포 가능하기 때문에 일단 제일 앞에 있는 항목이 100%가 되었는지 확인 한 다음 completed 값을 늘려갔다. completed값이 늘수록 반복문을 조금씩 덜 수행할 수 있도록 조정하였고,

마지막으로 completed변수에서 res를 뺀 값이 이미 완료한 항목을 제외하고 배포되는 항목의 개수이기 때문에 그 값을 result List에 담아줬다.

 

int[] answer = new int[result.size()]; // return 값 저장되는 배열
for(int i = 0; i<answer.length; i++) {
    answer[i] = result.get(i);
}

result배열의 size를 알 수 있기 때문에 answer배열의 크기도 정할 수 있고, result의 값을 answer배열에 넣어줌으로써 문제 풀이를 완료했다!

 


👀 후기

누가 코테 하나하나 설명해주면 좋겠다....
또르륵...🥲
728x90
반응형
LIST