[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/알고리즘 연습

[알고리즘 연습] 체육복 (프로그래머스 lv1, 파이썬)

inu 2021. 6. 7. 12:38
반응형

문제

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

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr


풀이1

def solution(n, lost, reserve):
    set_reserve = set(reserve)-set(lost)
    set_lost = set(lost)-set(reserve)
    for i in set_reserve:
        if i-1 in set_lost:
            set_lost.remove(i-1)
        elif i+1 in set_lost:
            set_lost.remove(i+1)
    return n-len(set_lost)
  • 잃어버린 학생과 여벌 체육복 보유를 set를 활용해 정리
  • 여벌 체육복을 가져온 학생이 도난을 당한 경우 어디에도 속하지 않도록 해야한다.
  • 이후 하나씩 처리한다음 전체 학생수에서 여전히 lost에 포함되는 학생을 빼서 정답 도출

풀이2

def solution(n, lost, reserve):
    nlist = [1 for _ in range(n+1)]
    for i in lost:
        nlist[i] -= 1
    for i in reserve:
        nlist[i] += 1
    for i in range(1, n+1):
        if i-1 > 0 and nlist[i] == 0 and nlist[i-1] == 2:
            nlist[i] = 1
            nlist[i-1] = 1
        elif i+1 < n+1 and nlist[i] == 0 and nlist[i+1] == 2:
            nlist[i] = 1
            nlist[i+1] = 1

    return sum(nlist[1:]) - nlist.count(2)
  • 모든 경우를 배열로 저장하는 풀이
  • 위 풀이보다 속도가 느리지만 통과
  • 직관적이지 못한 코드이므로 풀이1을 통해 해결하는 것이 더 바람직.
반응형