본문 바로가기

그 땐 Algorithm했지/그 땐 Programmers했지

[self-study/level 1] 체육복 | 탐욕법(Greedy) - 도전편

728x90

문제

내 풀이

1️⃣첫 번째 시도

def solution(n, lost, reserve):
    lost_and_reserve_student = set(lost) & set(reserve) 
    for student in lost_and_reserve_student:
        lost.remove(student)
        reserve.remove(student)
    if len(lost) > len(reserve):
        return n - (len(lost) - len(reserve))
    else:
        return n

👉🏻일단 여벌의 체육복을 가져왔는데 도난당한 학생들을 lost와 reserve에서 제외시켰다. 그리고 나서 체육 수업을 들을 수 있는 학생 수를 반환했다. 

✅set

📌중복이 없는 자료구조이다. 

lost = [2, 4]
reserve = [1, 2, 3, 5]

set1 = set(lost) & set(reserve)
set2 = set(lost) | set(reserve)
set3 = set(lost) - set(reserve)

print('교집합 : ', set1) #교집합 : {2}
print('합집합 : ', set2) #합집합 : {1, 2, 3, 4, 5}
print('차집합 : ', set3) #차집합 : {4}

👉🏻교집합 기호 & 두 리스트의 공통되는 원소를 반환한다.

👉🏻합집합 기호 | 두 리스트를 합쳐 중복되는 요소를 제거하고 반환한다.

👉🏻차집합 기호 - 한 리스트에서 다른 리스트와 공통되는 원소를 제외하고 반환한다.

 

🐰여기서 맞을 줄 알았는데 정답률 70%가 나와서 당ㅋ황ㅋ

2️⃣두 번째 시도

def solution(n, lost, reserve):
    lost_and_reserve_student = set(lost) & set(reserve)
    if len(list(lost_and_reserve_student)) != 0:
        for student in lost_and_reserve_student:
            lost.remove(student)
            reserve.remove(student)

    taking_class_student = []
    for lost_student in lost:
        for reserve_student in reserve:
            if lost_student == (reserve_student + 1) or lost_student == (reserve_student - 1):
                reserve.remove(reserve_student)
                taking_class_student.append(lost_student)
                break
    return n - (len(lost) - len(taking_class_student))

👉🏻문제를 여러번 읽으며 체격에 따라 번호가 매겨져 있어 앞번호나 뒷번호 학생에게만 체육복을 빌릴 수 있다는 사실을 알게 되었다... 으앙 문제 좀 제발 잘 앍자ㅜㅜ 그래서 다시 이중 for문을 돌리면서 빌려주는 학생의 체격과 잃어버린 학생의 체격을 비교해 잃어버렸지만 빌릴 수 있는 학생들을 리스트에 따로 모았다. 그리고 잃어버린 학생들에서 잃어버렸지만 빌린 학생 수를 빼 전체 학생수에서 뺐다.

 

🐰결과적으로 실패... ㅜㅜ 하루종일 잡았는데 안 풀려서 속상하지만 구글링을 더 해야겠다. 다른 문제도 풀 게 많아서 이건 일단 보류... 담에 또 보장

728x90