[python_파이썬_pass]프로그래머스_LV1_명예의 전당(1)_풀이

2024. 5. 16. 12:19코드리뷰

728x90
반응형

공부하는허딩크 : https://www.youtube.com/live/d04PXaSTIlQ?feature=shared

처음 이 문제를 접하고 문제를 해결하려고 시도 했다가 포기하고 다른 문제로 넘어갔다.

 

이후 백준에서 티어를 실버2를 만들고 다시 도전해 보았다.

조금 고민을 했지만, 2번의 시도 끝에 답을 찾을 수 있었다.

 

<첫번째 시도 : 19.2점>

한번에 통과 될 것으로 예상했지만 19.2점이 나와서 당황했다.

천천히 코드를 읽어보니 if의 조건이 잘못되었다는 걸 스스로 찾을 수 있었다.

만약 k와 score의 길이가 같을 경우 if는 무조건 참이 나와서 완벽한 정답이 나올 수가 없다.

#19.2점
def solution1(k, score):
    answer = []
    for index, i in enumerate(score):
        if index < k: #k=len(score)일때 문제 발생.
            answer.append(min(score[:k]))
        else:
            scored = sorted(score[:index+1])
            answer.append(scored[index-k+1])
    return answer

 

<두번째 시도 : 통과>

첫번째 코드를 조금 수정해서 통과되었다.

어차피 기준은 k값이다. k값 만큼 score의 개수중에서 제일 작은 점수가 return되어야 한다.

단, k값과 score의 길이가 같다면 명예의 전당에는 모든 score들이 들어가게 되는 것을 찾아야 한다.

그리고 else:에서도 일단 각 숫자를 불러와서 오름차순으로 나열하고, 몇번째 숫자를 불러올지를 찾는걸 그림을 그리면서 찾을 수 있었다.

#통과!!!!!!!!!!! => 처음에 min슬라이싱을 잘못했음
def solution(k, score):
    answer = []
    for index, i in enumerate(score):
        if index < k:
            answer.append(min(score[:index + 1]))
        else:
            scored = sorted(score[:index+1])
            answer.append(scored[index-k+1])
    return answer

<풀이 고민>

어떻게 슬라이싱을 할지, 어떤 조건을 넣을지 노트에 그리면서 고민을 했다. 예전에는 전혀 감도 잡히지 않던 문제들이 조금씩 잡히기 시작한다.

 

<다른사람 풀이 참고>

이 방법도 직관적이고 괜찮은 것 같다.

temp리스트를 초기화 해주고 len(temp) > k가 될때 까지 temp의 제일 작은 수를 temp와 answer에 append해준다.

그 다음 len(temp) < k일때 부터 temp에 들어오는 숫자들때문에 무조건 참이 됨으로 제일 작은 수를 빼주면

temp에는 숫자 3개만 남는다.

def solution(k, score):
    answer = []
    temp = []
   
    for s in score:
        temp.append(s)
        if len(temp) > k:
            temp.remove(min(temp))
        answer.append(min(temp))      
    return answer
728x90
반응형