눈송이의 개발생활

[Programmers Lv.1]체육복 (Python) 본문

Algorithm/Programmers

[Programmers Lv.1]체육복 (Python)

꾸지새미언니

문제

https://programmers.co.kr/learn/courses/30/lessons/42862

내 코드 

def solution(n, lost, reserve):
    s_res = set(reserve) - set(lost)
    s_lost = set(lost) - set(reserve)
    for i in s_res:
        if i - 1 in s_lost:
            s_lost.remove(i - 1)
        elif i + 1 in s_lost:
            s_lost.remove(i + 1)
    return n - len(s_lost)

다른 사람 풀이 

def solution(n, lost, reserve):
    _reserve = [r for r in reserve if r not in lost]
    _lost = [l for l in lost if l not in reserve]
    for r in _reserve:
        f = r - 1
        b = r + 1
        if f in _lost:
            _lost.remove(f)
        elif b in _lost:
            _lost.remove(b)
    return n - len(_lost)

해결 방법

체육복을 잃어버린 학생(lost)과 여벌 체육복이 있는 학생(reserve)의 중복이 없게 set으로 변환한다. 

여벌이 있는 학생(i)들을 하나씩 보면서, i보다 하나 작거나 하나 큰 학생이 있으면 s_lost에서 삭제한다. 

여벌 있는 학생을 다 돌고난 뒤, lost에 남아있는 학생 수(여벌 체육복을 빌리지 못한 학생들)를 빼면 수업을 들을 수 있는 학생의 최대 수가 나온다. 

 

다른 사람들은 set을 굳이 쓰지 않고 문제를 풀었다. 이것 이외에는 꽤 비슷하게 푼 것 같다. 

Greedy문제지만 반복문 수도 적고 심플해서 금방 풀 수 있는 문제였다. 

처음에는 lost에 있는 원소를 하나하나 보고 삭제하려고 했는데, for문을 돌기 애매해서 reserve의 원소를 하나씩 보는 방식으로 바꾸었다. 

 

Comments