문제

내가 처음 생각한 풀이

  • lost와 reserve는 중복이 없다했으므로 set으로 만들고,
  • 못 빌려주거나 체육복을 빌려준 경우 reserve set에서 제거하고 answer를 1 높여주었다.
import Foundation

func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
    var answer = n - lost.count
    // 중복이 없으므로, set으로 변환
    var lostSet = Set(lost)
    var reserveSet = Set(reserve)
    
    // 여별이 있는 학생이 도난 당했을 경우 -> 체육복 하나니까 두 set에서 제거
    for student in reserveSet {
        if lostSet.contains(student) {
            answer += 1
            lostSet.remove(student)
            reserveSet.remove(student)
        }
    }
    
    // 체육복 빌릴 수 있는 친구 탐색하고
    // 다시 빌리는걸 방지하기 위해 빌리면 set에서 제거
    for student in lostSet {
        if reserveSet.contains(student - 1) {
            answer += 1
            reserveSet.remove(student - 1)
            lostSet.remove(student)
            continue
        }
        if reserveSet.contains(student + 1) {
            answer += 1
            reserveSet.remove(student + 1)
            lostSet.remove(student)
        }
    }
    
    return answer
}

하지만 결과는 테스트 11에서 자꾸 걸리는 것이었고, 아무리 머리 쥐어뜯어도 어떤 예외사항에 의해 걸리는지 모르겠다..🤯

두 번째 방법

위대하신 구박사님의 도움을 받아 한 블로그의 풀이를 참고하여 다시 풀었다.

방법

  1. student 배열에 숫자로 status 초기화

    • 기본 옷이 있는 사람은 1

    • 도난 당한 사람은 -1

    • 여벌 소지한 사람은 +1

  2. 그 후 0인 사람 전 후로 2가 있으면 0에는 +1, 2에는 -1

    • 해당 프로세스 시 인덱스 범위 밖 접근 조심하기!

코드

import Foundation

func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
  // 없는 사람 0 / 옷 한벌 1 / 여분 소지 2
  var student = [Int](repeating: 1, count: n)
  for i in lost {
    let index = i - 1
    student[index] -= 1
  }
  for i in reserve {
    let index = i - 1
    student[index] += 1
  }
  // 체육복 빌려주기
  for (index, value) in student.enumerated() {
    if value == 0 {
      if index > 0 && student[index - 1] == 2 {
        student[index - 1] -= 1
        student[index] += 1
      } else if index < student.count - 1 && student[index + 1] == 2 {
        student[index + 1] -= 1
        student[index] += 1
      }
    }
  }
  let answer = student.filter { $0 >= 1 }.count
  return answer
}

결과

나 운다… ( ꈨຶ ˙̫̮ ꈨຶ )