코틀린/코딩테스트

코딩테스트 [삼각형의 완성조건 (1)]

정혜현 2024. 6. 25. 11:10

문제

선분 세 개로 삼각형을 만들기 위해서는 다음과 같은 조건을 만족해야 합니다.

  • 가장 긴 변의 길이는 다른 두 변의 길이의 합보다 작아야 합니다.

삼각형의 세 변의 길이가 담긴 배열 sides이 매개변수로 주어집니다. 세 변으로 삼각형을 만들 수 있다면 1, 만들 수 없다면 2를 return하도록 solution 함수를 완성해주세요.

 

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

 

 


 

풀이

1. 접근

1.1 관찰

배열 내 최댓값과 나머지 값의 합을 비교해 반환하는 문제

입력 : 배열(정수) 

출력 : 정수

 

1.2 계획 

두 값의 합보다 최댓값이 작아야만 성립하는 조건이므로 같을 때도 제외한다.

최댓값 구하기 : max()

나머지 값의 합과 비교하기 : if문으로 조건걸기. 최댓값에서 나머지 값을 빼서 확인하기

반환하기 : 0보다 크면 1을 그렇지 않으면(0보다 크거나 같으면) 2를 반환하기

 

 

 

 

 

2. 시행착오

2.1 시도

 

class Solution {
    fun solution(sides: IntArray) : Int {
        if (sides.max() - (sides.sum() - sides.max()) < 0) return 1
        else return 2
    }
}

 

검증결과 : 실패. max()를 참조할 수 없다는 오류

 

/Solution.kt:3:19: error: unresolved reference: max
        if (sides.max() - (sides.sum() - sides.max()) > 0) return 1
                  ^
/Solution.kt:3:48: error: unresolved reference: max
        if (sides.max() - (sides.sum() - sides.max()) > 0) return 1
                                               

원인분석 : IntArray에서 max()가 사라졌다...?

@DeprecatedSinceKotlin("1.4", "1.5", "1.6") fun IntArray.max(): Int?
(source)

Deprecated: Use maxOrNull instead.

 

2024. 06. 28

이에대한 설명은 아래 링크에 나와있다. 

https://hhyun-s2.tistory.com/91

 

 

해결방안 : 최댓값을 찾을 때 자주 쓰던 패턴대로 내림차순하면 풀 수는 있다.

class Solution {
    fun solution(sides : IntArray): Int {
        sides.sortDescending()
        if (sides[0] - (sides[1] + sides[2]) < 0) return 1
        else return 2      
    }
}

 

그러나 특정 방법에 고착되는 게 싫어서 최댓값 메소드를 사용하고 싶었다. maxOrNull로 대체하라는데 Null처리를 하지 않으면 오류가 뜬다. 스크럼에서 공유했더니 팀원분께서 maxOf()를 알려주셨다. 

 

처음에 .maxOf()로 썼는데 안돼서 알고보니 maxOf는 메소드가 아니라 고차함수다. 파라미터가 있기 때문에 ()안에 인자를 넣어주거나 {}안에 람다식으로 넣어줘야 한다. it이 sides의 요소를 순회하면서 최댓값을 찾아 그대로 반환한다.

class Solution {
    fun solution(sides: IntArray) : Int {
        if (sides.maxOf{it} - (sides.sum() - sides.maxOf{it}) < 0) return 1
        else return 2
    }
}

 

 

maxOf<T : Comparable<T>>
첫번째 인자를 초기값으로 설정하고 나머지 인자와 비교해 더 큰 값으로 업데이트하여 최댓값을 반환하는 함수.
가변인자를 허용하며 코틀린 표준 라이브러리에 포함된 함수. 최적화된 네이티브 코드로 구현돼서 빠르고 효율적으로 동작한다.

 


회고

 

 

https://hhyun-s2.tistory.com/75 에서는 toStriong()을 했지만 for문에서 변환된 상태가 적용되지 않았는데 여기서는 sortDescending()으로 내림차순된 상태로 if가 실행된다. 반복문이라 첫회만 변환이 적용되고 다음 회차부터는 적용이 안된걸까 싶었는데 처음부터 안된거였고 알고보니 출력형태의 차이였다. 해당 본문도 수정했다. 

 

메소드만 있는 게 아니라 함수도 있다는 걸 처음 알았다.