728x90
반응형
📌 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/42862#
📌 문제 설명
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번호의 학생이나 바로 뒷번호의 학생에게만 체육복을 빌려줄 수 있습니다. 예를 들어, 4번 학생은 3번 학생이나 5번 학생에게만 체육복을 빌려줄 수 있습니다. 체육복이 없으면 수업을 들을 수 없기 때문에 체육복을 적절히 빌려 최대한 많은 학생이 체육수업을 들어야 합니다.
전체 학생의 수 n, 체육복을 도난당한 학생들의 번호가 담긴 배열 lost, 여벌의 체육복을 가져온 학생들의 번호가 담긴 배열 reserve가 매개변수로 주어질 때, 체육수업을 들을 수 있는 학생의 최댓값을 return 하도록 solution 함수를 작성해주세요.
# 제한사항
- 전체 학생의 수는 2명 이상 30명 이하입니다.
- 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
- 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
- 📢 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
📌 풀이 과정
✅ 2가지 방안이 있다.
- lost를 기준으로 찾는다.
- for문을 lost에 대해 돌린다. 즉, " 나 잃어버렸는데, 도와줄 사람이 있는지 앞뒤로 찾는 방법 "
- reserve를 기준으로 찾는다.
- for문을 reserve에 대해 돌린다. 즉, " 나 여벌 옷 있는데, 도와줄 수 있는 사람이 있는지 앞뒤로 찾는 방법 "
- => 내가 선택한 방법 (이유는 그냥.. 잃은 사람보다 여벌 옷 가져온 사람이 적을 것 같아서..)
✅ 배운 점
- 리스트 list 는 뺄셈 (-) 연산이 불가능하다. (reserve - lost 하면 제한사항 5번을 만족시킬 수 있을 것 같았지만 안되더라고)
- 해결: sub_set = [x for x in list1 if x not in list2] 이 방법을 써야 한다.
- 놓친 테스트 케이스는 어떻게 생각해낼 수 있는 건지.. 아래는 내가 놓쳤던 테스트 케이스이다.
- reserve, lost가 정렬되지 않은 경우
- (제한사항 5번 반영) reserve 인 사람 전부 또는 일부가 lost일 때
- 📢 lost = [4, 5] reserve = [3, 4] 인 경우
- reserve 순서대로 보면 전부 체육복을 입을 수 있을 것 같다. 하지만, 4번은 여벌이 있었으나 도난당해 빌려줄 수 없는 상태다. 따라서 lost = [5] reserve = [3] 인 상태로 봐야 한다.
- 이를 위해서 리스트 뺄셈 연산을 아래 코드 대신해 적었다.
# 여벌 옷은 있으나, 도난 당해 더 이상 빌려줄 수 없는 경우이다.
# lost = [4, 5] reserve = [3, 4]일 때는 정상작동하지 않는다.
# 이유: able_stdNo = 3 일 때 lost를 보면 if문이 동작하지 않아 4번으로부터 빌리게 된다. (실제로는 불가능)
if able_stdNo in lost:
done.append(able_stdNo)
lost.remove(able_stdNo)
continue
📌 풀이 코드
- reserve 각 요소(able_stdNo)에 대해서,
- 앞 뒤로 도와줄 수 있는 사람이 있는지 find_lost 에 저장한다.
- find_lost의 각 요소 (i) 에 대해서,
- lost 안에 있는지 & 유효범위 내의 번호인지 & 빌려주는 번호 able_stdNo가 아직 빌려주지 않은 상태이면
- 빌려준 사람 stdNo 는 done에 추가하고
- 빌림 받은 사람 i 는 lost에서 제거한다.
def solution(n, lost, reserve):
answer = 0
done = []
reserve.sort(); lost.sort() # 순서대로 제공된다고는 안함.
# 1. 리스트는 뺄셈 안됨. sub_set = [x for x in list1 if x not in list2]
tmp = reserve
reserve = [x for x in reserve if x not in lost]
lost = [x for x in lost if x not in tmp]
print(reserve, lost)
for able_stdNo in reserve:
if len(lost) == 0:
return n
# 여벌도 있지만, 동시에 도난을 당해서 빌려주기 불가. done으로 옮기기
# 1.로 대체된 부분.
# if able_stdNo in lost:
# done.append(able_stdNo)
# lost.remove(able_stdNo)
# continue
find_lost = [able_stdNo-1, able_stdNo+1]
for i in find_lost:
if (i in lost) and (0<i<=n) and (able_stdNo not in done):
done.append(able_stdNo)
lost.remove(i)
# print(done, lost)
answer = n - len(lost)
return answer
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스/Python] 알고리즘고득점Kit-탐욕법(Greedy)-구명보트 (2) | 2024.10.16 |
---|---|
[프로그래머스/Python] 알고리즘고득점Kit-탐욕법(Greedy)-큰수만들기 (0) | 2024.10.16 |
[프로그래머스/Python] 알고리즘고득점kit-완전탐색-소수찾기 (0) | 2024.10.14 |
[프로그래머스/Python] 알고리즘고득점Kit - 완전탐색 - 모의고사 (1) | 2024.10.14 |
[프로그래머스/Python] 알고리즘고득점Kit-완전탐색-최소직사각형 (1) | 2024.10.14 |