[Kotlin] ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์™€ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜ (ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค ์•Œ๊ณ ๋ฆฌ์ฆ˜)
๋ฐ˜์‘ํ˜•

 

 

 

 

 

๋ฌธ์ œ

https://school.programmers.co.kr/learn/courses/30/lessons/12940

 

 


 

์ ‘๊ทผ

 

๊ตฌ์ƒ, ์‹คํŒจ์ฝ”๋“œ

class Solution {
    fun solution(n: Int, m: Int): IntArray {
        

    var answerset = IntArray(2)
    if(n < m){
        for (i in n downTo 1){
            if(m % i == 1 && n % i == 1) {
                answerset[0] = i 
                break}
             }        
    } 
        else{
        for (i in m downTo 1){
            if(m % i == 1 && n % i == 1){
                answerset[0] = i
                break}
              }
    }
    
    
    if(n < m){
        for (i in m..1000000){
            if(m % i == 1 && n % 1 == 1) {
                answerset[1] = i
                    break}
        } 
    }
        else{
            for (i in n..1000000){
            if(m % i == 1 && n % 1 == 1){
                answerset[1] = i
                break}
          }
          }
        return answerset
    }
}
  • n๊ณผ m์˜ ํฌ๊ธฐ๋ฅผ ๋น„๊ตํ•ด์„œ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์ตœ์†Œ๊ณต์•ฝ์ˆ˜์™€ ์ตœ๋Œ€๊ณต๋ฐฐ์ˆ˜๋ฅผ ๋‚˜๋ˆ„์–ด ๊ตฌํ•˜๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.
  • ๋ชจ๋“  return ๊ฐ’์ด [0,0]์œผ๋กœ ๋‚˜์™€ ์‹คํŒจํ–ˆ๋‹ค.
  • ์ด ์ฝ”๋“œ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.
  • (1) ๋‘ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์—์„œ n % 1์„ ํ™•์ธํ•˜๋Š” ๋ถ€๋ถ„์—์„œ 1 ๋Œ€์‹ ์— i๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.
    ์ด ๋ถ€๋ถ„์€ ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋ถ€๋ถ„์ธ๋ฐ, n % 1์€ ํ•ญ์ƒ 0์ด๋ฏ€๋กœ ์ด๋Š” ์˜๋ฏธ๊ฐ€ ์—†๋‹ค.
  • (2) ๋‘ ๋ฒˆ์งธ ๋ฐ˜๋ณต๋ฌธ์—์„œ for (i in m..1000000)์™€ ๊ฐ™์ด 1000000์œผ๋กœ ํ•˜๋“œ์ฝ”๋”ฉํ•œ ๊ฒƒ์€ ์ข‹์ง€ ์•Š๋‹ค.
    ์ด ๊ฐ’์„ ๋” ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • (3) ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜์™€ ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋ฅผ ํ˜ผ๋™ํ•˜๊ณ  ์žˆ๋‹ค.
    ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋Š” n๊ณผ m์˜ ๊ณตํ†ต๋œ ์•ฝ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ํฐ ์ˆ˜๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋Š” n๊ณผ m์˜ ๊ณตํ†ต๋œ ๋ฐฐ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ์ž‘์€ ์ˆ˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ ์ฝ”๋“œ๋Š” ์ด ๋‘ ๊ฐ€์ง€๋ฅผ ํ˜ผ๋™ํ•˜๊ณ  ์žˆ๋‹ค.
  • (4)answerset ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 2๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์œผ๋ฏ€๋กœ, ์ž…๋ ฅ๊ฐ’์ด ์กฐ๊ฑด์„ ๋ฒ—์–ด๋‚  ๋•Œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

๐Ÿ’ก ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์ด๋ผ๋Š” ๊ฒŒ ์žˆ์—ˆ๋‹ค!

 

์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ• - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•(-ไบ’้™คๆณ•, Euclidean algorithm) ๋˜๋Š” ์œ ํด๋ฆฌ๋“œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ 2๊ฐœ์˜ ์ž์—ฐ์ˆ˜ ๋˜๋Š” ์ •์‹(ๆ•ดๅผ)์˜ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ํ•˜๋‚˜์ด๋‹ค. ํ˜ธ์ œ๋ฒ•์ด๋ž€

ko.wikipedia.org

  • ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜: gcd (greatest common diviser)
  • ์ตœ์†Œ ๊ณต๋ฐฐ์ˆ˜: lcm (least common multiple)

 


 

 

