🔸 문제 접근 방식
다음 방식으로 문제를 접근하였다.
- 논문이 인용될 최대값을 H-index로 설정한 뒤 1씩 감소시켜가며 H-index 조건을 확인한다.
- 인용될 최대값은 len(citations)
- H-index는 두 조건을 만족한다.
- H-index 회 이상 인용된 논문의 수가 H-index 이상이다.
- H-index 회 이하 인용된 논문의 수가 H-index 이하이다.
- H-index 의 최대값을 선택한다.
📌 문제 풀이
정렬 문제이기는 하나, H-index가 될 target값을 기준으로 citations을 분리했다.
- target값보다 크거나 같은 논문은 bigList에 추가
- target값보다 작거나 같은 논문은 smallList에 추가
그리고 2 조건을 만족하면 H-index 그룹인 resultList에 추가하였다.
- target값과 bigList의 원소 값이 크거나 같다.
- target값과 smallList의 원소값이 작거나 같다.
최종적으로 reusltList의 최대값을 뽑아내 반환함으로써 문제를 해결했다.
💧 Source Code
def solution(citations):
''' 가장 큰 인용횟수부터 H-index 찾기
Notes:
1. target값의 최대값부터 1씩 내려온다.
2. target값보다 크거나 같은 값을 bigList에 모은다.
3. target값보다 작거나 같은 값을 smallList에 모은다.
4. 다음 두 조건을 만족하면 최종 resultList에 target값을 추가한다.
- bigList의 개수(target보다 많이 인용된 논문수)가 target값보다 크거나 같다.
- smallList의 개수(tartget보다 적게 인용된 논문수)가 target값보다 작거나 같다.
5. resultList 중 최대값을 구한다.
Args:
citations (List): int형 값들을 담고 있는 List
Returns:
answer (int) : H-index의 최대값으로 정수값
'''
resultList = []
for target in range(len(citations), 0, -1):
bigList = [big for big in citations if target <= big]
smallList = [small for small in citations if target >= small]
if (len(bigList)>=target) & (len(smallList)<=target):
resultList.append(target)
print(target)
if len(resultList) >= 1:
answer = max(resultList)
return answer
else:
return 0
citations = [0]
print(solution(citations))
👍 Best Code
def solution(citations):
citations = sorted(citations)
l = len(citations)
for i in range(l):
if citations[i] >= l-i:
return l-i
return 0
정렬을 수행한 뒤, 인용 횟수의 최소값부터 조건을 탐색했다.
조건은 인용 횟수가 전체 논문 수 - i보다 크거나 같으면 해당 값을 반환한다.
- 만약 가장 적은 인용 횟수가 전체 논문수보다 크거나 같다면 해당 값 반환
❓ 예를 들어 논문수가 7개이고, 가장 적게 인용된 횟수가 7이라면?
→ 7이 H-index가 된다.
→ citations[0] == 7, l-i = 7-0
'알고리즘' 카테고리의 다른 글
프로그래머스 - 조이스틱 (Greedy) (0) | 2021.06.21 |
---|---|
프로그래머스 - 체육복 (Greedy) (0) | 2021.06.20 |
프로그래머스 - 가장 큰 수 (정렬) (3) | 2021.06.16 |
그리디 문제풀이 - 볼링공 선택하기 (0) | 2021.06.13 |
그리디 문제 풀이 - 만들 수 없는 금액 (0) | 2021.06.12 |