- 문제 링크
https://programmers.co.kr/learn/courses/30/lessons/42862
코딩테스트 연습 - 체육복
점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번
programmers.co.kr
난이도: Level 1
- 제출 답안
import Foundation
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
var losted = lost.sorted(by: <).filter{!reserve.contains($0)}
var reserved = reserve.sorted(by: <).filter{!lost.contains($0)}
for value in losted {
if reserved.contains(value - 1) {
losted.remove(at: losted.firstIndex(of: value)!)
reserved.remove(at: reserved.firstIndex(of: value - 1)!)
} else if reserved.contains(value + 1) {
losted.remove(at: losted.firstIndex(of: value)!)
reserved.remove(at: reserved.firstIndex(of: value + 1)!)
}
}
return (n - losted.count)
}
- 풀이
- 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.
먼저 이 경우의 수를 해결해야 한다.
n=5, lost=[1,2,3], reserve=[2,3,4] 답:4
이런 테스트 케이스가 있다면 '내가 잃어버렸을 경우 빌려줄 수 없다'가 성립되지 않으면 답이 5가 되버린다. 그래서 lost와 reserve에 중복되는 값부터 제거해준다.
그리고 배열에 값이 순서대로 들어있지 않았을때 앞번호 먼저 비교를 해주기 위해 정렬을 해준다.
그 뒤에는 앞번호가 먼저 비교하고 그 다음 뒷번호를 비교하는 방식으로 lost와 reserve에 있는 값을 차례로 제거해 주면 된다.
'iOS > 알고리즘' 카테고리의 다른 글
[프로그래머스] 프린터 (0) | 2021.10.06 |
---|---|
[프로그래머스] 크레인 인형뽑기 게임 (0) | 2021.10.04 |
[프로그래머스] 로또의 최고 순위와 최저 순위 (0) | 2021.08.26 |
[프로그래머스]기능개발 (0) | 2021.08.23 |
[프로그래머스]모의고사 (0) | 2021.08.22 |