[탐욕법(Greedy)_Level1] 체육복

하복치·2024년 5월 9일
3

프로그래머스

목록 보기
16/27

문제 설명

입출력 예

🗝️나의 풀이

# 전체 학생의 수 n
# 체육복을 도난당한 학생들의 번호가 담긴 배열 lost
# 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve

def solution(n, lost, reserve):
    real_reserve = [i for i in reserve if i not in lost]
    real_lost = [i for i in lost if i not in reserve]
    
    real_reserve.sort()
    real_lost.sort()
    
    count = n - len(real_lost)
    for i in real_reserve:
        for j in real_lost:
            if abs(i - j) == 1:
                count += 1
                real_lost.remove(j)
                break
    return count

🔎다시보기👀

처음에 정렬을 하지 않아서 93.3%가 나왔다.
예를 들어, 입력값이 10, [8, 6, 4, 3], [1, 4, 7, 9] 과 같은 경우 일 때 정렬 여부에 따라 결과 값이 달라진다.

✔️ 정렬을 하지 않은 경우(❌)

  1. real_reserve와 real_lost를 추출할 때 4가 삭제된다.
  2. len(real_lost)는 3이므로, 초기 count 값은 10 - 3 = 7이 된다.
  3. 체육복을 빌려주는 과정에서 7번 학생이 8번 학생에게 체육복을 빌려주고, count를 1 증가시킨다. 남은 real_lost는 [6, 3]
  4. 더 이상 빌려줄 수 있는 학생이 없으므로, 함수가 종료된다. 결과 값은 8이 된다.

✔️ 정렬을 한 경우(⭕️)

  1. 정렬 후에는 real_reserve가 [1, 7, 9]가 되고, real_lost가 [3, 6, 8]이 된다.
  2. len(real_lost)는 3이므로, 초기 count 값은 10 - 3 = 7이 된다.
  3. 체육복을 빌려주는 과정에서 7번 학생이 6번 학생에게, 9번 학생이 8번 학생에게 체육복을 빌려주고, count를 각각 1씩 증가시킨다. 남은 real_lost는 더 이상 빌려줄 수 있는 학생이 없으므로, 결과 값은 9가 된다.

0개의 댓글