👀 문제
https://programmers.co.kr/learn/courses/30/lessons/42747
테스트케이스 추가
citations(int[]) | return |
---|---|
[22,42] | 2 |
[20,19,18,1] | 3 |
[2,2,2] | 2 |
👊 첫 번째 도전
1. 설계
- 배열을 내림차순으로 정렬한다.
- h는 배열 원소 갯수부터 시작해서 하나씩 줄어든다.
- 배열을 처음부터 순회하면서 원소가 h보다 같거나 크면 cnt++.
- 작으면 멈추고 cnt==h인지 체크, 같으면 h를 리턴한다.
- 다르면 h–하고 다시 처음부터 순회한다.
2. 구현
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
32
33
34
35
36
37
import java.util.Arrays;
import java.util.Collections;
/**
*
* @author HEESOO
*
*/
class Solution {
public int solution(int[] citations) {
int answer = 0;
int h=citations.length;
int cnt=0;
Integer[] array=new Integer[citations.length];
array=Arrays.stream(citations).boxed().toArray(Integer[]::new);
Arrays.sort(array, Collections.reverseOrder());
for(int i=0;i<array.length;i++){
if(array[i]>=h){//원소가 h이상이면
cnt++;
}
else{
if(cnt==h){
answer=h;
break;
}
else{//h--하고 처음부터 다시 시작
h--;
cnt=0;
i=-1;
}
}
if(i==array.length-1){
answer=h;
}
}
return answer;
}
}
3. 결과
실패. 테스트11에서 틀렸다.
4. 문제점
잘 모르겠다. 문제 이해도 잘 안되서 다른 풀이 코드를 참고하였다.
👊 두 번째 도전
1. 설계
- 인용된 논문 수(h)가 배열 순회 인덱스(i+1)보다 작아지면 i를 리턴한다.
2. 구현
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
import java.util.Arrays;
import java.util.Collections;
/**
*
* @author HEESOO
*
*/
class Solution {
public int solution(int[] citations) {
int answer = 0;
Integer array=new Integer[citations.length];
array=Arrays.stream(citations).boxed().toArray(Integer[]::new);
Arrays.sort(array, Collections.reverseOrder());
for(int i=0;i<array.length;i++){
if(array[i]<i+1){
answer=i;
break;
}
if(i==array.length-1){//[22,42] 2 경우
answer=i+1;
}
}
return answer;
}
}
- Integer[] array: int형 배열은 Collections.reverseOrder()를 사용할 수 없으므로 Integer배열로 변환하여 저장한다.
3. 코드 설명
내림차순으로 정렬된 배열과 i를 비교한다.
h i
6 > 0
5 > 1
3 > 2___이때가 i의 최댓값이므로 횟수(i+1, 횟수는 1부터 시작)을 리턴한다.
1 < 3
0 < 4
4. 결과
🤟 성공 🤟
👏 해결 완료!
사실 아직도 내가 문제를 잘못 이해하고 있는 것 같다. 뭔가 알고리즘 문제를 푸는 것은 문제를 얼마나 잘 이해하느냐인 것 같다.
참고
- [프로그래머스/코딩테스트 고득점 Kit/정렬#3] H-Index (Java) https://developerdk.tistory.com/27