본문 바로가기
Algorithm

[Programmers] 체육복

by Jiseong 2021. 9. 28.

https://programmers.co.kr/learn/courses/30/lessons/42862#qna

 

코딩테스트 연습 - 체육복

점심시간에 도둑이 들어, 일부 학생이 체육복을 도난당했습니다. 다행히 여벌 체육복이 있는 학생이 이들에게 체육복을 빌려주려 합니다. 학생들의 번호는 체격 순으로 매겨져 있어, 바로 앞번

programmers.co.kr

 

 

제한사항

  • 전체 학생의 수는 2명 이상 30명 이하입니다.
  • 체육복을 도난당한 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌의 체육복을 가져온 학생의 수는 1명 이상 n명 이하이고 중복되는 번호는 없습니다.
  • 여벌 체육복이 있는 학생만 다른 학생에게 체육복을 빌려줄 수 있습니다.
  • 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. 이때 이 학생은 체육복을 하나만 도난당했다고 가정하며, 남은 체육복이 하나이기에 다른 학생에게는 체육복을 빌려줄 수 없습니다.

 

 

 

 

//
//  main.swift
//  Programmers_체육복
//
//  Created by 임지성 on 2021/09/28.
//

import Foundation

func solution(_ n:Int, _ lost:[Int], _ reserve:[Int]) -> Int {
    var answer = 0
    var lostSet = Set(lost).subtracting(reserve)
    let reserveSet = Set(reserve).subtracting(lost) // 중복제거(Set), Sutract(차집합) 이유 - 여벌 체육복을 가져온 학생이 체육복을 도난당했을 수 있습니다. (제한사항 5)
    
    for reserve in reserveSet {
        if lostSet.contains(reserve - 1) { // 앞사람 먼저 확인 (Greedy)
            lostSet.remove(reserve - 1) // 체육복 없는 사람(lost)에게 빌려줬기떄문에 lost에서 빠지게 됨
            continue
        }
        if lostSet.contains(reserve + 1) { // 뒷사람 확인
            lostSet.remove(reserve + 1) // 체육복 없는 사람(lost)에게 빌려줬기떄문에 lost에서 빠지게 됨
        }
    }
    answer = n - lostSet.count // 전체 인원 - 체욱복 없는 사람수
    
    return answer
}

 

탐욕법 공부

 

 

 

댓글