눈송이의 개발생활
[Programmers Lv.1]체육복 (Python) 본문
문제
https://programmers.co.kr/learn/courses/30/lessons/42862
내 코드
def solution(n, lost, reserve):
s_res = set(reserve) - set(lost)
s_lost = set(lost) - set(reserve)
for i in s_res:
if i - 1 in s_lost:
s_lost.remove(i - 1)
elif i + 1 in s_lost:
s_lost.remove(i + 1)
return n - len(s_lost)
다른 사람 풀이
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)
해결 방법
체육복을 잃어버린 학생(lost)과 여벌 체육복이 있는 학생(reserve)의 중복이 없게 set으로 변환한다.
여벌이 있는 학생(i)들을 하나씩 보면서, i보다 하나 작거나 하나 큰 학생이 있으면 s_lost에서 삭제한다.
여벌 있는 학생을 다 돌고난 뒤, lost에 남아있는 학생 수(여벌 체육복을 빌리지 못한 학생들)를 빼면 수업을 들을 수 있는 학생의 최대 수가 나온다.
다른 사람들은 set을 굳이 쓰지 않고 문제를 풀었다. 이것 이외에는 꽤 비슷하게 푼 것 같다.
Greedy문제지만 반복문 수도 적고 심플해서 금방 풀 수 있는 문제였다.
처음에는 lost에 있는 원소를 하나하나 보고 삭제하려고 했는데, for문을 돌기 애매해서 reserve의 원소를 하나씩 보는 방식으로 바꾸었다.
'Algorithm > Programmers' 카테고리의 다른 글
[Programmers Lv.1]모의고사 (Python) (0) | 2022.04.06 |
---|---|
[Programmers Lv.1]K번째수 (Python) (0) | 2022.04.05 |
[Programmers Lv.1]다트 게임 (Python) (0) | 2022.04.04 |
[Programmers Lv.1]로또의 최고 순위와 최저 순위(Python) (0) | 2022.03.29 |
[Programmers Lv.1]실패율 (Python) (0) | 2022.03.28 |
Comments