요구능력
그리디
문제풀이
이 문제는 전체 학생수가 30명이하라고 했기 때문에 뭐 어떻게 풀어도 풀기만하면 시간초과는 안나온다고 생각한다.
그리고 여분을 가지고 있는 학생과 도난당한 학생들이 있는데, 여분을 가지고있는 학생들이 자기 앞뒤번호로 나눠준다는 문제이다.
이 문제에서 설명이 필요한 부분은 딱 2개인것같다.(내가 놓친 예외)
1) 우리는 입력받을 때 무조건적으로 오름차순으로 준다는 말이 없었다.
하지만 문제를 풀 때 오름차순으로 받아야 편하게 풀린다..
그리고 보여지는 테케에서는 오름차순으로만 주기때문에 사람들이 놓치기 쉬운 예외인것같다.
그래서 lostTemp와 reserved는 각각 lost와 reserve를 정렬한것이다.
참고) (테케 18, 20번)통과
2) 문제의 조건 중 "도난당한학생은 다른 학생에게 체육복을 빌려줄 수 없다"라는 조건이다.
이 부분을 잘 처리해줘야한다.
나는 이 부분을 읽지않고 문제를 풀어서 테케 5번에서 틀렸던것같다.
체육복을 빌려 줄 수 없기 때문에 도난당한학생목록(lostTemp)과 여분이있는학생목록(reserved) 둘다에 존재하는 학생들은 미리 제거를 해줘야한다.
미리 제거를 안해줄 경우에 reserved[i]-1인 부분에서 도난당한 학생을 구제해주게된다..
참고) 테케 5번 통과
반례 : 5, [2, 3, 4], [1, 2, 3] => 4
후기
어려운 문제는 아니지만 예외처리가 발목을 잡는 문제이다.
아직 그리디랑 구현을 많이 안풀어봐서 그런지.. 이런 예외처리가 바로바로생각이 안난다.
코드
func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
var result = n - lost.count
var lostTemp = lost.sorted()
var reserved = reserve.sorted()
for i in 0..<lostTemp.count{
if let idx = reserved.firstIndex(of: lostTemp[i]){
lostTemp[i] = -1
reserved.remove(at: idx)
result += 1
}
}
for i in 0..<reserved.count{
if lostTemp.contains(reserved[i] - 1){
let idx = lostTemp.firstIndex(of: reserved[i] - 1)
lostTemp.remove(at: idx!)
result += 1
continue
}
if lostTemp.contains(reserved[i] + 1){
let idx = lostTemp.firstIndex(of: reserved[i] + 1)
lostTemp.remove(at: idx!)
result += 1
}
}
return result
}
'Algorithm > 문제풀이_프로그래머스' 카테고리의 다른 글
[Swift][프로그래머스][해시] 오픈채팅방 (0) | 2022.04.22 |
---|---|
[Swift][프로그래머스][완전탐색] 문자열 압축 (0) | 2022.04.21 |
[Swift][프로그래머스][해시] 베스트앨범 (0) | 2022.04.19 |
[Swift][프로그래머스][완전 탐색] 카펫 (0) | 2022.04.18 |
[Swift][프로그래머스][완전 탐색] 소수 찾기 (0) | 2022.04.18 |
댓글