본문 바로가기
알고리즘/프로그래머스

프로그래머스 Lv1 명예의 전당 (1) (python)

by 개발하는 호랑이 2024. 2. 2.

명예의 전당 (1)

 

풀이

머리가 꼬인 상태여서 어떻게 풀어야지 하다가, 몇 번 틀리고 맞췄다.
sorted()를 이용해 줬다.
더 좋은 방법이 있을 것이라 생각했는데, 다른 살마 풀이를 보니 좋은 풀이가 있었다.

우선 명예의 전당이 안 찼을 때, 찼을 때로 나눠주고, 찼을 때도, min(honor)의 값이 score [i]보다 작을 때, 클 때를 구분해 주었다.
그렇게 정리한 코드가 아래 코드이다.

# k번째 순위의 가수 점수보다 더 높으면 출연 가수의 점수가 명예의 전당에 오르고, k번째 순위의 점수는 내려옴.
# 매일 '명예의 전당' 최하위 점수를 발표. k = 3,
def solution(k, score):
    # 1일차 발표와 스코어 입력
    honor = [score[0]]
    announce = [score[0]]
    # 2일차부터 반복문
    for i in range(1, len(score)):
        # 명예의 전당 확인
        # 명예의 전당이 꽉 안찼을 때
        if len(honor) < k:
            honor.append(score[i])
            honor = sorted(honor, reverse=True)
            announce.append(honor[-1])
            continue
        # 명예의 전당이 꽉 차고, min(honor) < score[i]일때
        elif len(honor)>= k and min(honor) < score[i]:
            honor.append(score[i])
            honor = sorted(honor, reverse=True)
            honor.pop(-1)
            announce.append(honor[-1])
        else:
            announce.append(honor[-1])
    return announce

다른 사람 풀이

announce에 들어가는 것은 명예의 전당에 들어간 것 중 가장 작은 값을 넣으면 되고, 이때 우리가 원하는 것은 announce이기 때문에, honor를 정렬할 필요는 없음을 인지하고 푼 코드이다.
1. 우선 q를 명예의 전당으로 이용을 한다.
2. 만약 K보다 많은 수가 들어있으면 가장 작은 값을 제외시킨다. remove()를 사용하였음.
3. 남은 q에서 가장 작은 값을 answer에 입력시킨다.
4. 값을 반환한다.

def solution(k, score):

    q = []

    answer = []
    for s in score:

        q.append(s)
        if (len(q) > k):
            q.remove(min(q))
        answer.append(min(q))

    return answer