https://school.programmers.co.kr/learn/courses/30/lessons/42862?language=python3
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해설
def solution(n, lost, reserve):
answer = n
rest_in_lost_count = 0
# lost 배열을 정렬해준다.
lost.sort()
filtered_lost = []
# 여벌있는 학생이 도난당했을 경우, 본인의 체육복 1개만 있으니 빌려줄 수 없다.
for lost_num in lost:
if reserve.count(lost_num) == 1:
reserve.remove(lost_num)
else:
filtered_lost.append(lost_num)
for lost_std_num in filtered_lost:
front_std_num = lost_std_num - 1
back_std_num = lost_std_num + 1
if reserve.count(front_std_num) == 1: # 만약 앞번호 학생이 여분 있다면
rest_in_lost_count += 1
reserve.remove(front_std_num)
elif reserve.count(back_std_num) == 1: # 만약 뒤번호 학생이 여분 있다면
rest_in_lost_count += 1
reserve.remove(back_std_num)
answer -= (len(filtered_lost) - rest_in_lost_count)
return answer
lost 배열의 학생 번호를 앞에서부터 순회하면서 해당 번호의 앞번호, 뒤번호가 reserve 배열에 있으면 체육복을 빌릴 수 있다.
lost 배열을 앞에서부터 순회하기 위해서는 우선 정렬을 해줘야하므로 sort() 메서드 사용
조건에서 여벌을 가진 학생이 도난 당했을 수도 있고 이 경우 빌려줄 수는 없다고 했으므로 lost 배열과 reserve 배열에 같은 번호가 있으면 두 배열에서 모두 제거해준다.
lost 배열의 앞번호부터 순회하기 때문에 여분이 있는 번호를 찾을 때에도 lost 학생의 앞번호부터 존재하는지 체크해야한다. 왜냐하면 lost = [2,4] reserve = [1, 3] 일 때, 2번 학생이 3번학생한테 빌리게 되면 1번 학생은 4번학생에게 빌려줄 수 없으므로 에러 케이스가 발생한다.
마지막으로 전체 잃어버린 학생의 수에서 빌린 학생 수를 빼면 빌리지 못한 학생 수를 알 수 있다. 전체 학생 수 n에서 빌리지 못한 학생 수를 빼면 체육수업을 들을 수 있는 학생 수를 알 수 있다.
'Python' 카테고리의 다른 글
프로그래머스 - 삼각 달팽이 (1) | 2024.04.03 |
---|---|
프로그래머스 - 숫자 문자열과 영단어 (0) | 2024.04.02 |
프로그래머스 - 부족한 금액 계산하기 (0) | 2024.03.31 |
프로그래머스 - 핸드폰 번호 가리기 (0) | 2024.03.28 |
프로그래머스 연습문제 - 두 정수 사이의 합 (0) | 2024.03.27 |