코틀린/코딩테스트

코딩테스트 [나눗셈]

정혜현 2024. 6. 4. 16:46

문제

정수 num1과 num2가 매개변수로 주어질 때, num1을 num2로 나눈 값에 1,000을 곱한 후 정수 부분을 return 하도록 soltuion 함수를 완성해주세요.

 


 

풀이

1. 접근

1.1 관찰

주요한 기능은 2가지가 보인다.

나눈다.

1000을 곱한다. 

주기능 외에 눈에 띄는 특징이 있다. 자료형의 변화이다. 입력과 출력은 같은데 중간과정이 다르다. 매개변수는 정수인데 몫은 정수일수도 실수일수도 있다. 반환값은 다시 정수다. 즉 입력은 정수, 나누면 정수 또는 실수, 출력은 1000을 곱해 다시 정수이다.

class Solution {
    fun solution(num1: Int, num2: Int): Int {
        var answer: Int = num1/num2
        return answer
    }
}
/*테스트 1
입력값 〉	3, 2
기댓값 〉	1500
실행 결과 〉	실행한 결괏값 1이 기댓값 1500과 다릅니다.*/

 

일단 있는 그대로 나누기를 해봤더니 역시 결과에 소수점 이하가 잘린 정수형태로만 나타난다. 정수형으로 입력하고 나눈 결과는 실수형으로 변환했다가 1000을 곱해 정수형으로 반환할 수 있도록 해야겠다. 자료형을 바꾸려면 어떻게 할까부터 시작해야겠다. 

 

 

 

2. 시행착오

2.1 시도

  • 전제조건 : 입력은 정수, 나눈 결과는 정수 또는 실수, 출력은 정수로 해야한다.
  • 가설 : var answer변수 타입을 실수형Double로 입력하면 실수도 받을 것이다.
  • 검증 : 에러 나온다. 

/Solution.kt:3:30: error: type mismatch: inferred type is Int but Double was expected
        var answer: Double = num1/num2
                             ^
/Solution.kt:4:16: error: type mismatch: inferred type is Double but Int was expected
        return answer

class Solution {
    fun solution(num1: Int, num2: Int): Int {
        var answer: Double = num1/num2
        return answer
    }
}

 

변환이 아니라 억지라고 생각했던터라 에러에 동의했다.

변수 뿐만 아니라 모든 타입을 Double로 바꾸면 어떨까? 그래도 실제 입력값은 정수이기 때문에 역시 타입 미스매치다.

모두 Double로 바꾼 현재 코드에 실제 입력값을 실수로 주면 어떨까? 가능하다. 이로써 숫자형내에서도 정수형과 실수형의 구분이 확실하다는 것을 알게됐다.

 

그러면 담는 그릇만 바꾸지 말고 내용물을 진짜로 바꿔보자. 다행스럽게도 앱 만들어보는 과정에서 숫자형을 문자형으로 바꾸는 걸 해봤기 때문에 같은 숫자형의 변환도 가능할 것이라는 기대가 있다. 

 

 

2.2 재시도

정수를 실수로 변환해주는 메서드를 찾았다. toDouble이다.

가설 : 실수형으로 변환해서 나눈 값을 담은 다음, 1000을 곱하면 정수형이 담길 것이다.

검증 : 에러 나온다. 

/Solution.kt:4:28: error: type mismatch: inferred type is Double but Int was expected
        var answer : Int = divisionToDoble*1000
                           ^

class Solution {
    fun solution(num1: Int, num2: Int): Int {
        var divisionToDoble: Double = num1.toDouble()/num2.toDouble()
        var answer : Int/*Double해도 안됨*/ = divisionToDoble*1000
        return answer
    }
}

1000을 곱해도 정수형이 안된다. var answer를 Double로 바꿔도 return타입과 미스매치로 나온다. 그러면 결과값도 정수형으로 변환해주자. 실수를 정수로 변환하는 메서드는 toInt다.

 

 

2.3 재시도

가설 :  toInt로 반환값을 정수형으로 바꿔주면 될 것이다.

검증 : 됐다.

class Solution {
    fun solution(num1: Int, num2: Int): Int {
        var divisionToDoble: Double = num1.toDouble()/num2.toDouble()
        var answer : Double = divisionToDoble*1000
        return answer.toInt()
    }
}

 

난잡하다. 공식을 따로 변수로 만들지 말고 괄호로 묶었더니 좀 더 간결해졌다.

class Solution {
    fun solution(num1: Int, num2: Int): Int {
      var answer : Double = (num1.toDouble()/num2.toDouble())*1000
        return answer.toInt()
    }
}

 

 

 

 

 


회고

눈속임하지 말기 : 변수가 아닌 값의 변환이 중요하다. 

 

결과보다 과정에서 생각하기 : 계산결과를 변환시켜야 된다고 생각하니 어려웠다. 애초에 인자로 들어온 순간부터 변환시킬 수 있다.

'코틀린 > 코딩테스트' 카테고리의 다른 글

코딩테스트 [분수의 덧셈]  (0) 2024.06.07
코딩테스트 [각도기]  (0) 2024.06.05
코딩테스트 [나이 출력]  (0) 2024.06.05
코딩테스트 [숫자 비교하기]  (0) 2024.06.04
코딩테스트 [사칙연산]  (0) 2024.06.03