2023-08-01

Owler·2023년 8월 3일
0

고뿔이 걸려서 못올렸던 TIL 올리기..

알고리즘

코틀린에서 최댓값 구하는 코드 작성하기

맨처음 나의 접근 방식은 원래 C언어 때 했던 기억을 베이스로 진행하였다.
머리속으로 그려본 방식은

배열을 차례대로 탐색하면서 첫번째 반복문에서 최댓값을 a에 저장하고,
그 다음 반복문에서 최댓값과 동일한 값을 0으로 만들어 두번째 최댓값을 찾을때 배제하도록 하고,
마지막 반복문에서 두번째 최댓값을 찾으려고 하였다.

그에따른 첫번째 작성 코드는

class Solution {
    fun solution(numbers: IntArray): Int {
        var answer: Int = 0
        var a : Int = 0
        var b : Int = 0
        
        for(i in 0..numbers.size){
            for(j in 0..numbers.size){
                if(numbers[i]>numbers[j]) a=numbers[i]
                else a=numbers[j]
            }
        }
        
        for(k in 0..numbers.size){
            if(numbers[k]==a) numbers[k]=0
        }
        
        for(q in 0..numbers.size){
            for(w in 0..numbers.size){
                if(numbers[q]>numbers[w]) b=numbers[q]
                else b=numbers[w]
            }
        }
        
        
        
        println("두 수 의 곱중 최댓값은 $a * $b = $answer 입니다.")
        return answer
    }
}

이 코드를 기반으로 돌렸더니, 터무니 없는 런타임에러가 떴었다. (이때 조금 좌절했다.. 될줄알아서)
아무래도 기존에 있던 생각하는 방식에서 벗어나기 힘들어서 챗 gpt를 통해 조언을 얻었다.

1번을 보기 전에도 깨달을 수 있었던 것은 answer 값을 두 수의 곱으로 지정하지 않았다는 점인데, 멘붕이 와서 안보였었던 것 같다..

2,3번을 보고 최댓값을 구하는 방법을 다시 생각해보니 한 번의 반복문 안에서 해결할 수 있는 방법을 고안해 보았고 실행해보았다.

class Solution {
    fun solution(numbers: IntArray): Int {
       
        var a = Int.MIN_VALUE
        var b = Int.MIN_VALUE
        
        for(c in numbers){
            if(c>a){
                b=a
                a=c
            }
            else if(c>b){
                b=c
            }
        }
        
        var answer = a*b
        
        return answer
    }
}

처음에는 단순히 최댓값을 두개 구해야한다는 생각에 반복문을 두번 썼었지만 2,3번 의 조언을 듣고 고민해보니 하나의 반복문으로 해결할 수 있는 방법을 찾을 수 있었다.

a,b (최댓값 1,2)를 정수형 최소값으로 설정 한 뒤
반복문에서 c가 a보다 클 경우 기존 최댓값1을 최댓값2로 옮긴 후 c를 최댓값1로 설정한다.
c가 a보다 크지 않지만 b보다 클 경우 c를 최댓값2로 설정한다.

나름 최선의 방법을 찾았다고 생각한 뒤 다른 사람들의 답변을 비교해 보니 어마어마한 충격에 빠졌다.

한 줄로 깔끔하게 정리된 코드... 앞으로 갈길이 먼 듯 싶다...

profile
junior_developer

1개의 댓글

comment-user-thumbnail
2023년 8월 3일

헛 감기는 좀 괜찮으세요? ㅠㅠ 잘 봤습니다.저에게 선행학습이 되었습니다.

답글 달기