https://programmers.co.kr/learn/courses/30/lessons/42862?language=swift
탐욕법(Greedy)
체육복을 도난 당한 친구들에게 여분이 있는 학생들이 양옆의 친구에게 빌려줘서
체육복이 없는 학생 인원을 최소로 줄여서 체육복이 있는 학생수를 출력하는 문제
접근방법
우선 본인이 여벌의 옷을 갖고 있는데 한개를 분실한 친구 번호는 양배열에서 모두 제거한다. (filter사용)
체육복이 있는 학생 번호를 담은 reserve 배열을 순회하면서 본인의 앞,뒤 친구가 lost 배열에 있으면
체육복을 빌려준다 ( lost 배열에서 지움 )
최종적으로 lost 배열에 남은 학생수(여분을 빌리지 못한 학생수)를 전체 인원(n)에서 빼서 반환한다.
오답노트
- 본인의 앞사람 번호를 참조할때 범위를 넘어갈 것을 대비해서 ( v-1 < 0 ? 0 : v-1 ) 로 했었는데 번호가 1번부터라 0을 1로 바꿔줘야 했음 => 그리고 사실 어차피 index 메서드로 있나 없나 체크하는거라 오버플로 대비를 내가 안해줘도 될 것 같음 (그럼 이게 원인은 아니었던거네..)
- 원래는 lost 배열을 순회하면서 본인의 앞,뒤 친구들에게 체육복을 빌리는 로직으로 구현했으나 실패했음. 근데 다른 요인일 수 있어서 다시 시도해볼 예정 (현재는 reserve 배열을 순회하는 것으로 구현한 상태)
- 순회하는 배열은 오름차순으로 정렬되어 있어야함 (가장 마지막 트러블이 이거였음)
- 그리고 본인에게 본인이 빌려주는 상황을 왜 꼭 filter해서 걸러야 하는지 모르겠음. if문에서 앞,뒤 전에 본인에게 빌려주는 경우를 처리할 수도 있을 것 같은데 안됨.
소스코드
import Foundation
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
var lostt = lost.filter{ !reserve.contains($0) }
var reservee = reserve.sorted().filter{ !lost.contains($0) }
for r in reservee {
if let i = lostt.index(of:r-1){
lostt.remove(at:i)
}else if let i = lostt.index(of:r+1){
lostt.remove(at:i)
}
}
return n - lostt.count
}
'알고리즘 문제풀이' 카테고리의 다른 글
[프로그래머스] #134 최소직사각형 (Swift) (0) | 2022.02.11 |
---|---|
[프로그래머스] #133 K번째수 (Swift) (0) | 2022.02.10 |
[프로그래머스] #131 모의고사 (Swift) (0) | 2022.02.08 |
[프로그래머스] #130 메뉴 리뉴얼 (0) | 2021.12.08 |
[백준 14500] #129 : 테트로미노 (C++) (0) | 2021.10.11 |