youngjaeLee1026 2022. 4. 8. 21:14

1. 문제

스크란샷 2022-04-08 21 10 25

2. μž…μΆœλ ₯

스크란샷 2022-04-08 21 10 33

3. μž…μΆœλ ₯ μ˜ˆμ‹œ

스크란샷 2022-04-08 21 10 46

4. 문제 섀계

  • 처음 문제λ₯Ό μ ‘ν–ˆμ„ λ•Œ, μ™„μ „νƒμƒ‰μœΌλ‘œ 문제λ₯Ό μ„€κ³„ν•˜κΈ°κ°€ κΉŒλ‹€λ‘œμ›€
  • λ”°λΌμ„œ κ·œμΉ™μ„ μ‚΄νŽ΄λ³΄λ©΄, κ΅¬μŠ¬μ€ 1개 ~ 3개 κ°€μ Έκ°ˆ 수 μžˆμœΌλ―€λ‘œ, 1 ~ 3개일 λ•ŒλŠ” μ² μˆ˜κ°€ λ¨Όμ € κ°€μ Έκ°€λ―€λ‘œ 이길 수 밖에 μ—†μŒ
  • 4개의 경우 따져보면, μ˜ν¬κ°€ 이길 수 밖에 μ—†μŒ 5개 6개 7개 μΌλ•ŒλŠ” μ² μˆ˜κ°€ 이길 수 μžˆλŠ” κ²½μš°κ°€ 있음
  • 8개의 경우 μ˜ν¬κ°€ 이길 수 밖에 μ—†μŒ. λ”°λΌμ„œ 4둜 λ‚˜λˆ„μ–΄ λ–¨μ–΄μ§€λŠ” 경우, μ˜ν¬κ°€ 이기고 μ•„λ‹Œ κ²½μš°λŠ” μ² μˆ˜κ°€ 이길 κ°€λŠ₯성이 μžˆλŠ” 것을 κ°„λ‹¨ν•˜κ²Œ μ•Œ 수 μžˆμ§€λ§Œ, λ™μ κ³„νšλ²•μ„ 풀이할 μˆ˜λ„ 있음
  • μ² μˆ˜μ™€ μ˜ν¬κ°€ κ³΅ν‰ν•˜κ²Œ λ²ˆκ°ˆμ•„ κ°€λ©΄μ„œ κ΅¬μŠ¬μ„ μ΅œμ„ μ„ λ‹€ν•΄ κ°€μ Έκ°€λ―€λ‘œ, ν˜„μž¬ μ‹œμ μ΄ μ² μˆ˜κ°€ κ΅¬μŠ¬μ„ κ°€μ Έκ°€λŠ” μ‹œμ μ΄λΌκ³  κ°€μ •ν•˜λ©΄, 
  • 이전 μ‹œμ μ—μ„œ μ˜ν¬κ°€ κ΅¬μŠ¬μ„ 1개 가져갔을 λ•Œ, 2개 가져갔을 λ•Œ, 3개 가져갔을 λ•Œ λͺ¨λ‘ 승리라면 μ² μˆ˜κ°€ 이길 κ°€λŠ₯성은 μ—†κ³ , ν•œκ°€μ§€ κ²½μš°λΌλ„ 패배인 κ²½μš°κ°€ μžˆλ‹€λ©΄ μ² μˆ˜κ°€ 이길 κ°€λŠ₯성이 μžˆλŠ” 것을 μ•Œ 수 있음
  • 두 μ•Œκ³ λ¦¬μ¦˜ λͺ¨λ‘ O(N)으둜 문제λ₯Ό ν•΄κ²°ν•  수 있음

5. 전체 μ½”λ“œ

//MARK: - ꡬ슬 κ²Œμž„

//MARK: - Framework
import Foundation

//MARK: - Function
func solution() -> Void {
    //MARK: - Input
    guard let n: Int = Int(readLine() ?? "0") else { return }
    var marbleGames: [Bool] = Array(repeating: false, count: n + 10)
    let baseCondition: Int = 3
    
    //MARK: - Process
    //1. λΆ€λΆ„ 문제λ₯Ό μ •μ˜ν•œλ‹€.
    //n개의 ꡬ슬이 μ£Όμ–΄μ‘Œμ„ λ•Œ, 1개, 2개, 3κ°œμ”© κ°€μ Έκ°„λ‹€ ν–ˆμ„ λ•Œ, μ² μˆ˜κ°€ 이길 수 μžˆλŠ”μ§€ ꡬ해야 함.
    //T[i] = μ² μˆ˜κ°€ 이길 κ²½μš°κ°€ ν•œκ°œλΌλ„ 있으면 true, μ—†μœΌλ©΄ false
    
    //2. 점화식을 μ„Έμš΄λ‹€.
    //각 κ²Œμž„μ€ μ² μˆ˜λΆ€ν„° μ‹œμž‘ν•΄μ„œ κ³΅ν‰ν•˜κ²Œ ν•œλ²ˆμ”© μ§„ν–‰λ˜λŠ” 것과, ν•œ λ²ˆμ— 1개 ν˜Ήμ€ 2개 ν˜Ήμ€ 3개λ₯Ό κ°€μ Έκ°ˆ 수 μžˆλ‹€λŠ” 점에 μœ μ˜ν•΄μ„œ
    //ν˜„μž¬ μ‹œμ μ—μ„œ 이전 결과에 μ˜ν•΄ 결정이 됨
    //T[i] = 1개 가져갔을 λ•Œ κ²°κ³Ό && 2개 가져갔을 λ•Œ κ²°κ³Ό && 3개 가져갔을 λ•Œ κ²°κ³Ό
    //즉, T[i] = T[i - 1] && T[i - 2] && T[i - 3] ? false : true(이전 κ²°κ³ΌλŠ” 영희의 μ°¨λ‘€ μ΄λ―€λ‘œ λ°˜λŒ€κ°€ λ˜μ–΄μ•Ό 함)
    for i in 1...baseCondition {
        marbleGames[i] = true
    }
    
    for i in stride(from: baseCondition + 1, through: n, by: 1) {
        marbleGames[i] = marbleGames[i - 1] && marbleGames[i - 2] && marbleGames[i - 3] ? false : true
    }
    
    //MARK: - Output
    print(marbleGames[n] ? "YES" : "NO")
}
solution()

 

μ „μ²΄μ½”λ“œλŠ” μ—¬κΈ°μ—μ„œ 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.