Lim Seunghyun Space

[프로그래머스] 체육복 본문

Algorithm/문제

[프로그래머스] 체육복

Lim Seung Hyun 2021. 10. 17. 17:47

문제 정의

  • 여벌의 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있음
  • N번 학생은 N-1번, N+1번 학생의 체육복만 빌릴 수 있음
  • 여벌의 체육복을 가지고 있는 학생이 도난을 당한 경우, 대여할 수 있는 체육복이 없음 -> 본인의 체육복을 이용
  • 체육복을 이용할 수 있는 최대 학생 수를 구하는 문제

 

나의 풀이

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

def solution(n, lost, reserve):

    able_lst = [0 for _ in range(n)]

    lost = sorted(lost)
    reserve = sorted(reserve)

    # 체육복을 가지고 있는 학생에 대한 값 변경
    for i in range(n):
        if i+1 not in lost:
            able_lst[i] = 1
    
    for lt in lost: # 도난당했지만 여유분이 있는 학생 처리
        if lt in reserve:
            reserve.remove(lt)
            able_lst[lt-1] = 1

    for lt in lost:

        if lt - 1 in reserve: # 대여 가능한 범위에 대한 처리
            able_lst[lt-1] = 1
            reserve.remove(lt-1)
            
        elif lt + 1 in reserve: # 대여 가능한 범위에 대한 처리
            able_lst[lt-1] = 1
            reserve.remove(lt+1)
            
    return sum(able_lst)
  • lost에 포함되면서 reserve에 포함된 학생을 먼저 처리해주었다.
    • lost : [1,2]  reserve : [2, 3] 인 경우, 2번 학생이 도난되었기 때문에 대여해줄 수 있는 여유분이 없기 때문에 없는 학생으로 처리해야 lost에 포함된 1번 학생이 2번 학생에게 체육복을 대여할 수 있는 케이스를 차단할 수 있다.

 

개선할 점

  • N의 범위가 적어 시간 복잡도를 고려하지 않았지만 N의 범위가 커지는 경우를 대비하여 시간 복잡도를 고려하여 로직을 작성하도록 노력해야겠다.
  • 코드를 좀 더 파이썬스럽게 작성하도록 노력해야겠다.

 

Github : https://github.com/Limseunghyun95/code_test/blob/master/programmers/p_42862.py

728x90