코틀린/코딩테스트

코딩테스트 [각도기]

정혜현 2024. 6. 5. 12:31

문제

각에서 0도 초과 90도 미만은 예각, 90도는 직각, 90도 초과 180도 미만은 둔각 180도는 평각으로 분류합니다. 각 angle이 매개변수로 주어질 때 예각일 때 1, 직각일 때 2, 둔각일 때 3, 평각일 때 4를 return하도록 solution 함수를 완성해주세요.

 


 

풀이

1. 접근

1.1 관찰

기능 : 4개의 각(예각, 직각, 둔각, 평각) 중에 해당되는지 확인한다. 

반환 : 해당되는 각의 숫자를 리턴한다.

보자마자 이건 when문이다!!! 

 

 

 

 

 

2. 시행착오

2.1 시도

  • 가설 : when문에 논리연산자로 각 범위를 지정하면 성공할 것이다.
  • 검증 : 실패했다.

/Solution.kt:6:13: error: expecting an expression
            ==90 -> 2
            ^
/Solution.kt:6:13: error: expecting '->'
            ==90 -> 2
            ^
/Solution.kt:6:18: error: expecting an expression, is-condition or in-condition
            ==90 -> 2
                 ^
/Solution.kt:8:13: error: expecting an expression
            ==180 -> 4
            ^
/Solution.kt:8:13: error: expecting '->'
            ==180 -> 4
            ^
/Solution.kt:8:19: error: expecting an expression, is-condition or in-condition
            ==180 -> 4
                  ^
/Solution.kt:5:13: error: incompatible types: Boolean and Int
            0<angle<90 -> 1
            ^
/Solution.kt:5:21: error: the integer literal does not conform to the expected type Boolean
            0<angle<90 -> 1
                    ^
/Solution.kt:7:13: error: incompatible types: Boolean and Int
            90<angle<180 -> 3
            ^
/Solution.kt:7:22: error: the integer literal does not conform to the expected type Boolean
            90<angle<180 -> 3
                     ^

class Solution {
    fun solution(angle: Int): Int {
        var answer: Int = 0
        when(angle){
            0<angle<90 -> 1
            ==90 -> 2
            90<angle<180 -> 3
            ==180 -> 4
        }      
        return answer
    }
}

 

when문의 문법상 두 가지가 잘못됐다는 피드백을 받았다. 

1. 조건 앞 기본적으로 '=='연산자가 들어가있는 형태.  '==90', '==180'은 잘못된 문법이다.

2. 현재상태에서 비교연산자를 쓸 수 없다. 범위를 지정하고 싶다면 in until이나 in ..으로 지정해야한다.

 

피드백 받은대로 수정해보겠다.

 

 

2.2 재시도

  • 가설 : ==연산자를 없애고 범위를 in until이나 in ..으로 설정하면 성공할 것이다.
  • 검증 : 성공했다.
class Solution {
    fun solution(angle: Int): Int {
        var answer: Int = 0
        when(angle){
            in 1 until 90 -> answer = 1
            90 -> answer = 2
            in 90 .. 179 -> answer = 3
            180 ->answer = 4
        }      
        return answer
    }
}

 

+ 2024.06.11

https://hhyun-s2.tistory.com/50 에서 깨달은대로 동화하여 검증해보았다.

연산자를 쓰고 싶으면 when 옆에 조건을 없애면 된다. 다만 중복이 많아 좋은 코드는 아니다.

class Solution {
    fun solution(angle: Int): Int {
        var answer: Int = 0
        when{
            angle >= 1 && angle < 90 -> answer = 1
            angle == 90 -> answer = 2
            angle >= 90 && angle < 179 -> answer = 3
            angle == 180 ->answer = 4
        }      
        return answer
    }
}

 

 

 

 

 

2.3 추가검증

if문으로도 시도해보고 싶어졌다.

  • 가설 : if문에 논리연산자로 각 범위를 지정하면 나올 것이다.
  • 검증 : 실패했다.

/Solution.kt:3:19: error: the integer literal does not conform to the expected type Boolean
       if(0<angle<90) {return 1}
                  ^
/Solution.kt:5:26: error: the integer literal does not conform to the expected type Boolean
        else if(90<angle<180) {return 3}
                         ^
/Solution.kt:7:5: error: a 'return' expression required in a function with a block body ('{...}')
    }
    ^

class Solution {
    fun solution(angle: Int): Int {
       if(0<angle<90) {return 1}
        else if(angle==90) {return 2}
        else if(90<angle<180) {return 3}
        else if(angle==180) {return 4}    
    }
}

 

코틀린에서는 비교연산자끼리 묶을 수 없다. 각각의 비교를 따로 처리하고 &&연산자로 연결해줘야한다. 피드백대로 if문의 조건부를 수정해본다.

 

  • 가설 : 각각 비교하고 &&연산자로 연결하면 성공할 것이다.
  • 검증 : 실패했다.

/Solution.kt:8:5: error: a 'return' expression required in a function with a block body ('{...}')
    }
    ^

class Solution {
    fun solution(angle: Int): Int {
       if(0 < angle && angle < 90) {return 1}
        else if(angle==90) {return 2}
        else if(90 < angle && angle < 180) {return 3}
        else if(angle==180) {return 4}    
    
    }
}

 

예외처리가 들어가지 않았기 때문이다. 제한사항으로 정수만 입력되게 설정해놨으므로 else 로 4를 return할 수도 있고, 무난하게 -1을 기본 return값으로 설정할 수 있다. 

 

class Solution {
    fun solution(angle: Int): Int {
    if(0 < angle && angle < 90) return 1
    else if(angle==90) return 2
    else if(90 < angle && angle < 180)return 3
    else if(angle==180) return 4  
    return -1
    }
}
class Solution {
    fun solution(angle: Int): Int {
    if(0 < angle && angle < 90) {return 1}
    else if(angle==90) {return 2}
    else if(90 < angle && angle < 180){return 3}
    else {return 4} 
    }
}

 

 

 

 

 


 

 

회고

 

when문과 if문에서의 특징 기억하기 

when문 : 기본적으로 '=='연산자가 들어가있는 형태. 범위는 in until이나 in ..으로 지정. when 옆에 조건이 있으면 비교연산자를 쓸 수 없다.
if문 : 비교연산자 그룹 불가능, 예외처리 필수(반드시 else를 써야하는 것은 아니지만 반드시 모든 경우를 처리할 수 있어야한다.)

 

 

 

 

 

 


 

★유능한 팀원 이강진님께서 특별과외 해주신 회차★

 

냉철하게 분석하지만 온화하게 설명해주시는 멘토님,, 닮고싶다,,

코드카타 시간동안 제대로 된 코드를 짜보기는 커녕 어디에 써야 되는지조차 헤매고 있던 나에게 

일반적인 코드의 작성위치를 알려주시려던 것이 선두였고 

오전 내내 틈틈이 봐주시며 큰 힘이 되어주셨다. 

 

훌륭한 개발자가 되면 오마카세로 보은을 약속.

class Solution {
    fun solution(angle: Int): Int {
        var answer: Int = 0
        //일반적으로 여기에 작성
        return answer
        //반환값 이하는 작성하지 않는다
    }
}