https://school.programmers.co.kr/learn/courses/30/lessons/42747
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. 위키백과1에 따르면, H-Index는 다음과 같이 구합니다.
어떤 과학자가 발표한 논문 n편 중, h번 이상 인용된 논문이 h편 이상이고 나머지 논문이 h번 이하 인용되었다면 h의 최댓값이 이 과학자의 H-Index입니다.
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.
제한사항
- 과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.
- 논문별 인용 횟수는 0회 이상 10,000회 이하입니다.
풀이 설계
- 최댓값을 구해야하므로 리스트 citations를 역순으로 정렬한다.
- for문을 돌리면서 citations가 i+1보다 작아지면 break 한다.
- break한 이전 시점이 정상 값이므로 i를 answer에 저장한다.
1차 시도 (실패)
- 16개 중 1개가 실패 했다.
def solution(citations):
answer = 0
citations.sort(reverse=True)
for i in range(len(citations)):
if citations[i] <= i+1:
answer = i
break
return answer
2차 시도 (성공)
- citations[i]가 작거나 같아지는 순간을 찾아야 하므로 반대로 생각해서 citations[i]가 i+1 보다 크다면 answer에 저장하면서 값을 갱신한다.
- 그러다가 작아지는 순간 break를 하면 이전까지 저장된 answer를 출력한다.
def solution(citations):
answer = 0
citations.sort(reverse=True)
for i in range(len(citations)):
if citations[i] >= i + 1:
answer = i + 1
else:
break
return answer
다른 풀이
- enumerate를 사용해서 간단히 푸는 코드를 발견했다.
- enumerate로 citations와 순서로 구성된 튜플을 만든다.
- 그 중 작은 값을 찾아서 리스트를 만든다.
- 만들어진 리스트에서 최댓값을 찾으면 H-index를 찾을 수 있다.
def solution(citations):
citations.sort(reverse=True)
answer = max(map(min, enumerate(citations, start=1)))
return answer


후기
- 우선 문제 이해부터가 오래 걸렸다. H-index에 대한 설명을 읽어도 '음...' 이런 느낌이었어서 이전 문제들에 비해 이해하는데 생각보다 오래걸렸다.
- 1차 시도에서 테케 1개가 틀려서 반례를 찾는것도 오래 걸렸다. 대체 뭐가 틀린건가 한참 고민함....
- 코드 길이에 비해 만만찮은 문제...
- enumerate에 대해 공부해봐야할 듯하다.
'알고리즘 문제풀이 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 기능개발 - 파이썬(python) (0) | 2024.01.11 |
---|---|
[프로그래머스] 행렬의 곱셈 - 파이썬(python) (0) | 2024.01.10 |
[프로그래머스] n^2 배열 자르기 - 파이썬 (python) (0) | 2024.01.08 |
[프로그래머스] 괄호 회전하기 - 파이썬 (python) (0) | 2024.01.07 |
[프로그래머스] 연속 부분 수열 합의 개수- 파이썬(python) (1) | 2024.01.06 |
댓글