leetcode 2244, Minimum Rounds to Complete All Tasks

NJW·2023년 1월 4일
0

코테

목록 보기
127/170

문제 설명

task가 주어질 때, 같은 레벨에 있는 task를 두 개에서 세 개씩 처리해 최소 수행 횟수를 구하는 문제다. 만일 두 개에서 세 개씩 처리가 불가능하면 -1을 반환한다.
수학 문제다

문제 풀이

  1. 필요한 자료구조
    0-1. 같은 레벨의 task의 개수를 구하는 HashMap
  2. 일단 같은 레벨의 task가 얼마나 있는지 개수를 구한다.
  3. 각 개수를 확인하는데 만일 2보다 작아서 2혹은 3으로 뺄 수 없다면 -1을 반환한다.
  4. 반복문을 돌리면서 값이 1보다 작거나 같을 때까지 3혹은 2를 빼준다.
    3-1. 만일 3으로 뺐을 때 1이 안 되고 현재 값이 3보다 크다면 3으로 값을 빼주고 answer을 ++한다.
    3-2. 만일 위의 조건에 부합하지 않는다면 2를 빼주고 answer을 ++한다.
  5. while문을 전부 돌려주고 값이 0이 아니라면 -1을 리턴한다.
  6. 그렇지 않으면 다음 값을 확인한다.

코드

class Solution {

    public int minimumRounds(int[] tasks) {
        int answer = 0;
        HashMap<Integer, Integer> map = new HashMap<>();

        for(int i=0; i<tasks.length; i++){
            if(map.containsKey(tasks[i])){
                int tmp = map.get(tasks[i]) +1;
                map.put(tasks[i], tmp);
                //System.out.println(tmp);
            }else{
                map.put(tasks[i], 1);
            }
        }

        
        for(int key : map.keySet()){
            int value = map.get(key);
            System.out.println("key value " + key + " " + value);
            if(value < 2){
                System.out.println("No");
                return -1;
            }

            while(true){
                if(value <= 1){
                    break;
                }

                if(value-3 != 1 && value >= 3){
                    value -=3;
                    answer++;
                }else{
                    value -= 2;
                    answer++;
                }
            }

            if(value != 0){
                System.out.println("No");
                return -1;
            }
        }

        return answer;
    }

}

해설

나는 빼기로 풀었지만 나누기로 한 번에 풀 수도 있다. 해당 값이 1이라면 -1을 반환하고 3으로 나눠 떨어지면 3으로 나눈 몫을 answer에 더한다. 나눠 떨어지지 않으면 몫에다가 1을 더하고 그 값을 answer에 더한다.

class Solution {

    public int minimumRounds(int[] tasks) {
        int answer = 0;
        HashMap<Integer, Integer> map = new HashMap<>();

        for(int i=0; i<tasks.length; i++){
            if(map.containsKey(tasks[i])){
                int tmp = map.get(tasks[i]) +1;
                map.put(tasks[i], tmp);
            }else{
                map.put(tasks[i], 1);
            }
        }

        
        for(int key : map.keySet()){
            int value = map.get(key);

            if(value == 1){
                return -1;
            }

            if(value % 3 == 0){
                answer += (value/3);
            }else{
                answer += value/3 + 1;
            }
        }

        return answer;
    }

}

링크

https://leetcode.com/problems/minimum-rounds-to-complete-all-tasks/description/

profile
https://jiwonna52.tistory.com/

0개의 댓글