개발 무지렁이

[문제풀이] Level2 기능개발 본문

코딩 테스트/문제풀이

[문제풀이] Level2 기능개발

Gaejirang-e 2023. 2. 28. 17:38

기능개발


  🪅 넣은 순서대로 빼는 것을 보고 큐를 생각할 수 있느냐 => List를 이용하기 전에 스택/큐를 생각해본다
  🪅 클래스를 새로 만들어 복잡한 자료를 잘 정리할 수 있느냐
  🪅 큐를 Integer[]로, Integer[]를 int[]로 변환할 수 있느냐

💡 문제 접근 과정
'progresses'의 원소와 'speeds'의 원소를 이용해서 배포하기까지의 남은 일수를 계산해야했다.
일단 이 원소들을 필드에 저장해두고 관련 메서드를 만들어 이를 이용하면 되겠다는 생각에 Work라는 클래스를 만들었다.

처음엔, 그렇게 만든 work 객체에서 calculateDays 메서드를 통해 얻은 restDays를 아무생각없이 List에 넣었다.
그리고 List를 순회하며, 현재값과 그 다음값을 비교하면서 문제의 조건에 맞게
result값을 갱신하며 또 새로운 List에 add 했다.
이렇게 하니까 비교과정에서 헷갈렸다. ArrayIndexOutOfBound 에러가 날까봐 체크하는 과정도 번거로웠다.
실패도 많이 떴다...

다시한번 문제를 보니, 넣은 순서대로 빼야하는 조건에서 자료구조 ''가 생각이 났고, 다시 코드를 짰다.
맨처음 에 넣어주었던 work의 배포까지 남은 날짜를 기준(day)으로,
가 비기전까지, 현재 work의 배포까지 남은 날짜를 current에 넣어주어
current와 day를 비교하여 current가 작으면, result 값을 하나 올려주고
current가 크면, 기준(day)를 current로 바꿔줌과 동시에 현재까지의 result값을 List에 add했다.

[실패한 코드.java]

import java.util.*;

class Work {
    int rest;
    int speed;
    int priority;

    public Work(int rest, int speed, int priority) {
        this.rest = rest;
        this.speed = speed;
        this.priority = priority;
    }

    public int caculateDays(int rest, int speed) {
        if(rest % speed == 0) {
            return rest/speed;
        }
        return rest/speed + 1;
    }
}

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        List<Work> workList = new ArrayList<>();
        for(int i = 0; i < progresses.length; i++) {
            Work work = new Work(100 - progresses[i], speeds[i], i);  
            workList.add(work);
        }

        List<Integer> restDaysList = new ArrayList<>();
        for(int i = 0; i < workList.size(); i++) {
            Work work = workList.get(i);
            int restDays = work.caculateDays(work.rest, work.speed);
            restDaysList.add(restDays);
        }
        System.out.println(restDaysList);

        int result = 1;
        List<Integer> resultList = new ArrayList<>();
        for(int i = 0; i < restDaysList.size(); i++) {
            int day = restDaysList.get(i);
            if(i == restDaysList.size()-1) {
                resultList.add(result);
                continue;
            }
            if(day < restDaysList.get(i+1)) {
                resultList.add(result);
                result = 1;
                day = restDaysList.get(i+1);
                continue;
            }
            result++;
        }
        System.out.println("resultList: " + resultList);
        Integer[] arrWrapper = resultList.toArray(new Integer[0]);
        answer = Arrays.stream(arrWrapper).mapToInt(Integer::intValue).toArray();
        return answer;
    }
}

[큐를 이용한 코드.java]

import java.util.*;

class Work {
    int rest;
    int speed;

    public Work(int rest, int speed) {
        this.rest = rest;
        this.speed = speed;
    }

    public int caculateDays(int rest, int speed) {
        // 삼항연산자를 이용하면 더 간단하게 작성할 수 있다
        if(rest % speed == 0) {
            return rest/speed;
        }
        return rest/speed + 1;
    }
}

class Solution {
    public int[] solution(int[] progresses, int[] speeds) {
        int[] answer = {};
        Queue<Work> queue = new LinkedList<>();
        for(int i = 0; i < progresses.length; i++) {
            Work work = new Work(100-progresses[i], speeds[i]);
            queue.offer(work);
        }

        int result = 1;
        // 맨처음 넣었던 work의 caculateDays를 기준(day)으로 잡는다
        Work firstWork = queue.poll();
        int day = firstWork.caculateDays(firstWork.rest, firstWork.speed);
        List<Integer> resultList = new ArrayList<>();
        // 큐가 빌때까지
        while(!queue.isEmpty()) {
            Work work = queue.poll();
            int current = work.caculateDays(work.rest, work.speed);
            // 현재값이 기준(day)보다 크면 이때까지의 result를 add하고, result 초기화
            // 기준을 현재값으로 바꾼다
            if(current > day) {
                resultList.add(result);
                day = current;
                result = 1;
                continue;
            }
            result++;
        }
        // 마지막 result add 
        resultList.add(result);
        Integer[] arrWrapper = resultList.toArray(new Integer[0]);
        answer = Arrays.stream(arrWrapper).mapToInt(Integer::intValue).toArray();
        return answer;
    }
}
Comments