youngjaeLee1026 2022. 3. 8. 22:28

1. 문제

스크란샷 2022-03-08 22 19 21

2. μž…μΆœλ ₯

스크란샷 2022-03-08 22 19 42

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

스크란샷 2022-03-08 22 20 01

4. 문제 섀계

  1. 각 λ‚˜λ¬΄μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜λŠ” λͺ¨λ‘ λ‹€λ₯΄κ³ , κ°€κΉŒμš΄ μœ„μΉ˜(μ˜€λ¦„μ°¨μˆœ)둜 주어짐
  2. λ”°λΌμ„œ 각 μ •μˆ˜μ˜ 차에 λŒ€ν•œ μ΅œλŒ€κ³΅μ•½μˆ˜κ°€ 같은 κ°„κ²©μœΌλ‘œ μ΅œμ†Œν•œμ˜ λ‚˜λ¬΄λ₯Ό 심을 수 μžˆλŠ” κ°’μž„μ„ μ•Œ 수 있음
  3. κ°€λ‘œμˆ˜μ˜ μœ„μΉ˜λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜μ˜ 졜고 크기가 1,000,000,000 μ΄λ―€λ‘œ, μ™„μ „ νƒμƒ‰μœΌλ‘œ ν•΄λ‹Ή λ‚˜λ¬΄κ°€ 심어져 μžˆλŠ”μ§€ 확인 ν•˜κΈ° μœ„ν•΄ μ΅œμ•…μ˜ 경우 O(N)으둜(μ΅œλŒ€κ³΅μ•½μˆ˜κ°€ 1인 경우) 문제λ₯Ό ν•΄κ²°ν•  경우, μ‹œκ°„ 내에 ν•΄κ²°ν•˜μ§€ λͺ»ν•  수 있음
  4. λ”°λΌμ„œ, μ£Όμ–΄μ§„ μ •μˆ˜ 쀑 μ΅œλŒ€κ°’κ³Ό μ΅œμ†Œκ°’μ˜ 차이λ₯Ό 같은 간격(μ΅œλŒ€κ³΅μ•½μˆ˜)둜 λ‚˜λˆ„κ²Œ 되면, μ΅œλŒ€λ‘œ ν•„μš”ν•œ 간격을 ꡬ할 수 있고 + 1을 ν•˜κ²Œ 되면 총 λ‚˜λ¬΄μ˜ 개수λ₯Ό ꡬ할 수 있음.
  5. 이미 심어져 μžˆλŠ” λ‚˜λ¬΄μ˜ κ°œμˆ˜λŠ” λ¬Έμ œμ—μ„œ μ£Όμ–΄μ‘ŒμœΌλ―€λ‘œ μœ„ 4λ²ˆμ—μ„œ κ΅¬ν•œ κ°’μ—μ„œ N(이미 심어져 μžˆλŠ” λ‚˜λ¬΄μ˜ 개수)을 μ œμ™Έμ‹œν‚΄μœΌλ‘œμ¨ 문제λ₯Ό ν•΄κ²°ν•  수 있음

5. 전체 μ½”λ“œ

//
//  main.swift
//  Streetree
//
//  Created by 이영재 on 2022/03/08.
//MARK: - streetree

//MARK: - Framework
import Foundation

//MARK: - Function
func getGCD(_ A: Int, _ B: Int) -> Int {
    return A % B == 0 ? B : getGCD(B, A % B)
}

func solution() -> Void {
    //MARK: - Input
    guard let N: Int = Int(readLine() ?? "0") else { return }
    var answer: Int = 0
    var difference: Int
    var trees: [Int] = []
    var differences: [Int] = Array(repeating: 0, count: N + 10)
    
    for _ in 0..<N {
        guard let tree: Int = Int(readLine() ?? "0") else { return }
        trees.append(tree)
    }
    
    //MARK: - Process
    for i in 1..<N {
        differences[i - 1] = trees[i] - trees[i - 1]
    }
    
    difference = differences[0]
    for i in 1..<(N - 1) {
        difference = getGCD(difference, differences[i])
    }
    
    answer = (trees[N - 1] - trees[0]) / difference + 1 - N
    
    //MARK: - Output
    print(answer)
}
solution()

 

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