[프로그래머스] 구명보트 (Python) - 그리디

Yebin Lee·2022년 7월 6일
0

코테준비

목록 보기
6/12

방학 때 열심히 코딩테스트 준비하기로 마음 먹어놓고 자꾸 쉬운 문제만 찾고 있는 나 자신을 발견 .. 오늘은 그리 어려운 문제는 아니지만 Level2를 풀어보기로 마음 먹었다.


프로그래머스 [구명보트] 문제 보기


사실 그리디 알고리즘 사용을 생각 안 하고 그냥 풀었다가 코드를 다시 구현해야 했다. 30분이면 끝날 문제를 1시간 넘게 헤맨 느낌 ...? 그런데 한 가지 놀랐던 점은, 나의 생각 방식이 나도 모르게 성장을 한 건지 아이디어를 거꾸로 코드를 재현하면 바로 풀린다는 점이었다. 지금 내가 무슨 말을 쓰고 있는 건지 잘 모르겠는데 ...

코드를 봐보도록 하자 하하


프로그래머스 [구명보트] 문제 풀이


def solution(people, limit):
    answer = 0
    people.sort()
    print(people)
    while len(people)>=2:
        for i in range(len(people)-1, 0, -1):
            if i>0 and people[i] <= limit-people[0]:
                print(people[i], i)
                del people[i]
                del people[0]
                answer+=1
                continue
        if len(people)>=1:
            people.remove(people[0])
            answer+=1
    answer+=1
    return answer

처음엔 위와 같이 코드를 짰었다. 우선 sort 로 정렬한 뒤 작은 무게를 기준으로 큰 무게 순서대로 비교하여 빼내는 방식을 택했다. 그런데 리스트 내의 원소를 삭제하는 과정에서 자꾸 범위를 벗어났다는 오류를 범했다.

옆에서 같이 공부하던 오빠의 도움에 따라 한 가지를 배웠다. 내가 사용한 for 문의 범위인 len(people)이 코드에 따라 계속해서 바뀜으로써 for 문의 범위가 바뀌는 형태의 코드는 좋지 않은 코드라는 점이다. 몰랐던 점은 아니지만 코드를 설계하면서 전혀 생각하지 못했던 부분이었으니 몰랐다고 하자. (진짜 좋은 깨달음이었다)

반대로, '그리디'니까! 큰 무게부터 보라는 조언을 받았다. 그 말을 듣는 순간 번뜩 '내가 왜 이렇게 풀고 있었지?' 라는 생각을 했다. 알고리즘 공부를 꾸준히, 열심히 해야겠다는 다짐을 또 한 번 하는 나였다.

10분만에 다시 짠 코드는 다음과 같다.

def solution(people, limit):
    answer = 0
    people.sort()
    
    start = 0
    end = len(people)-1
    
    while end >= start :
        if people[end] <= limit-people[start] :
            start+=1
        end-=1
        answer+=1
        
    return answer

평소 코드를 짧게 짜는 걸 좋아하는 편인데 (그러면 가독성이 높아진다고 생각한다^^.. 바보) 이번엔 알아보기 쉽게 중간에 줄바꿈을 넣어 보았다. 훨씬 보기 좋네

채점 받자마자 정확성과 효율성 모두 통과❗ 사실 마지막 효율성 테스트에서 시간이 꽤나 걸려 (그래봤자 몇 초지만) 심장이 콩닥콩닥했다. 틀리는 줄 알고 우울해 있었는데 맞아서 어찌나 기분 좋던지 ㅎㅎ 괜히 사람 긴장하게 만들고 말이야 ...


내가 아직 프로그래머스에 입문하지 얼마 되지 않아 점수가 낮다. 이 문제 풀고 한 번에 16점을 받아서 기분이 너무 좋았다. 이런 점수 제도는 나의 학구열을 더 불타오르게 만든다.

앞으로도 열심히 해야지 히히


안녕 !

0개의 댓글