[프로그래머스 코테 연습] 체육복

Gorae·2021년 6월 5일
0

알고리즘

목록 보기
5/19
post-thumbnail

1차 풀이

def solution(n, lost, reserve):
    answer = 0

    # n명 중 체육복을 도난당하지 않은 학생 더하기 
    for i in range(1, n+1):
        if i not in lost:
            answer += 1
        else:
            # 도난당한 학생 중 자기 여분이 있는 학생 더하기
            if i in reserve:
                answer += 1
                reserve.remove(i)
                lost.remove(i)

    # 도난당한 학생 중 자기 여분이 없는 학생 확인
    for i in lost:
        if i-1 in reserve:
            answer += 1
            reserve.remove(i-1)
        elif i+1 in reserve:
            answer += 1
            reserve.remove(i+1)
    return answer

2차 풀이

def solution(n, lost, reserve):
    # reserve 에만 있는 원소들로 리스트 생성
    only_reserve = list(set(reserve) - set(lost))
    # lost 에만 있는 원소들로 리스트 생성
    only_lost = list(set(lost) - set(reserve))
    
    for i in only_reserve:
        if i-1 in only_lost:
            only_lost.remove(i-1)
        elif i+1 in only_lost:
            only_lost.remove(i+1)
    return n - len(only_lost)

느낀점

  • 자기 여분을 가진 학생들을 처음부터 예외 처리하면 코드가 훨씬 간결해졌다.
  • 2차 풀이 코드가 시공간 복잡도 측면에서 더 효율적이었다.
  • 중복을 허용하지 않는 리스트가 필요할 땐 집합 자료형을 쓰자!

    집합 자료형 초기화 방법

    data = set([1,1,3,4,5,5,5])
    print(data)
    출력: {1,3,4,5}
    data = {1,1,3,4,5,5,5}
    print(data)
    출력: {1,3,4,5}
profile
좋은 개발자, 좋은 사람

0개의 댓글