일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 프로그래머스
- authorizeUrls
- 알고리즘
- 정렬
- authorizeRequests
- 스프링시큐리티
- springsecurity
- python manage.py migrate
- AuthenticationManagerBuilder
- 스프링
- 정적리소스
- 개발자
- 알고리즘 #프로그래머스 #K번째수 #자바 #JAVA #정렬알고리즘 #정렬
- minitest
- ruby
- authorizeUrls missing
- 파이썬 #기타제어흐름도구 #제어문 #함수 #FOR문
- Spring
- MySQL
- 파이썬 #자료형 #python
- configureGlobal
- ruby-prof
- 자바
- Rails
- character_set
- Ruby on Rails
- Java
- 루비
- WebSecurityConfigurerAdapter
- 알고리즘 #자료구조 #리스트 #스택 #큐 #트리
- Today
- Total
손만이의 개발노트
[JAVA][프로그래머스][정렬] H-Index 본문
원사이트 : https://programmers.co.kr/learn/courses/30/lessons/42747
코딩테스트 연습 - H-Index | 프로그래머스
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다. 어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h가 이 과학자의 H-Index입니다. 어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-
programmers.co.kr
1.문제설명
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h가 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.
2.제한사항
- 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
- 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.
3.입출력 예
citations | return |
[3, 0, 6, 1, 5] | 3 |
4.풀이(JAVA)
class Solution {
public int solution(int[] citations) {
int answer = 0;
int compareCount = 0;
int arrayLength = citations.length;
for(int i=1; i<=arrayLength; i++){
int comapreValue = i;
compareCount = 0;
for(int j=0; j<arrayLength; j++){
if(citations[j] >= comapreValue) compareCount++;
}
if(compareCount>=comapreValue && comapreValue>= (arrayLength-compareCount)){
answer = comapreValue;
}
}
return answer;
}
}
5.다른 사람 풀이
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;
}
}
6.분석 및 개선점
(4의 분석)
1. n개의 배열에 n번의 검사를 2번 실행하여 최댓값 결과 반환. (선택정렬 2번 사용)
(5의 분석)
1. Arrays.sort()를 이용하여 오름차순 정렬(퀵정렬)
2. 주어진 문제(h-index)의 특성을 이용한 선택정렬을 하여 h-index값 도출.
- 3의 입출력예를 들어 설명을 해보자.
- 역순으로 탐색을 시작하는 경우 가장 큰 수에 대하여 최소 h-index는 1번이 된다.
- 위 의 말을 식으로 정리하면 N크기의 배열에 대하여 h-index는 최소 N-(N-1)이 보장되기에 역순으로 값을 찾는 식을 사용.
- h-index의 특징인 h편의 논문이 h편이상 인용 나머지가 h편이상이 되는 조건을 충족하기 위해 두 수중 최소값 중에서 가장 큰 값을 h-index를 사용
(4의 풀이 개선점)
1. 코드가 간결하지 못하여 가독성이 떨어진다.
2. 5의 풀이의 경우 n길이의 배열엥 대하여 2번 정렬은 하나 1번은 Array.sort()로 정렬하기에
퀵정렬이 적용되어 내 풀이보다 빠른 속도를 기대할 수 있는 반면에
4의 풀이에는 선택정렬을 2번 사용한 방식으로 무조건 N x N번의 탐색을 진행하기에
속도 측면에서 5번보다 효율적이지 못할 수 있다.
(단, 5의 풀이는 min함수를 매번 호출하는 점에서 이슈가 있을 수 있다.)
'알고리즘' 카테고리의 다른 글
[JAVA][프로그래머스][정렬] 가장 큰 수 (0) | 2019.11.18 |
---|---|
[JAVA][프로그래머스][정렬] k번째수 (0) | 2019.10.21 |
자료구조 정리 (0) | 2019.09.18 |