[프로그래머스] Lv.1 체육복

Tony Kim·2022년 1월 15일
0
post-thumbnail

[프로그래머스]

Lv.1 체육복

1.문제

input 학생수 / 체육복 없는 학생 index / 여별이 있는 학생 index
output 체육복있는 학생 총 합 (체육복은 index 앞 뒤로만 빌릴 수 있음)

2. 풀이

리스트를 이용해 풀려고했지만 runtime error
심지어 문제 제대로 안읽어서 여벌이 있지만 도둑맞은 케이스 생각안함

3. 코드

나의 코드

def solution(n, lost, reserve):
    student = []
    i = 0
    while i < n:
        if i+1 in lost:
            student.append(0)
        elif i+1 in reserve:
            student.append(2)
        else:
            student.append(1)
        i += 1
    answer = 0
    if student[0] == 0 and student[1] == 2:
        student[0] = 1
        student[1] = 1
    if student[-1] == 0 and student[-2] == 2:
        student[-1] == 1
        student[-2] == 1  
    for i in range(len(student)):
        if student[i] == 0:
            if student[i-1] == 2:
                answer += 1
                student[i-1] = 1
            elif student[i+1] == 2:
                answer += 1
                student[i+1] = 1
        else:
            answer += 1
    return answer

모범코드1

def solution(n, lost, reserve):
    reserve_set = set(reserve)-set(lost) 
    lost_set = set(lost)-set(reserve)ㅡ
    for reserve_person in reserve_set: 
        if reserve_person-1 in lost_set: 
            lost_set.remove(reserve_person-1) 
        elif reserve_person+1 in lost_set: 
            lost_set.remove(reserve_person+1) 
    return n-len(lost_set)

모범코드2

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)

모범코드3

def solution(n, lost, reserve):
    answer = 0
    for k in range n:
    	i = k+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

반성)

  • <모범코드1>
    먼저 reserve와 lost에 중복으로 있는 index를 삭제하기 위해 차집합을 이용해 분리해준다.
    그 다음 reserve set에 있는 인덱스 중 인덱스 +- 한 값이 lost set에 있으면 lost set에서 지워준다 (여벌을 줄 수 있기 때문에)
    전체 학생수(n)에서 여벌을 더이상 받을 수 없는 학생수를 뺀다.

  • <모범코드2>
    set 대신 for문을 통해 list로 reserve와 lost 중복을 없애준다.

  • <모범코드3>
    내 풀이와 비슷하지만 여기서는 따로 list를 만들지 않고 input값을 그대로 이용했다.

profile
Back-end-dev

0개의 댓글