본문 바로가기
2023년 이전/Codility

Lesson6 - Triangle

by JeongUPark 2019. 12. 16.
반응형

자세한 문제는 여기서 확인해주시면 됩니다.

 

문제는 N사이즈의 Int형 array에 있는 값 3개를 뽑아서 (0 ≤ P < Q < R < N)

 

P+Q > R

Q+R > P

P+R > Q

 

이 가능하면 return 1 아니면 return 0을 하는 문제입니다.

 

처음에는 단순히 가운데 값 3개를 골라서 가능할 경우 1 아닐 경우 0면 될 줄 알았습니다. 그 code는 다음과 같습니다.

fun solution(A: IntArray): Int {
    // write your code in Kotlin
    if(A.size == 0 || A.size == 1 || A.size == 2) return 0
    val mid = A.size/2
    A.sort()
    val p = A[mid-1]
    val q =A[mid]
    val r = A[mid+1]
    var check_1 = false
    var check_2 = false
    var check_3 = false
    if(p+q > r){
        check_1 = true
    }
    if(q+r > q){
        check_2 = true
    }
    if(r+p >q){
        check_3 = true
    }

    if(check_1 && check_2&& check_3) {
       return 1
    }else{
       return 0
    }
    
}

하지만 결과는 0%!

머가 문제일까 고민을 해봤는데 Int형 Array에 같은 값이 3개 있을 경우에도 가능하다는 것이 떠올라 서 그 code를 추가하였습니다

fun solution(A: IntArray): Int {
    if(A.size == 0 || A.size == 1 || A.size == 2){
        return 0
    }
    A.sort()
    var count  = 1
    var check_num = A[0]
    for(i in 1 until A.size){
        if(check_num == A[i]){
            count++
        }else{
            check_num = A[i]
        }
    }

    if(count >= 3){
        return 1
    }

    val mid = A.size/2
    val p = A[mid-1]
    val q =A[mid]
    val r = A[mid+1]
    var check_1 = false
    var check_2 = false
    var check_3 = false
    if(p+q > r){
        check_1 = true
    }
    if(q+r > q){
        check_2 = true
    }
    if(r+p >q){
        check_3 = true
    }

    if(check_1 && check_2&& check_3) {
        return 1
    }else{
        return 0
    }
}

하지만 그 결과는 ... 75% ... 머가 문제일까 계속 고민을 하다 머가 문제일까 해서 결과에 나온 문제점을 확인 해봤더니 음수에 대한 처리를 안했었습니다.

 

그래서 그에 관련된 처리를 했습니다. 모든 값이 음수일 경우 사실 멀 해도 위의 조건은 만족 시킬 수 없기 때문에 모든 값이 음수일 경우에는 return 0을 하면 됩니다.

 

fun solution(A: IntArray): Int {
if(A.size == 0 || A.size == 1 || A.size == 2){
        return 0
    }
    A.sort()
    if(A[A.size-1] <0){
        return 0
    }
    
    var count  = 1
    var check_num = A[0]
    for(i in 1 until A.size){
        if(check_num == A[i]){
            count++
        }else{
            check_num = A[i]
        }
    }

    if(count >= 3){
        return 1
    }

    val mid = A.size/2
    val p = A[mid-1]
    val q =A[mid]
    val r = A[mid+1]
    var check_1 = false
    var check_2 = false
    var check_3 = false
    if(p+q > r){
        check_1 = true
    }
    if(q+r > q){
        check_2 = true
    }
    if(r+p >q){
        check_3 = true
    }

    if(check_1 && check_2&& check_3) {
        return 1
    }else{
        return 0
    }
}

이렇게 했을 때 결과가 100%가 나왔습니다.

 

근데  이게 생각해보면 이상한게 제 알고리즘에 문제점은 음수 양수가 섞여있을 때 제대로 동작하지 않을 텐데... 이게 100%라니 codility도 정해진 예에 대한 결과만 제대로 나오면 100%가 되는 것을 알 수 있엇습니다.

반응형

'2023년 이전 > Codility' 카테고리의 다른 글

Lesson8 - Dominator  (0) 2020.01.06
Lesson7 - Brackets  (0) 2019.12.19
Lesson 6 - Distinct  (0) 2019.12.14
Lesson6 - MaxProductOfThree  (0) 2019.12.13
Lesson5 - CountDiv  (0) 2019.12.13