일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jpa
- Invalid property 'principal.username' of bean class
- AccessToken
- interface
- 백준
- kotest testcontainers
- 형상관리
- netty
- RefreshToken
- multimodule testcontainers
- OptimisticLock
- redissonlock aop
- 알고리즘
- S3
- Spring Cloud Gateway
- 우아한 테크러닝
- 낙관적 락 재시도
- java
- springsecurity
- TestContainers
- spring DI
- ObjectOptimisticLockingFailureException
- 소수찾기 java
- 낙관적 락 롤백
- DI
- aop
- 멀티모듈 테스트컨테이너
- @transactional
- spring aop
- ObjectOptimisticLockingFailureException 처리
- Today
- Total
조급하면 모래성이 될뿐
[프로그래머스] H-Index 본문
문제 링크 : https://programmers.co.kr/learn/courses/30/lessons/42747
코드
package Programmers.Level2;
import java.util.Arrays;
public class HIndex {
public static void main(String[] args) {
int[] citations = { 3,3,3,3,3 } ;
int answer = solution(citations);
System.out.println(answer);
}//main
public static int solution(int[] citations) {
// 오름차순.
Arrays.sort(citations);
int max = citations.length ;
int i ;
// 최대 h값은 논문의갯수이다.
// h의 max값을 구할 것이다.
for ( i = max-1; i >= 0 ; i-- ) {
System.out.println(" citations[ "+(max-1-i)+" ] : " + citations[ max-1-i]);
System.out.println(" i : " + i );
// 예를들어 논문의갯수가 5일때면 모든 논문이 5이상이어야한다.
// 그렇다는것은, 가장 작은값도 5를 넘는지 확인해야한다.
if ( citations[ max-1-i ] >= i+1 ) break;
}
return i+1;
}//solution
}//class
나의 풀이
먼제 문제를 이해하는데 시간이 걸렸다.
입출력 예
citations | return |
[ 3,0,6,1,5 ] | 3 |
입출력 예 설명
: 이 과학자가 발표한 논문의 수는 5편이고, 그중 3편의 논문은 3회 이상 인용되었습니다. 그리고 나머지 2편의 논문은 3회 이하 인용되었기 때문에 이 과학자의 H-Index는 3입니다.
여기서 3회 이상 인용 된 논문이 3을 포함한 [ 3,5,6 ] 3개이면, 3회이하 인용 된 논문도 3을 포함해서 [ 0,1,3 ]인 3이 아닌가 싶다..
h값을 포함하지않으면, 아래와 같이 H-INDEX가 1일때도 조건에 성립하게 되는 경우가 존재하게 된다.
1이상 인용 된 논문의 수 : [ 1,3,5,6 ] , 1이하 인용 된 논문의 수 : [ 0 ]
그래서 이하조건에도 h값을 포함하도록 해서 문제를 해결해 나갔다.
문제 풀이의 핵심
첫번째는, H-INDEX의 MAX값은 논문의 갯수라는 점이다.
왜?
문제를 보면 "h번이상 인용된 논문이 h편이상이고.." 라고 되어있다.
예를들어 [5,10]일때 h가 5라고 생각된다면 위에 h값을 넣어보자.
=> 5번이상 인용된 논문이 5편 이상이고..
내가 쓴 논문은 2개인데 5편이상 인용 될 수 없다.
두번째는, H-INDEX의 조건을 활용하는 것이다.
먼저 예시로 [ 3,0,6,1,5 ] 의 경우
h가 5가 되려면? => 모든 논문은 5번이상 인용 되어야 함. => 가장 작은 숫자는 무조건 5이상 이어야됨.
h가 4가 되려면? => 모든 논문은 4번이상 인용 되어야 함. => 두 번째 작은 숫자는 무조건 4이상 이어야됨.
h가 3가 되려면? => 모든 논문은 3번이상 인용 되어야 함. => 세 번째 작은 숫자는 무조건 3이상 이어야됨.
h가 2가 되려면? => 모든 논문은 2번이상 인용 되어야 함. => 네 번째 작은 숫자는 무조건 2이상 이어야됨.
h가 1가 되려면? => 모든 논문은 1번이상 인용 되어야 함. => 다섯 번째 작은 숫자는 무조건 1이상 이어야됨.
이 조건을 쉽게 풀기위해 먼저 주어진 값을 오름 차순으로 정렬 해 주었다. => [ 0,1,3,5,6 ]
그리고 위의 조건을 다시보면,
h가 5가 되려면? => 가장 작은 숫자는 무조건 5이상 이어야됨. => 가장 작은 수 = 0 => 조건에 맞지않음
h가 4가 되려면? => 두 번째 작은 숫자는 무조건 4이상 이어야됨. => 두 번째 작은 수 = 1 => 조건에 맞지않음
h가 3가 되려면? => 세 번째 작은 숫자는 무조건 3이상 이어야됨. => 세 번째 작은 수 = 3 => 조건에 맞음
이렇게 찾아 갈 수 있다.
그리고 데이터가 오름 차순 되어있기 때문에 이상조건을 만족하면 이하조건은 자연스럽게 같이 만족하게 된다.
제출 결과
'Algorithm > Programmers' 카테고리의 다른 글
[프로그래머스] 타겟 넘버 (0) | 2019.12.11 |
---|---|
[프로그래머스] 구명보트 (0) | 2019.12.11 |
[프로그래머스] 멀쩡한 사각형 (18) | 2019.12.07 |
[프로그래머스] 더 맵게 (0) | 2019.12.06 |
[프로그래머스]소수 찾기 (0) | 2019.11.07 |