문제
첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
풀이
1. 접근
1.1 관찰
기본으로 나타나는 형태가 달라졌다.
파라미터는 4개로 늘었고, 반환타입은 정수형 배열이다.
class Solution {
fun solution(numer1: Int, denom1: Int, numer2: Int, denom2: Int): IntArray {
var answer: IntArray = intArrayOf()
return answer
}
}
문제에 따라 분석해보면 다음과 같다.
기능 : 분모끼리 곱한다. 각 분자에 분모와 같은 값을 곱한다. 분모 두 수를 더한다. 분자 두 수를 더한다. 분자를 배열에 담는다. 분모를 배열에 담는다.
반환 : 배열의 0번째, 1번째 인덱스값을 리턴한다.
1.2 준비
최대공약수GCD Greatest Common Divisor는 유클리드 호제법으로 구한다.
유클리드 호제법Euclidean algorithm
나머지 구하기 : a를 b로 나눈 나머지를 구한다.
나머지가 0이면, b가 a와 b의 최대공약수
나머지가 0이 아니라면, b를 새로운 a로 하고, 나머지를 새로운 b로 하여 위의 과정을 반복한다.
이 과정을 반복하면 결국 나머지가 0이 되는 순간이 올 때까지 반복하면서 최대 공약수를 찾게 된다.
// 최대공약수
fun gcd(denom1: Int, denom2: Int): Int {
if (denom2 == 0) {
return denom1
}
return gcd(denom2, denom1 % denom2)
}
2. 시행착오
2.1 시도
- 가설 : 최대공약수를 구하고 분모끼리 곱한 값과 분자에 각 분모와 동일한 값을 곱한 값에 최대공약수로 나누면 될 것이다. {(numer1*denom2)+(numer2*denom1)}/gcd,(denom1*denom2)/gcd
class Solution {
//최대공약수 구하기
var gcd : Int = gcd(denom1: Int,denom2: Int)
fun gcd(denom1: Int, denom2: Int): Int {
if (denom2 == 0) {return denom1}
else return gcd(denom2, denom1 % denom2)
}
//담기
fun solution(numer1: Int, denom1: Int, numer2: Int, denom2: Int): IntArray {
var answer: IntArray = intArrayOf({(numer1*denom2)+(numer2*denom1)}/gcd,(denom1*denom2)/gcd)
return answer
}
}
- 검증 : 실패
- 원인 : 코틀린 계산식에는 중괄호를 쓸 수 없다.
- 해결방안 : 각각 나눠서 계산하고 더해준다.
2.2 재시도
class Solution {
//최대공약수 구하기
var gcd : Int = gcd(denom1: Int,denom2: Int)
fun gcd(denom1: Int, denom2: Int): Int {
if (denom2 == 0) {return denom1}
else return gcd(denom2, denom1 % denom2)
}
//담기
fun solution(numer1: Int, denom1: Int, numer2: Int, denom2: Int): IntArray {
var numer = (numer1*denom2)/gcd+(numer2*denom1)/gcd
var denom = (denom1*denom2)/gcd
var answer: IntArray = intArrayOf(numer, denom)
return answer
}
}
- 검증 : 실패
/Solution.kt:2:31: error: unexpected type specification
var gcd : Int = gcd(denom1: Int,denom2: Int)
^
/Solution.kt:2:43: error: unexpected type specification
var gcd : Int = gcd(denom1: Int,denom2: Int)
^
/Solution.kt:2:25: error: unresolved reference: denom1
var gcd : Int = gcd(denom1: Int,denom2: Int)
^
/Solution.kt:2:37: error: unresolved reference: denom2
var gcd : Int = gcd(denom1: Int,denom2: Int)
^
- 원인 : 변수를 선언할 때 함수 호출을 통해 초기화할 수 없다. 변수를 선언할 때는 변수의 자료형을 지정하고 값을 할당해야 한다. 함수 호출은 값을 반환할 뿐이다. 또한 값이 할당되지 않은 상태에서 함수를 사용할 수 없다.
- 해결방안 : 위치와 형태를 수정한다.
2.3 재시도
class Solution {
//최대공약수 구하는 함수
fun gcd(denom1: Int, denom2: Int): Int {
if (denom2 == 0) {return denom1}
else return gcd(denom2, denom1 % denom2)
}
//결과 담는 함수
fun solution(numer1: Int, denom1: Int, numer2: Int, denom2: Int): IntArray {
var gcd = gcd(denom1,denom2)
var numer = (numer1*denom2)/gcd+(numer2*denom1)/gcd
var denom = (denom1*denom2)/gcd
var answer: IntArray = intArrayOf(numer, denom)
return answer
}
}
- 검증 : 성공
gcd변수 선언을 solution 함수 바깥에 두면 안되는걸까? 코딩테스트에서는 solution에 값을 할당하도록 설정되어있어서 그럴 수 있다고 한다. 이 부분은 추후 안드로이드 스튜디오로 확인해보고 수정할 예정
회고
내향형 코틀린 : 계산식도 그렇고 논리연산자도 그렇고 둘 이상 엮이는 걸 좋아하지 않는 코틀린. 각각을 계산해서 연결해준다.
어디에 두어야할까 : 위치가 너무 어렵다. 어디에서 어떤 이유로 사용되고자 만든 변수 또는 함수인지 생각하고 위치를 선정해보자.
'코틀린 > 코딩테스트' 카테고리의 다른 글
코딩테스트 [배열의 평균값] (0) | 2024.06.11 |
---|---|
코딩테스트 [배열 두배 만들기] (0) | 2024.06.07 |
코딩테스트 [각도기] (0) | 2024.06.05 |
코딩테스트 [나이 출력] (0) | 2024.06.05 |
코딩테스트 [숫자 비교하기] (0) | 2024.06.04 |