체육복(programmers 문제) python 풀이

Jipoleon·2021년 5월 28일
0

programmers

목록 보기
7/9
post-thumbnail

문제 링크: https://programmers.co.kr/learn/courses/30/lessons/42862

입력 값으로 n은 전체 인원 수(int), lost는 체육복을 잃어버린 사람(list), reserve는 체육복 여분을 가지고 있는 사람(list)을 받는다. (참고로 lost와 reserve는 처음부터 내림차순 정렬이 되어 있는 상태다.) 그리고 여분의 체육복을 가지고 있는 사람은 자신의 앞 번호 혹은 뒷 번호에게만 빌려줄 수 있다. (EX. reserve로 [2]가 들어오면 list의 값에 [1] 혹은 [3]이 있는 경우에만 둘 중 한 명에게 빌려줄 수 있다.)

이때, 체육복을 가지고 체육 수업을 들을 수 있는 최대 학생의 수를 리턴하는 것이 목적이다.

내 풀이

1. 첫 번째

def solution(n, lost, reserve):
    answer = n - len(lost)
    for i in lost:
        for j in reserve:
            if i - 1 == j:
                answer += 1
                reserve.remove(j)
            elif i + 1 == j:
                answer += 1
                reserve.remove(j)

    return answer

answer에 먼저 전체 인원 수 - 잃어버린 사람의 수를 해준다.
그 다음 이중 for문으로 잃어버린 사람의 +1 혹은 -1 번째 사람이 여분의 체육복을 가지고 있는지 확인하고, 가지고 있다면 빌려준 것이므로 answer에 +1 그리고 reserve에 remove를 사용해 제거해준다.

결과

결과가 매우 안좋게 나왔다. 이 정도면, 문제 파악을 제대로 못한거 같아서 문제를 다시 읽어보니 여분의 체육복을 가지고 있는 사람이 도난 당하는 경우가 있다는 것을 알게 되었다.

즉, 여분의 체육복을 가지고 있는 사람이 도난 당하는 경우, 여분의 체육복을 자신이 쓰게 된다.

2. 두 번째

def solution(n, lost, reserve):
    set_lost = list(set(lost) - set(reserve))
    set_reserve = list(set(reserve) - set(lost))
    answer = n - len(set_lost)
    for i in set_lost:
        for j in set_reserve:
            if i - 1 == j:
                answer += 1
                set_reserve.remove(j)
            elif i + 1 == j:
                answer += 1
                set_reserve.remove(j)

    return answer

따라서 set을 사용해 미리 lost와 reserve의 공집합을 제거한다. (EX. lost가 [1, 2, 5]고 reserve가 [1, 3]이면 둘의 공집합인 [1]을 두 개의 배열에서 모두 제거하여 lost는 [2, 5]가 reserve는 [3]이 되는 것이다.)

결과


단지 코드 두 줄을 추가했을 뿐인데, 다 맞았다.

profile
I Love AI

0개의 댓글