알고리즘/프로그래머스
[탐욕법(Greedy)] 체육복
happenundo
2023. 4. 14. 13:19
728x90
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
그리디로 풀면 되는 문제다.
체육복이 있어야 체육 수업을 들을 수 있는데, 체육복이 있는 학생 수의 최댓값을 출력하는 문제.
체육복이 없는 i번째 학생은 i-1번이나, i+1번 학생에게만 체육복을 받을 수 있다.
여기서 만약, i번째 학생이 i-1번째 학생에게 빌리든, i+1번째 학생에게 빌리든 체육복이 있는 학생 수는 변하지 않는다. -> 그리디
그래서 나는 만약 i번째 학생이 체육복이 없다면, i-1번째 학생에게 먼저 빌리고, 안되면 i+1번째 학생에게 빌리게 구현했다.
중간에 테스트 케이스 2개 정도가 계속 틀렸다고 나와서, 왜 그런지 검색해보니, lost, reserve 배열이 꼭 오름차순으로 입력되는게 아니라, 다르게 입력되는 케이스도 있다고 한다.
그래서 간단하게, lost.sort()와 reserve.sort()를 붙여줘서 해결해줬다.
def solution(n, lost, reserve):
clothes = [1] * (n+1) # 0번 인덱스는 제외
for l in lost:
clothes[l] -= 1
for r in reserve:
clothes[r] += 1
lost.sort()
reserve.sort()
for l in lost:
if clothes[l] == 0:
if l == 1: # 맨 앞 학생의 경우
if clothes[l+1] == 2:
clothes[l] += 1
clothes[l+1] -= 1
elif l == n: # 맨 뒤 학생의 경우
if clothes[l-1] == 2:
clothes[l] += 1
clothes[l-1] -= 1
else: # 그 외
if clothes[l-1] == 2:
clothes[l] += 1
clothes[l-1] -= 1
elif clothes[l+1] == 2:
clothes[l] += 1
clothes[l+1] -= 1
print(clothes)
return len([i for i in clothes[1:] if i >= 1]) # 가지고 있는 체육복의 개수가 1 이상인 학생의 수 리턴
728x90