본문 바로가기
Algorithm/프로그래머스

[프로그래머스] H-Index / java

by 코딩친구 2021. 6. 14.
반응형

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

 

코딩테스트 연습 - H-Index

H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표

programmers.co.kr

 

[ 코드 ]

 

import java.util.*;

class Solution {
    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;
    }
}


출처 : https://ju-nam2.tistory.com/74

 

 

 

처음에 경우의 수를 4가지로 나눠서

 

길이가 짝수일 때와 홀수일때,

또 그 안에서 가운데거가 길이보다 클 때 작을 때를 나눠 계산했는데

 

사실 그럴 필요가 없었다...!

 

가운데를 기준으로 하는 것이 아니라 최대의 길이일 때를 기준으로 하여 찾아내면 되었다.

 

 

 

 

 

[ 고수의 코드 ]

 

import java.util.*;

class Solution {
    public int solution(int[] citations) {
        Arrays.sort(citations);

        int max = 0;
        for(int i = citations.length-1; i > -1; i--){
            int min = (int)Math.min(citations[i], citations.length - i);
            if(max < min) max = min;
        }

        return max;
    }
}

 

 

나도 생각을 하다 하다 거리와 해당 들어있는 배열 중 더 작은 것으로 하면 되겠다 까지는 생각해냈는데

그걸 공식으로 만든 것이 고수의 코드이다.

 

보실 분들은 참고하셔서 도움이 되었으면 한다.

 

 

 

 

 

[ 틀린 코드 ]

 

class Solution{
	public int solution(int[] citations) {
        int answer = 0;
        
        Arrays.sort(citations);
        
        int n = citations.length/2;
        int i = citations[n]; // 논문 위치
		int j = n; // 논문 갯수
		
        if(citations.length%2==0) {
        	if(citations[n]<=n) {
        		while(i<=j) {
        			i++;
        			j--;
        		}
        		answer = i;
        	}else {
        		while(i<=j) {
        			i--;
        			j++;
        		}
        		answer = i;
        	}
        }else {
        	if(citations[n]<=n+1) {
        		while(i<=j+1) {
        			i++;
        			j--;
        		}
        		answer = i;
        	}else {
        		while(i<=j+1) {
        			i--;
        			j++;
        		}
        		answer = i;
        	}
        }
        
        return answer;
    }
}

 

너무 복잡하게 생각하였다

 

 

 

 

※ 오늘의 교훈

최대라고 하면 최대부터 생각을! 단순하게 수학 문제를 풀 때도 있어야한다.

반응형