개인 공부/TIL

[ TIL - PGS ] 99클럽 코테 스터디 9일차 TIL + 오늘의 학습 가이드

킴도비 2024. 7. 30. 22:21

💡 오늘의 학습 키워드

  • Heap
  • PriorityQueue

 

✅ 오늘 공부한 내용

  • PriorityQueue
  • Heap
  • 오늘의 프로그래머스 문제! 더 맵게
 

프로그래머스

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

programmers.co.kr

 

 

👀 오늘의 회고

🤣 오늘의 문제점

  • While의 조건문을 똑똑하게 세우자..
  • ArrayList를 썼다가 효율성 테스트에서 탈락했다.

 

🔥 어떤 시도를 했는가?

  • 초반에는 배열을 추가하고 제거하는 방식을 해야한다는 것에만 꽃혀서 효율성을 따지지 않고 만들었다가 효율성에서 모두 다 탈락하는 그런 사태가 발생하였다..
  • 그래서 검색을 해보니 Priority Queue는 우선순위 큐이기 때문에 추가 정렬 등의 소스코드를 짜지 않아도 된다든 것을 발견하게 되었다!
  • 해당 구조를 이해하고 풀어보니 아주 쉽고 빠르게 풀 수 있었다.
  • 아래는 실패한 소스코드이다.. 지금 다시 보니 매우 비효율적이게 보인다 😂
더보기
import java.util.*;

class Solution {
    public int solution(int[] scoville, int K) {
        // Leo 모든 음식의 스코빌 지수를 K 이상으로 만들고 싶다.
        // Leo가 스코빌 지수가 가장 낮은 두 개의 음식을 아래와 같이 특별한 방법으로 섞어 음식을 만든다.
        
        // 섞은 음식의 스코빌 지수 = 가장 맵지 않은 음식의 스코빌 지수 + (두 번째로 맵지 않은 스코빌 지수 * 2)
        
        // 모든 음식의 스코빌 지수가 K 이상이 될 때까지 반복하여 섞는다.
        // 모든 음식의 스코빌지수를 K 이상으로 만들 수 없는 경우에는 -1을 return 한다.
        Arrays.sort(scoville);
        
        ArrayList<Integer> arr = new ArrayList<>();
        
        for(int i = 0; i < scoville.length; i++){
            arr.add(scoville[i]);
        }
        
        int start = 0;
        int end = 0;
        int sum = 0;
        int cnt = 0;

        
        while(arr.size() > 1 && Collections.min(arr) < K){
            //if(j >= scoville.length) break;
            Collections.sort(arr);
            
            start = arr.remove(0);        
            end = arr.remove(0);
            
            sum = start + (end * 2);
 
            arr.add(sum);
            cnt++;
            //System.out.println(arr);  
        }
        
        int answer = 0;
        
        if(Collections.min(arr) < K) {
            return -1;
        } else {
            answer = cnt;
        }
        
        return answer;
    }
}

 

  • 아래는 성공한 코드이다!
import java.util.*;

class Solution {
    public int solution(int[] scoville, int K) {

        PriorityQueue <Integer> pQ = new PriorityQueue<>();
        
        for(int i : scoville){
            pQ.add(i);
        }
        
        int cnt = 0;
        
        while(pQ.size() > 1 && pQ.peek() < K){
            int start = pQ.poll();
            int end = pQ.poll();
            
            int sum = start + (end * 2);
            pQ.add(sum);
            
            cnt++;
        }
        
        int answer = 0;
        
        if(pQ.peek() < K){
            return -1;
        } else {
            answer = cnt;
        }
        
        return answer;
    }
}

 

👏 무엇을 새로 알았는가?

  • 초반에는 일단 풀어야 했기 때문에 해당 블로그에서 먼저 Priority Queue에 대해 먼저 학습하였다.
  • 그 다음으로는 자료구조에서 우선순위 큐와 힙에 대하여 두 개의 블로그를 참고하였다. 긴 내용의 블로그짧은 글의 블로그 모두 도움이 되었다.
  • Priority Queue란?
// FIFO 구조를 가지면서 순서대로 나가는 것이 아닌 우선순위를 먼저 결정하고 
// 우선순위가 높은 데이터가 먼저 나가는 구조
// 내부 구조는 heap으로 구성되어 이진트리 구조이다.
// 힙으로 구성되어 있기에 시간 복잡도는 O(NlogN)이다.

// Priority Queue 사용법
import java.util.*;

// 낮은 숫자가 우선순위인 우선순위 큐
PriorityQueue<Integer> pQ = new PriorityQueue<>();

// 값 추가
pQ.add(1);

// 첫 번째 값을 반환하고 제거한다. 비어있다면 null 반환
pQ.poll();

// 첫 번째 값을 반환한다. 비어있다면 null 반환
pQ.peek();

// 큐가 비어있는지 boolean 형식으로 알려준다.
System.out.println(pQ.isEmpty());

 

 

👩‍💻 내일은 무엇을 학습할 것인가?

  • 항해 99 문제 풀기
  • 코테 스터디 진행하기
  • 자소서 쓰기