본문 바로가기
Java/알고리즘

기능개발

by 티코딩 2023. 10. 17.

원래는 스택/큐 문제지만, 굳이 안써도 될것같아서 안쓰고 한번 풀어봤다.(그래서 엄청 오래걸렸다.)

 

ㅇ 1트

public static int[] solution(int[] progresses, int[] speeds) {
        //몇번 더해야하는지를 넣는 배열생성한다.
        int[] addTo100 = new int[progresses.length];
        //100까지 몇번더하는지 구해서 addTo100 배열에 넣는다.
        for (int i = 0; i < progresses.length; i++) {
            int target = 100 - progresses[i];
            addTo100[i] = (int) Math.ceil((double) target / speeds[i]);
        }
        //answer에 넣기 전, 그룹을 지어서 갯수를 세줄 새배열을 만든다.
        List<Integer> answerList = new ArrayList<>();
        //addTo100 배열만큼 반복
        for (int i = 0; i < addTo100.length; i++) {
            int count = 1;
            int current = addTo100[i];
            //i는 addTo100길이-1 && 현재가 다음인덱스보다 크거나같으면 count++
            while (i < addTo100.length - 1 && current >= addTo100[i + 1]) {
                count++;
                i++;
                current = addTo100[i];
            }

            answerList.add(count);
        }

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

        return answer;
    }

먼저 각progresses의 인덱스가 며칠이 걸리는지를 addTo100 배열에 넣었다.

그 다음 addTo100 배열에서 규칙을 찾아 길이가 자유로운 ArrayList인 answerList에 넣고 다시 int 배열인 answer에 넣었다.

그런데 내가 간과한것이, addTo100 배열이 {10,3,2,1} 일땐 맞겠지만, {10,2,3,1} 이면 2와 3을 비교해 그룹을 자른다는것이었다.

그래서 addTo100으로 다시 어떻게 그룹화할지를 수정했다.

 

ㅇ 2트

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        //몇번 더해야하는지를 넣는 배열생성한다.
        int[] addTo100 = new int[progresses.length];
        //100까지 몇번더하는지 구해서 addTo100 배열에 넣는다.
        for (int i = 0; i < progresses.length; i++) {
            int target = 100 - progresses[i];
            addTo100[i] = (int) Math.ceil((double) target / speeds[i]);
        }
        //addTo100 배열을 다시 규칙에따라 answerList생성
        List<Integer> answerList = new ArrayList<>();
        int count = 0;
        int max = addTo100[0];
		
        for (int i = 0; i < addTo100.length; i++) {
            if (max >= addTo100[i]) {
                count++;
            } else {
                answerList.add(count);
                max = addTo100[i];
                count = 1;
            }
        }

        answerList.add(count);
		//ArrayList인 answerList를 다시 int[] answer로 변환
        int[] answer = new int[answerList.size()];
        for (int j = 0; j < answerList.size(); j++) {
            answer[j] = answerList.get(j);
        }

        return answer;
    }
}

max를 만들어서 다음원소와 비교해가면서 max가 더 작은경우 max를 해당하는 원소로 교체하고 이전에 그룹을 answerList에 넣는 방법을 사용했다. (이 부분구현하는데 거의 2시간 걸린듯하다.)

이 쉬운문제를 엄청나게 오래 풀었다. 정말 반성해야겠다.

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

피로도  (1) 2023.10.19
프로세스  (1) 2023.10.18
괄호 회전하기  (0) 2023.10.16
H-Index  (0) 2023.10.13
숫자의 표현  (0) 2023.10.12