- 문제 링크

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에 있는 값을 차례로 제거해 주면 된다.

+ Recent posts