개발공부/코딩테스트 연습문제

[프로그래머스] Level.2 - 더 맵게

ku-na 2022. 1. 18. 15:20

문제 설명과 제한사항

풀이

import java.util.*;

class Solution {
    public int solution(int[] scoville, int K) {
        int i = 0;
        Arrays.sort(scoville);
        while(scoville[i] < K){
            scoville[i + 1] = scoville[i] + (scoville[i + 1] * 2);
            Arrays.sort(scoville);
            i++;
            if(i == scoville.length - 1 && scoville[i] < K) return -1;
            else if(i == scoville.length - 1 && scoville[i] >= K) return i;
        }
        return i;
    }
}

++

코드를 짜는데는 오래 걸리지 않았다.

섞은 음식의 스코빌 지수를 두번쨰로 맵지않은~ *2 를 두번째*두번째로 하지 않나

아니면 멍청하게 조건문에서 if(i == scoville. length) 로 하지 않나 등등등 어리석은 짓으로 시간이 조금 걸렸지만

쉬웠는데

효율성 개멸 ㅋㅋ.. 어제 백신 맞았으니까 오늘은 여기까지 해야지~

+++

import java.util.*;

class Solution {
    public int solution(int[] scoville, int K) {
        int count = 0;
        PriorityQueue<Integer> sc = new PriorityQueue<>();
        for(int i=0; i<scoville.length; i++){
            sc.offer(scoville[i]);
        }
        
        while (sc.peek() < K){
            sc.offer(sc.poll() + (sc.poll() * 2));
            count++;
            if(sc.size() == 1 && sc.peek() < K) return -1;
        }
        return count;
    }
}

아침에 와서 느즈막하게 풀었다.. 한시간동안 여러 시도를 해보았지만... 효율성을 높이자니 가독성이 떨어지고

가독성을 떨구면서 효율성 생각해도 한두개씩 실패하고를 반복하고..

그냥 인정했다... 우선순위큐를 사용해야한다는 것을.. 

사실 어제 풀면서 우선순위큐,, 써볼까 했는데

PriorityQueue -> 타자 치기 싫을정도로 길고 까먹었어서 찾아봐야했음. 

그런 이유로 고집부렸다가 시간만 날렸다.

 

1. 우선 순위 큐 (PriorityQueue): 우선순위가 있는 큐(선입선출)

   -> 내부 구조는 힙으로 되어 있음

   -> 기본적으로 우선순위는 오름차순임

import : java.util.PriorityQueue;

선언 : PriorityQueue<T> q = new PriorityQueue<>(); // 우선 순위 : 오름차순 

        PriorityQueue<T> q = new PriorityQueue<>(Collections.reverseOrder()); // 우선 순위 : 내림차순

사용 : 삽입 -> offer(T), add(T) -> add는 삽입성공 시 true 반환

        삭제 -> remove(), poll() -> pool은 첫번째 값 삭제 || 비어있다면 null;

        size() 크기