코틀린/코딩테스트

코딩테스트 [사칙연산]

정혜현 2024. 6. 3. 20:01

문제

정수 num1과 num2가 주어질 때, num1에서 num2를 뺀 값을 return하도록 soltuion 함수를 완성해주세요.

 


 

풀이

1. 접근

1.1 관찰

보이는 형식부터 살펴봤다.

하나의 클래스는 하나의 메서드를 가지고 있고 반환값을 변수에 담은 형태이다. 즉 이 클래스는 이 메서드가 전부다. 그럼 문제에 나온대로 이 메서드가 뺄셈을 수행하도록 만들기만 하면 되겠다. 그러면 뺄셈을 어떻게 수행하도록 할까부터 시작해야겠다.

 

클래스 스코프에는 메서드와 지역변수가 정의되어있다. 매니저님께 주어진 형식을 모두 살려서 풀어야하는 것인지, 혹은 그래야 점수가 높은 것인지 여쭤보았는데 꼭 그래야하는 건 아니고 정답은 없다고 하셨다.

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

 

1.2 제한사항

-50000 ≤ num1 ≤ 50000
-50000 ≤ num2 ≤ 50000

 

제한사항은 내가 코드에서 만들어야하는 조건일까? 범위에서 벗어나지 않도록 예외처리를 해야되는지 의문이었다. 팀원분들께 여쭤보니 그래야하는 경우도 있긴한데 반드시 조건으로 걸어야되는 필수사항은 아니었다. 참고사항으로 생각하고 풀어본 다음, 필요시 조건으로 걸도록 조언해주었다. 

 

 

 

2. 시행착오

2.1 시도

문제해결방법을 찾고자 이번 문제의 주키워드인 '뺄셈'으로 브레인스토밍하고 중심이 되는 특징들을 전제조건으로 적었다. 전제조건에 따라 가설을 세운 뒤 검증해보았다.

  • 전제조건 : 계산식은 계산결과 앞에 위치해야된다. 뺄셈의 공식은 n-n=n이다.
  • 가설 : solution함수 중괄호 안에{num1 - num2 return answer}로 하면 뺄셈 후 결과를 돌려줄 것이다.
  • 검증 : 결과값이 0으로만 나온다. 
class Solution {
    fun solution(num1: Int, num2: Int): Int {
        num1-num2
        var answer: Int = 0
        return answer
    }
}

 

왜 틀렸을까. 코드의 위치나 구조만 바꿔댔고 정작 실패의 원인인 전제조건은 의심해볼 생각을 못했다. 너무 당연한 말이라 의심의 여지가 없었던 것이다.

 

명령어에서 벗어나 주체를 바라보자. 컴퓨터다. 사람과 다르다. 사람의 사고와 흐름대로 해결하려고 한 고정관념이 원인이었다. 컴퓨터의 흐름에 맞는 순서와 정확한 명령어가 필요하다. 

뺄셈은 수행했지만 그 결과를 반환값에 담지 않았고, 반환값에 담긴 것은 초기화해둔 0이기 때문에 뺄셈 결과가 반환되지 않고 0만 나왔던 것이다.

 

 

2.2 재시도

자 그러면 컴퓨터의 기본으로 돌아가보자. 입력하면 출력해주는 흐름에 맞춰서 생각해본다.

입력 : 파라미터에 인자를 넣는다.

출력 : 반환값(변수에 담음)을 내보낸다.

 

가설 : var answer : Int = 뺄셈결과 를 담도록 수정하면 될 것이다. 그러니까 그 뺄셈을 어디서 시켜서 결과로 담는건데....

 

제자리 걸음이 돼서 gpt의 도움을 구했다. 제일 처음 나온 답변이었다. 알고있던 함수의 형태가 아니라서 찾아보니 단일 표현식은 중괄호와 리턴을 생략할 수 있다고 한다.  

class Solution{
    fun solution(num1: Int, num2: Int) = num1 - num2
}

 

알고있는 함수의 형태로 바꿔봤다. 

class Solution {
    fun solution(num1: Int, num2: Int): Int {
    return num1-num2
    }
}

 

가설대로 var answer변수에 뺄셈의 결과를 담고싶어서 바꿔봤다. 뺄셈해주는 함수를 따로 지정하니 코드가 복잡해졌다.

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

 

var answer변수에 뺄셈의 계산결과를 담는 게 아니라 계산 자체를 담으니 코드가 간결해졌다.  

원래 있던 형식을 살리기도 했고, 문제만 풀기 위한 게 목적이 아니라 실제로 사용했을 때 가장 가치있는 방향으로 코드를 짜고 싶었기 때문에 이 코드가 가장 마음에 들었다. 더불어 유능한 팀원분께 여쭤보니 이렇게 쓰는 게 협업할 때 가장 적절하겠다는 답변도 받았다. 

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

 

같은 방법으로 다른 사칙연산도 풀이했다.

//두 수의 합
class Solution {
    fun solution(num1: Int, num2: Int): Int {
        var answer: Int = num1+num2
        return answer
    }
}
//두 수의 곱
class Solution {
    fun solution(num1: Int, num2: Int): Int {
        var answer: Int = num1*num2
        return answer
    }
}
//두 수의 몫
class Solution {
    fun solution(num1: Int, num2: Int): Int {
        var answer: Int = num1/num2
        return answer
    }
}

 


회고

입력 출력을 최우선으로 생각해보기 : 처음부터 역할과 기능에 너무 집중하지 말고 입출력을 먼저 생각해야 사람의 사고대로 흘러가지 않는다.

 

정확하고 섬세하게 명령하기 : 그냥 '결과'가 아닌 '그 계산결과'로 정확하게 집어서 명령해야 한다. 

 

효율적으로 담기 : 꼭 최종적인 형태로 만들어서 담을 필요는 없다. 간단한 계산식이거나 단순히 반환만 하는 경우에는 계산결과가 아닌 계산식을 반환값 변수에 담는다. 계산식이 복잡해지거나 계산 결과가 재활용된다면 고려해봐야한다. 

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

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