Algorithm

Kotlin μ½”ν‹€λ¦° λ°±μ€€ 25344 ν–‰μ„± μ •λ ¬

노루룽 2024. 7. 15. 02:46

문제

ν–‰μ„± 정렬은 행성듀이 μΌμ§μ„ μœΌλ‘œ μ •λ ¬λœ κ²ƒμ²˜λŸΌ λ³΄μ΄λŠ” ν˜„μƒμ΄λ‹€. 졜근 μ§€κ΅¬μ—μ„œλ„ 18λ…„ λ§Œμ— ν–‰μ„± 정렬을 κ΄€μΈ‘ν•  수 μžˆμ—ˆλ‹€.

ν‰ν–‰μ„Έκ³„μ˜ μ€€μ„œκ°€ μ‚΄κ³  μžˆλŠ” μ§€κ΅¬μ—μ„œλŠ” 개의 행성을 κ΄€μΈ‘ν•  수 μžˆλ‹€. μ€€μ„œλŠ” μ–Όλ§ˆλ‚˜ κΈ°λ‹€λ €μ•Ό 개의 행성이 일렬둜 λ‚˜μ—΄λ˜λŠ” μˆœκ°„μ„ λ³Ό 수 μžˆμ„μ§€ κΆκΈˆν•΄μ‘Œλ‹€.

ν•˜λŠ˜μ„ μ—΄μ‹¬νžˆ κ΄€μ°°ν•œ κ²°κ³Ό, μ€€μ„œλŠ” λ‹€μŒ 사싀듀을 μ•Œ 수 μžˆμ—ˆλ‹€.

  • β€Šπ‘κ°œμ˜ 행성이 일렬둜 λ‚˜μ—΄λ˜λŠ” μˆœκ°„μ΄ μ‘΄μž¬ν•œλ‹€.
  • ν–‰μ„± μ •λ ¬μ˜ μ£ΌκΈ°λŠ” $10^{9}$초 μ΄ν•˜μ΄λ‹€.
  • 1, 2, 3번째 행성은 μ΄ˆλ§ˆλ‹€ 일렬둜 λ‚˜μ—΄λœλ‹€.
  • β€Š2, 3, 4번째 행성은 μ΄ˆλ§ˆλ‹€ 일렬둜 λ‚˜μ—΄λœλ‹€.
  • ...
  • 번째 행성은 μ΄ˆλ§ˆλ‹€ 일렬둜 λ‚˜μ—΄λœλ‹€.

μ€€μ„œλ₯Ό μœ„ν•΄ ν–‰μ„± μ •λ ¬μ˜ μ£ΌκΈ°λ₯Ό κ΅¬ν•΄μ£Όμž.

 

μž…λ ₯

첫째 쀄에 μ •λ ¬λ˜κΈΈ λ°”λΌλŠ” ν–‰μ„±μ˜ 개수 이 주어진닀. ()

λ‘˜μ§Έ 쀄에 행성이 일렬둜 λ‚˜μ—΄λ˜λŠ” μ£ΌκΈ°λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ κ°€ 곡백으둜 κ΅¬λΆ„λ˜μ–΄ 주어진닀. (

 

ν–‰μ„± μ •λ ¬μ˜ μ£ΌκΈ°λ₯Ό 좜λ ₯ν•œλ‹€. ν–‰μ„± μ •λ ¬μ˜ μ£ΌκΈ°λŠ” 초 μ΄ν•˜μ΄λ‹€.


문제 풀이

λͺ¨λ“  ν–‰μ„± μ •λ ¬ 주기의 μ΅œμ†Œ 곡배수λ₯Ό ꡬ해주면 λœλ‹€.

ν–‰μ„± μ •λ ¬μ˜ μ£ΌκΈ°κ°€ $10^9$초 μ΄ν•˜λΌλŠ” 쑰건이 μžˆμœΌλ―€λ‘œ IntλŒ€μ‹  Long을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

 

μ΅œλŒ€ κ³΅μ•½μˆ˜(GCD) κ΅¬ν•˜κΈ°

μ΅œμ†Œ 곡배수(LCM)λ₯Ό κ΅¬ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ΅œλŒ€ κ³΅μ•½μˆ˜(GCD)κ°€ ν•„μš”ν•˜λ‹€.

μ΅œλŒ€ κ³΅μ•½μˆ˜λ₯Ό κ°„λ‹¨ν•˜κ²Œ κ΅¬ν•˜λŠ” λ°©λ²•μœΌλ‘œλŠ” 'μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•'이 μžˆλ‹€.

 

두 수의 λ‚˜λ¨Έμ§€κ°€ 0이 λ‚˜μ˜¬ λ–„ κΉŒμ§€ 계속 μž¬κ·€ν•¨μˆ˜λ₯Ό 돌렀주면 λœλ‹€!

private fun gcd(a: Long, b: Long): Long {
    if (b == 0L) return a
    return gcd(b, a % b)
}

 

μ΅œμ†Œ 곡배수(LCM) κ΅¬ν•˜κΈ°

μ΅œλŒ€ κ³΅μ•½μˆ˜λ‘œ μ΅œμ†Œ 곡배수λ₯Ό λ§Œλ“€λ €λ©΄,

두 수의 곱에 μ΅œλŒ€ κ³΅μ•½μˆ˜λ₯Ό λ‚˜λˆ„λ©΄ λœλ‹€.

private fun lcm(a: Long, b: Long): Long {
    return a * b / gcd(a, b)
}

 

μ½”λ“œ

/**
 * ν–‰μ„± μ •λ ¬
 * https://www.acmicpc.net/problem/25344
 */

private var n = 0
private var list = listOf<Long>()

private fun solution() {
    var lcm = list[0]

    for (i in 1 until list.size) {
        lcm = lcm * list[i] / gcd(lcm, list[i])
    }

    println(lcm)
}

private fun gcd(a: Long, b: Long): Long {
    if (b == 0L) return a
    return gcd(b, a % b)
}

private fun input() = with(System.`in`.bufferedReader()) {
    n = readLine().toInt()
    list = readLine().split(" ").map { it.toLong() }
    close()
}

fun main() {
    input()
    solution()
}

 

Reference

https://www.acmicpc.net/problem/25344

https://adjh54.tistory.com/179

 

[Java/μ•Œκ³ λ¦¬μ¦˜] μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•(Euclidean Algorithm) : μ΅œλŒ€κ³΅μ•½μˆ˜, μ΅œμ†Œκ³΅λ°°μˆ˜

ν•΄λ‹Ή κΈ€μ—μ„œλŠ” μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•μ— λŒ€ν•΄ μ΄ν•΄ν•˜κ³  μ΅œλŒ€κ³΅μ•½μˆ˜μ™€ μ΅œμ†Œκ³΅λ°°μˆ˜μ—μ„œ 이λ₯Ό ν™œμš©ν•  수 μžˆλŠ” 방법에 λŒ€ν•΄ κ³΅μœ ν•©λ‹ˆλ‹€. 1) μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•(Euclidean Algorithm)πŸ’‘ μœ ν΄λ¦¬λ“œ ν˜Έμ œλ²•/μ•Œκ³ λ¦¬μ¦˜(

adjh54.tistory.com