체육복

kukudas·2022년 5월 15일
0

Algorithm

목록 보기
42/46

들어오는 데이터가 정렬되서 오는게 아니라서 정렬한 번 해줘야함.

def solution(n, lost, reserve):
    answer = n
    
    lost.sort()
    reserve.sort()
    
    for i in lost:
        # 자기 자신이 여벌이 있을 때
        if i in reserve:
            reserve.remove(i)
        # 1번 학생일 때
        elif i == 1:
            # 여벌을 가지고 왔어도 도둑맞아서 빌려줄 게 없을 경우 도 있음
            if i + 1 in reserve and i + 1 not in lost:
                reserve.remove(i + 1)
            else:
                answer -= 1
        # 마지막 학생일 때
        elif i == n:
            if i - 1 in reserve:
                reserve.remove(i - 1)
            else:
                answer -= 1
        # 가운데 학생일 때
        else:
            if i - 1 in reserve:
                reserve.remove(i - 1)
            elif i + 1 in reserve and i + 1 not in lost:
                reserve.remove(i + 1)
            else:
                answer -= 1
                
    return answer

아래 처럼 하면 가독성이 올라감.
_reserve에는 내가 가져왔지만 도둑 맞지 않아서 남을 빌려줄 수 있는 애들만 넣어주고
_lost에는 도둑 맞았지만 여분을 가져와서 상관없는 애들을 제외해줌.
그러면 이제 예비를 가져온 애들을 기준으로 앞뒤에 잃어버린 애들이 있으면 빌려주고 걔들은 체육복을 받았으니 _lost에서 빼줌.
이제 마지막에 _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)

https://programmers.co.kr/learn/courses/30/lessons/42862?language=python3

0개의 댓글

관련 채용 정보