사전캠프 교육을 듣다가 어쩌다보니 종종 얘기하던 분들 중에서 부트캠프를 참석하고 IT 취업준비를 하고 계신 분이 계셔서 많은 얘기를 나눴다. 요즘 트렌드라던가 취업 준비를 위해 준비중인 내용등을 듣다 보면 내가 옛날에 취업할 때는 여러모로 행운이 아닐까 싶을 정도로 준비가 철저했고 내용이 알찼다. 반면에 나는 준비가 정말 미숙했는데 운좋게 취업이 됐을 뿐이었다.
나야 경력이 오래 전이니 도움 될 내용을 말씀드리긴 힘들었고 재밌는 수다떨기에 가까웠지만 본 캠프를 참가하기 직전에 각오를 어느정도 다지는 데에 도움이 된 것 같다.
하지만 이렇게 생각해놓고 실기 문제에 펀치 한 대 맞고 CS 강의 듣다보니 정신을 못차리겠다.
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
fun solution(n: Int, m: Int): IntArray = chda(n, m).let { intArrayOf(it, n * m / it) }
tailrec fun chda(n: Int, m: Int): Int {
return when {
m == 0 -> n
else -> chda(m, n % m)
}
}
이전에 사전캠프 3일차에 콜라츠 추측 문제를 다룰 때 인상깊게 봤던 꼬리재귀를 사용해서 문제를 풀었다.
그리고 핵심이 되는 알고리즘은 분명 뭔가 쉬운 방법이 있었던 것 같은데.. 하고 검색해서 유클리드 호제법을 찾아 적용한 방식이다. 중학생 때 본게 마지막이었던 것 같은데 오랜만에 보니 반갑다.
다만 구현 단계에서는 실수가 있었는데 chda
의 반환형을 (Int, Int)
로 지정해서 풀려고 해서 조금 돌아가야 했다. 유클리드 호제법의 해석을 나누는 수와 결과를 같이 보내야 하겠구나라고 생각해버려서 엉터리로 작성했는데 뒤늦게서야 반환형을 고치고 정답을 찾았다.
(심지어 (Int, Int)라고 작성한건 Kotlin Pair도 아니고 Swift의 tuple형이다.)
그리고 함수명을 엉터리로 chda라 적었는데 최대공약수는 영어로 greatest common divisor
라서 일반적으로는 gcd로 쓰는게 맞았다. 구글 안쓰고 풀어보겠다고 머리를 어설프게 썼더니 저렴한 표현이 되어버렸다.
최소공배수는 최대공약수를 알고 있으면 두 수의 곱 / 최대공약수로 처리가 가능한 것도 검색 중에 알아서 let
을 사용해 최대공약수의 덤으로 처리했다.
다행히 다른 분들의 풀이를 봐도 꼬리재귀를 쓴 가장 인상깊은 풀이라 동일해서 좋았는데 약간 디테일이 아쉬웠다.
tailrec fun gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b)
굳이 조건을 when
으로 지정할 필요는 딱히 없었다. 콜라츠 추측 문제가 when
으로 count
조건을 체크했던 거라 참고해서 쓰다보니 굳이 if
로 간결히 처리하고 단일 표현식으로 반환까지 가능했는데 정직하게 똑같이 쓴 건 약간 아쉬운 점이다.