본문 바로가기
Coding/알고리즘 오답

프로그래머스 level2 _ 구명보트 [Python]

by climba 2023. 2. 24.

나는 왜 틀렸는가?

내가 처음 작성한 코드는 다음과 같다.

def solution(people, limit):
    print(people)
    people = sorted(people, reverse = True)
    answer = 0
    save = []
    visit = []
    for i in range(len(people)):
        if people[i] not in save:
            if len(save) == len(people):
                break
            rest = limit - people[i]
            x = [i]
            y = [people[i]]
            for j in range(i+1,len(people)):
                if rest >= people[j] and j not in save:
                    x = [i,j]
                    y = [[people[i],people[j]]]
                    break
            save.extend(x)
            visit.extend(y)
        print(visit,save)
    return len(visit)
한 눈에 봐도 불필요한 변수가 너무 많고, 복잡한 것 같다 ..

직접 만든 테스트케이스는 대부분 통과하였으나, 실제 제출만해보면 대참사가 일어났다.

어떻게 이렇게 다 틀리지 ..

테케를 10개정도 만들었는데, 다 통과해서 이 정도면 출제 오류인가 .. ? 하는 생각이 잠시 들었지만, 역시나 오류는 항상 내 실력이 오류였다.

[10, 10, 10, 10, 10, 10, 10], 30 을 입력으로 넣었을때, 출력은 4이 나와야하는데, 내 코드는 7이 나왔다.

 

저렇게 다 틀린걸보면, 아예 로직 자체가 잘못됐을 수도 있는 것 같은데 로직을 구체적으로 짜고 이를 한 문장씩 코딩해보자. 또한 코드를 좀 더 간결하게 짤 필요가 있다!

 

 

정답 풀이

def solution(people, limit) :
    answer = 0
    people.sort()

    a = 0
    b = len(people) - 1
    while a < b :
        if people[b] + people[a] <= limit :
            a += 1
            answer += 1
        b -= 1
    return len(people) - answer
# 50 50 70 80 -> answer = 0
# 50 50 70 -> answer = 0
# 50 50 -> asnwer = 1
# 최종 answer = 1, 따라서 len(people) - answer = 4 - 1 = 3

너무 간결한 풀이과정 ..

 

2명씩 한 보트에 탑승하기 때문에, 정렬된 people list에서 앞 뒤로 한명씩 빼면서 풀면 됨 ..

while a < b를 통해 a와 b가 역전되면 stop하는 방식도 잘 기억해두자!

 

댓글