์„ฑ๊ณต ์ฝ”๋“œ

class Solution {
    fun solution(n: Int, m: Int): IntArray = intArrayOf(gcd(n, m), lcm(n, m))

    // ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜
    fun gcd(n: Int, m: Int): Int {
        var num1 = n
        var num2 = m

        while (num2 != 0) {
            val r = num1 % num2
            num1 = num2
            num2 = r
        }

        return num1
    }

    // ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜
    fun lcm(n: Int, m: Int): Int = n * m / gcd(n, m)
}
์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•œ ํ’€์ด

class Solution {
    fun solution(n: Int, m: Int) = intArrayOf(gcd(n, m), lcm(n, m))
    
    fun lcm(n:Int, m:Int) = n * m / gcd(n, m)
    
    fun gcd(n:Int, m:Int):Int{
        return if(n < m){
            if(n == 0) m else gcd(n, m % n)
        }else{
            if(m == 0) n else gcd(m, n % m)
        }
    }
}
๊ผฌ๋ฆฌ์žฌ๊ท€๋ฅผ ์ด์šฉํ•œ ํ’€์ด

class Solution {
    fun solution(n: Int, m: Int): IntArray {
        val gcd = gcd(n, m)

        return intArrayOf(gcd, n * m / gcd)
    }

    tailrec fun gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
}

 


 

์„ค๋ช…

 

  1. ์‚ฌ์‹ค ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์˜ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ์˜ค๋žซ๋™์•ˆ ์ดํ•ด๊ฐ€ ๊ฐ€์ง€ ์•Š์•˜๋‹ค.
  2. ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์— ์˜ํ•ด ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๋‚ด์šฉ์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.
    ๋งŒ์•ฝ b๊ฐ€ 0์ด๋ฉด, a๊ฐ€ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์ด๋‹ค. (a % 0 = a)
    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, a๋ฅผ b๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•œ๋‹ค. (a % b)
    ์ด๋•Œ ๋‚˜๋จธ์ง€๋ฅผ b๋กœ ๋Œ€์ฒดํ•˜๊ณ , ์ด์ „์˜ b๋Š” ํ˜„์žฌ์˜ a๋กœ ๋Œ€์ฒดํ•œ๋‹ค. ์ฆ‰, a์™€ b๋ฅผ ๋ฐ”๊พผ๋‹ค.
    1๋ฒˆ๋ถ€ํ„ฐ  ์ด ๊ณผ์ •์„ ๋‹ค์‹œ ๋ฐ˜๋ณตํ•œ๋‹ค.
    ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด, ๋งˆ์ง€๋ง‰์— ๋‚˜๋จธ์ง€๊ฐ€ 0์ด ๋  ๋•Œ๊นŒ์ง€ ์ง„ํ–‰๋œ๋‹ค. ๊ทธ๋•Œ์˜ b๊ฐ€ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๊ฐ€ ๋œ๋‹ค.

    ์˜ˆ๋ฅผ ๋“ค์–ด, 48๊ณผ 18์˜ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

    48 % 18 = 12
    18 % 12 = 6
    12 % 6 = 0
    ๋‚˜๋จธ์ง€๊ฐ€ 0์ด ๋˜์—ˆ์œผ๋ฏ€๋กœ, ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋Š” ๋งˆ์ง€๋ง‰์— ๋‚จ์€ 6์ด๋‹ค.
  3. ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์— ์˜ํ•˜๋ฉด ์ตœ์†Œ๊ณต๋ฐฐ์ˆ˜๋Š” '๋‘ ์ˆ˜์˜ ๊ณฑ'์„ ์ตœ๋Œ€๊ณต์•ฝ์ˆ˜๋กœ ๋‚˜๋ˆ„๋ฉด ๋‚˜์˜จ๋‹ค.
  4. ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์—์„œ๋Š” ๋‘ ์ˆ˜์˜ ์ƒ๋Œ€์  ํฌ๊ธฐ์— ๋Œ€ํ•œ ๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค.
    ์ด์œ ๋Š” ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ณผ์ •์—์„œ ๋‘ ์ˆ˜๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ๋‚˜๋ˆ„๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ์œ„์— ์ •๋ฆฌ๋œ ๋‚ด์šฉ๊ณผ ๊ฐ™์ด ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์€ ๋‘ ์ˆ˜์˜ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ๊ณผ์ •์—์„œ ๋‚˜๋ˆ—์…ˆ ์—ฐ์‚ฐ์„ ์ด์šฉํ•˜์—ฌ ์ˆ˜๋ฅผ ์ค„์—ฌ๋‚˜๊ฐ„๋‹ค. ๋‘ ์ˆ˜ a์™€ b ์ค‘ ์–ด๋Š ๊ฒƒ์ด ๋” ํฐ์ง€ ๋น„๊ตํ•˜๋Š” ๋Œ€์‹ , ๋‚˜๋จธ์ง€ ์—ฐ์‚ฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณ„์†ํ•ด์„œ ๋‘ ์ˆ˜์˜ ํฌ๊ธฐ๋ฅผ ๋น„์Šทํ•˜๊ฒŒ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ๊ฒƒ์ด ์ฃผ์š” ์•„์ด๋””์–ด์ด๋‹ค.

    ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋™์ž‘ํ•˜๋Š” ๋ฐฉ์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

    ๋งŒ์•ฝ b๊ฐ€ 0์ด๋ผ๋ฉด, a๊ฐ€ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์ด๋ฏ€๋กœ ์ด ์‹œ์ ์—์„œ ์—ฐ์‚ฐ์„ ์ข…๋ฃŒํ•œ๋‹ค.
    ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด, a๋ฅผ b๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ๊ตฌํ•œ๋‹ค. ์ด ๋•Œ ๋‚˜๋จธ์ง€๋Š” ํ•ญ์ƒ 0๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๊ณ , a๋ณด๋‹ค ์ž‘๋‹ค.
    ๊ทธ๋ฆฌ๊ณ  ์ด์ „์˜ b๋Š” ํ˜„์žฌ์˜ a๋กœ, ์ด์ „์˜ ๋‚˜๋จธ์ง€๋Š” ํ˜„์žฌ์˜ b๋กœ ๋Œ€์ฒดํ•˜์—ฌ ๋‹ค์‹œ ๋‚˜๋ˆ—์…ˆ์„ ์ง„ํ–‰ํ•œ๋‹ค.
    ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•˜๋ฉด, ํ•ญ์ƒ ๋‘ ์ˆ˜๋Š” ์ ์  ์ž‘์•„์ง€๊ณ , ๊ฒฐ๊ตญ์—๋Š” ํ•˜๋‚˜์˜ ์ˆ˜๊ฐ€ 0์ด ๋˜์–ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ข…๋ฃŒ๋œ๋‹ค. ์ด ์‹œ์ ์—์„œ ๋‘ ์ˆ˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ 0์ด๋ฉด, ๋‹ค๋ฅธ ์ˆ˜๊ฐ€ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๊ณ , ์ด ์ˆ˜๊ฐ€ ๋‘ ์ˆ˜์˜ ์ตœ๋Œ€ ๊ณต์•ฝ์ˆ˜์ด๋‹ค.
  5. ์œ ํด๋ฆฌ๋“œ ํ˜ธ์ œ๋ฒ•์„ ์ด์šฉํ•œ ํ’€์ด๋Š” ์žฌ๊ท€์ ์ด๋ฏ€๋กœ, tailrec(๊ผฌ๋ฆฌ์žฌ๊ท€)์„ ์ด์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•˜๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์งค ์ˆ˜ ์žˆ๋‹ค.

 


 

