개발/Swift

[Swift 코딩테스트] 프로그래머스 - 체육복

덤벨로퍼 2021. 11. 29. 18:50

 

 

 

문제를 해결하기 위해 처음 생각했던것은

1.우선 멀쩡한 놈들을 계산한다. (전체 학생수 - lost 배열 길이)

lost 배열을 반복문 돌린후에

2.Lost 배열 앞에번호를 가지고 reserve에 있는지 확인

3.없으면 뒷번호 reserve에 있는지 확인하여

4.있으면 count를 1 증가시키는 방식이었다.

 

 

몇가지 테스트에 합격하지 않아 추가적으로

1.주어진 배열두개를 정렬함

2.여벌이있는데 도난당한경우 해당 번호를 두 배열에서 제거함 (여벌도없고 잃어버리지도 않은 상태임)

이 두 로직을 추가하여 해결하였다.

 

 

 

import Foundation

func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
    
    var reserveList = reserve
    var lostList = lost

    //정렬
    lostList.sort()
    reserveList.sort()
    
    //여벌+도난의 경우 배열에서 제거
	for reserveItem in reserveList {
        if let lostIndex = lostList.firstIndex(of:reserveItem),
            let reserveIndex = reserveList.firstIndex(of: reserveItem) {
            reserveList.remove(at: reserveIndex)
            lostList.remove(at:lostIndex)
        }
    }

    
    
    //일단있는놈 계산 전체학생 -lost
    var count = n - lostList.count
    //lost 주변에 reserve있늕지 확인
    for lostIndex in lostList {
        if let index = reserveList.firstIndex(of:lostIndex - 1) {
            reserveList.remove(at:index)
            count += 1
        }else  if let index = reserveList.firstIndex(of:lostIndex + 1) {
           reserveList.remove(at:index)
            count += 1
        }
    }
    
    
    
    return count
}