본문 바로가기
개발노트/프로그래머스

프로그래머스 최대값만들기

by 시계속세상은아직돌아가는중 2023. 7. 28.

https://school.programmers.co.kr/learn/courses/30/lessons/120847

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

1. 1차 아이디어

fun main() {
    var nums: IntArray = intArrayOf(0, 31, 24, 10, 1, 9)
    var max:Int = nums[0]
    var secondMax = nums[0]
    var mul = 0

    for (i in 1..nums.size - 1) {
        if (nums[i] > max) {
            max = nums[i]
        }
    }
     nums = nums.filter { it != max }.toIntArray()
    for(i in 0 .. nums.size-1) {
        print("${nums[i]},")
    }
    for (i in 1..nums.size - 1) {
        if (nums[i] > secondMax) {
            secondMax = nums[i]
        }
    }
    mul = max * secondMax
    println("")
    println("$max * $secondMax =$mul")
}

 

 

첫 번째 아이디어로는 최대값을 for문으로 구한 뒤 filter를 이용해 max값을 삭제 후 다시 같은 반복문을 사용해 두 번째 최대값을 구해준 뒤 곱했다.

 

이렇게 하면 구동이 되고 당연히 정답으로도 나온다.

 

하지만 이를 더 단순히 할 수 없을까에서 나온 코드가 아래다

 

        var max: Int = nums[0]
        var secondMax: Int = nums[0]

        for (i in 1 .. nums.size-1) {
            if (nums[i] > max) {
                secondMax = max
                max = nums[i]
            } else if (nums[i] > secondMax) {
                secondMax = nums[i]
            }
        }

처음으로 들어온 인덱스1의 요소가 secondMax보다 크면 seondMax에 해당 값을 저장한다

->이 부분이 핵심이다.

 

처음부터 Max값에 저장하지 않는 이유는 두 번째 맥스값을 다시 탐색해야되는 내 첫 번째 아이디어로 돌아가야 되기 때문이다. 따라서 처음 for문이 돌아갔을 때 secoundMax값의 판정을 하는 것이 중요하다.

 

이후 들어올 num[i]가 secoundMax값보다 크다면

secondMax =Max로 secondMax값을 한 번 저장해서 보장해주고 이후 로직을 수행하기 위함이다.

이는 secondMax외에 다른 변수를 선언해서 보장을 해줘도 되지만(ex. save = max)

 

그렇게 하지 않고 secoundMax로 보장해줘도 작동하기 때문에 해당 보장을 secondMax로 보장해주었다.

 

 

 

예시배열 

var nums: IntArray = intArrayOf(0, 31, 24, 10, 1, 9)

를 해당 for문으로 돌려보자면

num[i] max secondMax
num[1] = 31 0 31
num[2] = 24 31 24
num[3] = 10 31 24
num[4] = 1 31 24
num[5] = 9 31 24

즉 내가 썼던 for문과 filter를 합친 것이 되었다.

또한 이전에 사용했던 for문에서는 불필요한 비교가 있었는데(max와 secoundMax는 둘 다 nums[0]이기 때문에 i가 0일때와 비교할 필요가 없다), 이에 대한 개선도 하였다.

 

또한 해당 배열일 곱할 때 idex를 탐색하지 않고 요소끼리 비교한 뒤 곱하도 되기 때문에 다시 한 번 리팩토링이 가능했다

 

        var max: Int = nums[0]
        var secondMax: Int = nums[0]

        for (i in nums) {
            if (i > max) {
                secondMax = max
                max = i
            } else if (i > secondMax) {
                secondMax = i
            }
        }