[ Programmers 42862 ] 체육복(Python)

uoayop·2021년 5월 7일
0

알고리즘 문제

목록 보기
37/103
post-thumbnail

문제

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

체육복을 도둑맞은 학생들과 여벌 체육복이 있는 학생들의 이야기,,
나 누가 훔쳐갔는지 알 것 같은데 ,,,🙄

바보같이 생각해서 생각보다 오래 걸렸던 문제다.
이게 레벨 1이라니 눈물이 흐른다.


문제 풀이

[틀린 풀이]
왼쪽에서 오른쪽 방향으로만 체육복을 주고, 오른쪽에서 왼쪽으로만 체육복을 준 뒤에
더 큰 학생 값을 출력해주었다.
틀림. 당연함.

왜냐면 어떤 학생은 왼쪽에서 오른쪽, 다른 학생은 오른쪽에서 왼쪽으로 줄 수 있기 때문,,., 🤕

테스트케이스 7번, 10번만 틀려서 더 매달렸지만,, fail,,

[정답 풀이]
1. 여벌 체육복이 있는 학생이 옷을 도난당할 수도 있기 때문에 중복 제거를 해준다.

s_reserve = list(set(reserve)-set(lost))
s_lost = list(set(lost)-set(reserve))

2. 옷을 도난 당한 학생의 오른쪽에 여분 있는 학생이 있다면,
여분 있는 학생 목록에서 오른쪽 학생을 지운다.

if l-1 in s_reserve:
    s_reserve.remove(l-1)

2-1. 옷을 도난 당한 학생의 왼쪽에 여분 있는 학생이 있다면,
여분 있는 학생 목록에서 왼쪽 학생을 지운다.

elif l-1 in s_reserve:
    s_reserve.remove(l-1)

2-2. 양쪽 학생 모두 여분이 없다면 수업을 들을 수 없으므로,
전체 학생 수에서 1을 빼준다.


코드

def solution(n, lost, reserve):
    student = [1 for _ in range(n)]

    s_reserve = list(set(reserve)-set(lost))
    s_lost = list(set(lost)-set(reserve))

    print(s_lost, s_reserve)
    for l in s_lost:
        if l-1 in s_reserve:
            s_reserve.remove(l-1)
        elif l+1 in s_reserve:
            s_reserve.remove(l+1)
        else:
            n -= 1

    return n
profile
slow and steady wins the race 🐢

0개의 댓글