본문 바로가기

알고리즘/99클럽 코딩테스트 스터디 2기

99클럽 코테 스터디 8일차 TIL - LV2. H-Index

728x90
반응형

 

오늘의 학습 키워드

  • 정렬

오늘의 회고

1. 문제

문제 URL

 

프로그래머스

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

programmers.co.kr

2. 해결 방안

import java.util.*;
class Solution {

// 솔루션 1 (내가푼 것)
    public int solution(int[] citations) {
        int cnt = 0; // 논문 몇편 이상인지 카운팅
        PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder()); // 가장 큰 값부터 체크해서 카운팅하기 위해 최대값부터 뽑을 수 있는 우선순위큐 사용
        for(int i=0; i< citations.length; i++) {
            pq.add(citations[i]);
        }

        for(int h=citations.length; h>=0; h--) { // h(답)은 논문 개수 이하여야 함. 논문 개수~0 까지 반복문 가능
            while(!pq.isEmpty() && h <= pq.peek()) { // h 이상인 경우의 논문만 큐에서 빼고 카운팅
                pq.poll();
                cnt++;
            }
            if(h <= cnt) { // h가 카운팅보다 작거나 같아지는 시점이 최대값이므로 리턴
                return h;
            }
        }
        return 0; 
    }
    
// 솔루션 2 (참고 코드)
    public int solution(int[] citations) {
        int answer = 0;
        Arrays.sort(citations);
        for(int i=0; i<citations.length; i++) {
            int h = citations.length - i;
            if(citations[i] >= h) {
                answer = h;
                break;
            }
        }
        return answer; 
    }
}

 

<솔루션 1 : 내가 푼 것>

  • 최대값이 나오는 우선순위큐를 이용했다. h의 최대값을 뽑기 위해 높은->낮은 순으로 체크할 수 있도록 했고 큐에서 제거하면서 카운팅했다.

<솔루션 2 : 참고 코드>

  • 구지 큐를 활용 안해도 배열 그대로 해결할 수 있는 문제였다..!
  • 배열 오름차순 정렬하고 h는 길이-i 라서 내 코드에서 내림차순으로 for문 돌린 것과 같은 의미.
  • 큐에서 없애고 그런 작업 필요 없이 조건에 해당하면 h를 응답으로 내면 됨. (아니 난 왜 큐를쓴거여?ㅠ)

3. 피드백

  • 처음에 요구사항을 잘못 이해했다. 풀이에서 h가 아니고 citations[h]을 비교했음.
  • 제출 성공이 되어서 잘 푼줄 알았는데 다른 솔루션을 보니 내 코드는 불필요한 로직이 있었음. (구지 내림차순 안해도 되는 것, 큐 안써도 되는 것)

4. 새로 알게된 것

  • PriorityQueue<Integer> pq = new PriorityQueue<>(Collections.reverseOrder());
    • 내림차순 정렬 하려면 우선순위큐 초기화 코드 파라미터로 Collections.reverseOrder() 을 주면 코드 단축 가능
728x90
반응형