본문 바로가기
문제풀이/프로그래머스

H-index / 프로그래머스 연습문제 / programmers / level2 / Java

by RUCKUS 2022. 7. 31.

 

https://school.programmers.co.kr/learn/courses/30/lessons/42747 

 

프로그래머스

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

programmers.co.kr


H-Index를 구하는 방법에 대한 문제이다.

 

H-Index란 과학자의 생산성과 영향력을 나타내는 지표라고 하는데, 자세한 설명은 검색하면 나온다.

알고리즘의 관점에서는 x번 이상 인용된 논문이 x편이상이고 나머지 논문이 x번 이하 인용되었다면, 그 x의 최대값을 찾는 것이라고 생각하면 편하겠다.

 

해서 length가 1~1000인 배열이 주어지고 해당 배열에는 0~10000의 값이 무분별하게 담겨있다.

 

예를 들어 6편의 논문이 있고 인용한 횟수가 각각 [0, 5, 8, 1, 21, 15] 라고 가정하면

 

0번 이상 인용된 논문이 0편 이상이고 나머지 논문이 0번 이하 인용 = False

5번 이상 인용된 논문이 5편 이상이고 나머지 논문이 5번 이하 인용 = False

8번 이상 인용된 논문이 8편 이상이고 나머지 논문이 8번 이하 인용 = False

1번 이상 인용된 논문이 1편 이상이고 나머지 논문이 1번 이하 인용 = False

21번 이상 인용된 논문이 21편 이상이고 나머지 논문이 21번 이하 인용 = False

15번 이상 인용된 논문이 15편 이상이고 나머지 논문이 15번 이하 인용 = False

 

대입해보면 모두다 정답이 아니다.

 

4를 대입해보면 어떨까?

 

4번 이상 인용된 논문이 4편 이상이고 나머지 논문이 4번 이하 인용 = True

4번 이상 인용된 논문 [5, 8, 15, 21]

4번 이하 인용된 논문 [0, 1]

 

여기서 주의할 점은 꼭 주어진 인용 수가 답이 아니라는 것과 인용된 논문이 x편 이라는게 아니라 x편 이상 이라는 것이다.

 

자 그럼 문제를 어떻게 풀것이냐?

오름차순을 하여 반복문을 사용한 후 그 안에서 비교하는 방식으로 결과를 구하려고 한다.

 

해결순서

 

1. 우선 오름차순 정렬을 한다. [0, 1, 5, 8, 15, 21]

2. 논문의 수 만큼 반복문을 시행한다. for (int i = 0; i < 논문.length(); i++)

3. 반목문을 수행할 때 마다 논문의 수에 인용된 수를 뺀값을 저장한다. Temp 라고 하겠다. int Temp = 논문.length() - i;

4. 논문의 인용된 수가 Temp보다 크거나 같으면 그 순서의 Temp 값이 정답이다.

 

i = 0 / 논문배열[i] = 0 / Temp = 6 - 0 = 6

if (0 >= 6) = False

 

i = 1 / 논문배열[i] = 1 / Temp = 6 - 1 = 5

if (1 >= 5) = False

 

i = 2 / 논문배열[i] = 5 / Temp = 6 - 2 = 4

if (5 >= 4) = True

 

i = 3 / 논문배열[i] = 8 / Temp = 6 - 3 = 3

if (8 >= 3) = False

 

i = 4 / 논문배열[i] = 15 / Temp = 6 - 4 = 2

if (15 >= 2) = False

 

i = 5 / 논문배열[i] = 21 / Temp = 6 - 5 = 1

if (21 >= 1) = False

 

소스코드

import java.util.Arrays;

class Solution {
    public int solution(int[] citations) {
        int answer = 0;
        
        Arrays.sort(citations);
        
        for (int i = 0; i < citations.length; i++) {
            
            int temp = citations.length - i;
            System.out.println("i = " + i + " citations : " + citations[i] + " Temp : " + temp);
            if (temp <= citations[i]) {
                answer = temp;
                break;
            }
            
        }
        
        return answer;
    }
}

진짜 오랜만에 알고리즘 문제 풀었는데 엄청 오래걸렸다... 레벨 1부터 다시 해야할 것 같다.

https://github.com/RUCKUSJERRY/practiceOfAlgorithm/blob/main/Prs_Pratice/src/com/level02/Citations.java

 

GitHub - RUCKUSJERRY/practiceOfAlgorithm

Contribute to RUCKUSJERRY/practiceOfAlgorithm development by creating an account on GitHub.

github.com