본문 바로가기
Algorithm/문제풀이_프로그래머스

[Swift][프로그래머스][그리디] 체육복

by Joahnee 2022. 4. 20.

요구능력

그리디

 

문제풀이

 

이 문제는 전체 학생수가 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
}

댓글