2024. 4. 11. 11:13, ๐กAlgorithm
๋ฐ์ํ
๋ฌธ์
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๋ก ๊ณ ์ ๋์ด ์์ผ๋ฏ๋ก, ์ ๋ ฅ๊ฐ์ด ์กฐ๊ฑด์ ๋ฒ์ด๋ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
๐ก ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ด๋ผ๋ ๊ฒ ์์๋ค!
- ์ต๋ ๊ณต์ฝ์: 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)
}
์ค๋ช
- ์ฌ์ค ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ๋ฐฉ๋ฒ์ ๋ํด์๋ ์ค๋ซ๋์ ์ดํด๊ฐ ๊ฐ์ง ์์๋ค.
- ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ํด ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ๋ด์ฉ์ ์๋์ ๊ฐ๋ค.
๋ง์ฝ 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์ด๋ค. - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ํ๋ฉด ์ต์๊ณต๋ฐฐ์๋ '๋ ์์ ๊ณฑ'์ ์ต๋๊ณต์ฝ์๋ก ๋๋๋ฉด ๋์จ๋ค.
- ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์์๋ ๋ ์์ ์๋์ ํฌ๊ธฐ์ ๋ํ ๊ณ ๋ ค๊ฐ ํ์ํ์ง ์๋ค.
์ด์ ๋ ์ต๋ ๊ณต์ฝ์๋ฅผ ์ฐพ๋ ๊ณผ์ ์์ ๋ ์๋ฅผ ๋ฐ๋ณต์ ์ผ๋ก ๋๋๊ธฐ ๋๋ฌธ์ด๋ค.
์์ ์ ๋ฆฌ๋ ๋ด์ฉ๊ณผ ๊ฐ์ด ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ๋ ์์ ์ต๋ ๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ๊ณผ์ ์์ ๋๋์ ์ฐ์ฐ์ ์ด์ฉํ์ฌ ์๋ฅผ ์ค์ฌ๋๊ฐ๋ค. ๋ ์ a์ b ์ค ์ด๋ ๊ฒ์ด ๋ ํฐ์ง ๋น๊ตํ๋ ๋์ , ๋๋จธ์ง ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๊ณ์ํด์ ๋ ์์ ํฌ๊ธฐ๋ฅผ ๋น์ทํ๊ฒ ๋ง๋ค์ด๊ฐ๋ ๊ฒ์ด ์ฃผ์ ์์ด๋์ด์ด๋ค.
์๊ณ ๋ฆฌ์ฆ์ด ๋์ํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ง์ฝ b๊ฐ 0์ด๋ผ๋ฉด, a๊ฐ ์ต๋ ๊ณต์ฝ์์ด๋ฏ๋ก ์ด ์์ ์์ ์ฐ์ฐ์ ์ข ๋ฃํ๋ค.
๊ทธ๋ ์ง ์์ผ๋ฉด, a๋ฅผ b๋ก ๋๋ ๋๋จธ์ง๋ฅผ ๊ตฌํ๋ค. ์ด ๋ ๋๋จธ์ง๋ ํญ์ 0๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๊ณ , a๋ณด๋ค ์๋ค.
๊ทธ๋ฆฌ๊ณ ์ด์ ์ b๋ ํ์ฌ์ a๋ก, ์ด์ ์ ๋๋จธ์ง๋ ํ์ฌ์ b๋ก ๋์ฒดํ์ฌ ๋ค์ ๋๋์ ์ ์งํํ๋ค.
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด, ํญ์ ๋ ์๋ ์ ์ ์์์ง๊ณ , ๊ฒฐ๊ตญ์๋ ํ๋์ ์๊ฐ 0์ด ๋์ด ์๊ณ ๋ฆฌ์ฆ์ด ์ข ๋ฃ๋๋ค. ์ด ์์ ์์ ๋ ์ ์ค ํ๋๊ฐ 0์ด๋ฉด, ๋ค๋ฅธ ์๊ฐ ์ต๋ ๊ณต์ฝ์๊ฐ ๋๋ ๊ฒ์ด๊ณ , ์ด ์๊ฐ ๋ ์์ ์ต๋ ๊ณต์ฝ์์ด๋ค. - ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์ด์ฉํ ํ์ด๋ ์ฌ๊ท์ ์ด๋ฏ๋ก, 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