๋‹ค๋ฅธ ๋ฐฉ๋ฒ•

 

class Solution {
    fun solution(n: Int, m: Int): IntArray {
        var gcd = 1
        var lcm = n * m

        for(i in Math.min(n, m) downTo 1) {
            if(n % i == 0 && m % i == 0) {
                gcd = i
                break
            }
        }

        for(i in Math.max(n, m).. lcm) {
            if(i % n == 0 && i % m == 0) {
                lcm = i
                break
            }
        }
        var answer = intArrayOf(gcd, lcm)
        return answer
    }
}
  • ๋‚ด๊ฐ€ ์ฒ˜์Œ ์ ‘๊ทผํ–ˆ์„ ๋•Œ ๊ตฌ์ƒํ–ˆ๋˜ ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„ํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
  • lcm์„ n * m ์œผ๋กœ ๋‘”๋‹ค๋Š” ์ , if๋ฌธ์˜ ์กฐ๊ฑด์ด == 0 ์ด์—ˆ๋‹ค๋Š” ์ ์—์„œ ๋‚ด ๊ตฌ์ƒ๋ฐฉ๋ฒ•์ด ํ‹€๋ฆฐ ์ด์œ ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

 

 

 

 

 

๋ฐ˜์‘ํ˜•
 ๐Ÿ’ฌ C O M M E N T