[코딩테스트]프로그래머스 : 체육복

김은지·2022년 8월 24일
0

코딩테스트

목록 보기
16/17
def solution(n, lost, reserve):
    total = []
    reserve.sort()
    
    for i in range(1, n+1):
        if i not in lost:
            total.append(i)
            continue
        if i in reserve:
            total.append(i)
            reserve.remove(i)

    for i in reserve:
        if i-1 > 0 and (i-1 not in total):
            total.append(i-1)
            continue
        if i<n and (i+1 not in total):
            total.append(i+1)
            continue

    return len(total)

코드에 대한 설명은 이렇다.

  1. reserve에는 없고, lost에만 있는 학생을 제외한 전체 학생 목록을 total에 저장한다.

  2. reserve의 요소를 돌며 total에 없는 숫자 중, reserve와 -1 혹은, +1씩 차이나는 숫자를 total에 추가한다.

  3. total의 원소 갯수를 return 한다.

인데, 리스트의 요소를 지우고, 생성하거나, 새로운 리스트(total)을 만드는 과정, for문을 여러번 도는 과정에서 시간이 많이 소요 되는 것 같다.

같이 문제를 풀었던 예솔님의 코드는 내 코드에 비해 실행 시간이 훨씬 짧다. 인덱스를 통한 접근. 너무 좋은 것 같다.

def solution(n, lost, reserve):
    students = [1] * n # 각 인덱스-1의 번호를 가진 학생들이 가진 체육복의 갯수
    reserve.sort()

    for i in lost:
        students[i-1] = 0 # 체육복을 잃어버렸으면 

    for i in reserve:
        if students[i-1] == 0: # i번에 해당하는 학생이 가진 체육복이 0개이면
            students[i-1] = 1 # 체육복을 하나 넘겨주고, 다음 학생으로 넘어간다.
            continue
        elif students[i-1] == 1: # 만약 i번에 해당하는 학생이 가진 체육복이 1개 있다면
            if i > 1 and i not in lost and students[i-2] == 0: 
            # i가 1보다 크고, 체육복을 잃어버린 학생이 아니고(내 자신이 아니고), 내 번호 -1인 학생이 가진 체육복이 0라면,
                students[i-2] = 1
                # 내 번호 -1에 있는 학생에게 체육복을 1개 넘겨준다.
            elif i != n and i not in lost and students[i] == 0:
            # 만약 i가 마지막에 학생이 아니고 체육복을 잃어버린 학생이 아니고(내 자신이 아니고), 내 번호 +1 인 학생이 가진 체육복이 0이라면,
                students[i] = 1
                # 내 번호 +1에 있는 학생에게 체육복을 1개 넘겨준다.

    return students.count(1) # 체육복을 가진 학생의 수를 센다.

참고해야지.
빌트인 함수 많이 사용하지 않고, 인덱스로 학생 번호를 표현했다는게 신박하다.
좋당.

0개의 댓글