개인 공부/TIL

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

킴도비 2024. 7. 31. 20:19

💡 오늘의 학습 키워드

 

✅ 오늘 공부한 내용

  • Deque
  • 오늘의 프로그래머스 문제! 이중우선순위큐 
 

프로그래머스

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

programmers.co.kr

 

 

👀 오늘의 회고

🤣 오늘의 문제점

  • 처음에는 우선순위 큐로 제거해야지~ 하고 생각을 했었다. 하지만 생각해보니 최댓값을 제거할 수 있는 구조가 아니었다..
  • 두 번째는 데큐를 사용할까? 했었다. 그런데 찾아보니 정렬하기가 영 쉽지 않아 보였다...그래서 패스하고
  • 마지막으로 시도했던 ArrayList로 성공했다 ✌ 😎

 

🔥 어떤 시도를 했는가?

  • 일단 먼저 저장될 배열을 split으로 구분을 해주어야 했다.
  • switch - case 형식을 쓸까 하다가 그냥 if문으로 구분해 주었다.
  • 그런데 ArrayList이다 보니까 정렬이 필요해서 I로 숫자를 삽입할 때 Collections.sort()로 매번 정렬시켜줬다. 메모리 생각을 하면 많이 비효율적인 것 같다..
  • 두 번째 D일때 제거를 했어야 하는데 여기서 조금 문제가 있었다. array가 없을 때도 제거를 하면  java.lang.IndexOutOfBoundsException: Index -1 out of bounds for length 0 에러가 생겼기에 !arr.isEmpty()문을 추가해 주었다.
  • 그 뒤로 마지막에 isEmpty로 구분하여 answer에 값들을 넣어주었다.
import java.util.*;

class Solution {
    public int[] solution(String[] operations) {
        // 이중 우선순위 큐
        // I 숫자 : 큐에 숫자 삽입
        // D 1 : 큐에서 최댓값 삭제
        // D -1 : 큐에서 최솟값 삭제
        
        // 모든 연산을 처리한 후 큐가 비어 있으면 [0, 0]
        // 비어 있지 않으면 [최댓값, 최솟값]

        ArrayList<Integer> arr = new ArrayList<>();
        
        String a = "";
        String num = "";
        
        for(int i = 0; i < operations.length; i++){
            String[] parts = operations[i].split(" ");
            a = parts[0];
            num = parts[1];
            
            if("I".equals(a)){
                
                arr.add(Integer.parseInt(num));
                Collections.sort(arr);
                
            } else if ("D".equals(a)){
                
                if(!arr.isEmpty()){
                    
                    if("1".equals(num)){
                        
                        arr.remove(arr.size() -1);
                        
                    } else if("-1".equals(num)){
                        
                        arr.remove(0);
                        
                        
                    }
                }
                
            }
        }
        
        int[] answer = new int[2];
        
        if(arr.isEmpty()){
            answer[0] = 0;
            answer[1] = 0;
        } else {
            answer[0] = arr.get(arr.size() - 1);
            answer[1] = arr.get(0);
        }
        
        return answer;
    }
}

 

👏 무엇을 새로 알았는가?

  • Deque가 무엇인지 공부할 수 있었다! 
  • Deque는 신기하게 앞과 뒤의 값을 제거하고 삽입할 수 있는 구조였다. 한번 코테 풀 때 요긴하게 써보고 싶어졌다✨
  • 새로운 에러를 발견했다. 하지만 이건 내가 구조상 잘못짜서 발생했던 구조이기에 다음 번에는 같은 실수를 하지 않게 외워야겠다!
  • 아 그런데 ChatGPT가 우선순위 큐를 사용하라고 추천해주었다. 다음에 재시도할 때 한번 도전해 보고 싶다.

 

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

  • 항해99 문제 풀기
  • 공고 적기
  • 책 읽기
  • 원티드꺼 하기..