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
}
}
'개발노트 > 프로그래머스' 카테고리의 다른 글
인덱스 바꾸기 코틀린 (0) | 2023.07.31 |
---|---|
대문자와와 소문자 코틀린 (0) | 2023.07.31 |
중복된 문자 제거하기 코틀린 (0) | 2023.07.31 |
문자열 정렬하기(1) 코틀린 (0) | 2023.07.31 |
프로그래머스 점위치 (0) | 2023.07.28 |