[7/2] 체육복

이경준·2021년 7월 2일
0

코테

목록 보기
58/140
post-custom-banner

레벨1 문제

내 코드

def solution(n, lost, reserve):
    
    lost.sort()
    reserve.sort()
    new_lost = []
    
    # 분실하고 여분 있는 학생 제거
    for i in lost:
        if (i in reserve):
            reserve.remove(i)
        else:
            new_lost.append(i)
    
    # 체육복 있는 학생 수
    num = n - len(new_lost)
    
    for k in new_lost:
        if (k-1 in reserve):
            reserve.remove(k-1)
            num += 1       
            continue
        elif (k+1 in reserve):
            reserve.remove(k+1)
            num += 1
    
    return num

로직

  1. 리스트 정렬
  2. 분실과 여분 리스트에 중복되어 있는 숫자 제거
  3. 체육복 있는 학생 수를 num으로 표시
  4. 분실한 학생인 경우, if문을 사용해서 앞/뒤 학생에게 여분이 있으면 num에 1을 더해주고, 여분 리스트에서 제거한다.
  5. num 개수 출력
  • 입력 리스트가 정렬되었다는 말이 없으므로, 정렬해야한다.
  • 도난당한 학생의 경우 자신이 여분을 입어야 하기 때문에, 다른 학생에게 체육복을 빌려줄 수 없다.

효율적인 코드

def solution(n, lost, reserve):
    answer = 0
    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

피드백

  • 나는 차례대로 하나하나 해결하는 로직을 짰다면, 위 코드는 경우의 수를 나눠서 for문과 if문을 사용했다.
  1. 첫번째 for문에서 체육복이 있는 학생은, answer에 1을 더해준다.
  2. lost가 있고 reserve가 있으면, answer에 1을 더해주고 lost와 reserve를 제거한다.
  3. lost i가 있으면, reserve에 i-1이나 i+1이 존재하면, answer에 1을 더해주고 reserve를 제거한다.
  4. answer를 출력한다.

배운 것

  • 리스트 컴프리헨션에 else를 쓰려면 for 앞에 써야한다.

이렇게 삭제하게 되면, 하나씩 땡겨져서 모든 리스트 요소를 돌리지 못하게 된다.

for i in lost:
        if (i in reserve):
            lost.remove(i)
            reserve.remove(i)
profile
The Show Must Go On
post-custom-banner

0개의 댓글