728x90
programmers.co.kr/learn/courses/30/lessons/42747?language=python3#
접근
문제를 이해하는데 어려움을 겪었고 많은 테스트 케이스를 놓쳤다.
먼저 인용횟수가 입력되는데 해당 인용횟수 중에서 h편 이상 인용된 논문이 h 이상일 때를 찾는 줄 알았다. 하지만 인용횟수가 담긴 리스트가 아닌 0회에서 10,000회 이하의 수 중에서 조건에 부합하는 h를 찾는 것이다.
또한 h편 이상인 논문이 h이상이고 나머지는 h편 이하라고 했다. h가 겹치는데 어떻게 처리해야할지 고민이 있었다. 이를 한 번은 h편 이상인 논문을 카운트하고 한 번은 h편 초과한 논문을 카운트하여 조건에 부합하는 h를 찾았다.
구현
n부터 내림차순으로 h를 찾도록 하였다.
n은 citations의 길이와 citations에 있는 횟수 중 최댓값에서 최솟값을 갖도록 한다. 왜냐하면 둘 중 하나인 값까지만 검사하면 되고 (31, 66) 일 때 31과 66은 볼 필요가 없고 길이인 2까지만 보면 된다.
이후 h편 이상인 논문과 h편 초과인 논문을 찾고 조건에 부합했을 때 answer에 h를 담고 break를 한다.
조건에 부합하는 것은 이상이거나 초과를 카운트하는 up과 h가 같을 때이다.
def solution(citations):
answer = 0
n = min(len(citations), max(citations))
for i in range(n, -1, -1):
h = i
up = down = 0
# h편 이상인 논문 카운트
for c in citations:
if c >= h:
up += 1
else:
down += 1
if h==up:
answer = h
break
up = down = 0
# h편 초과인 논문 카운트
for c in citations:
if c > h:
up += 1
else:
down += 1
if h==up:
answer = h
break
return answer
'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글
[Level 2] 최댓값과 최솟값 (0) | 2021.03.04 |
---|---|
[Level 2] 소수 찾기 (0) | 2021.03.04 |
[Level 3] 여행 경로 (0) | 2021.03.03 |
[Level 2] 타겟 넘버 (0) | 2021.03.03 |
[Level 3] 가장 먼 노드 (0) | 2021.03.02 |