본문 바로가기

알고리즘

알고리즘 문제풀이 - 각도기

8. 프로그래머스 각도기

class Solution {
    fun solution(angle: Int): Int {
        var answer: Int = 0
        return answer
    }
}

초기 코드이다.

 

 

 

예각일 때, 직각일 때, 둔각일 때, 평각일 때 를 각각 구해야한다.

 

if와 else if 몇개를 쓰면 나올 거 같다.

 

근데 ~일 때이니 when이라는 조건도 사용가능 할거 같다.

 

 

 

 

 

 

 

 

 

 

 

 

 

  • When 활용하기

when (각도) {

          0<각도<90 -> 1

          각도=90 -> 2

          90<각도<180 -> 3

          else -> 4}

이렇게 집어 넣어보자. 근데 0<각도<90 -> 1 이거랑 90<각도<180 -> 3 이건 두개의 논리항을 사용한다.  

0<각도, 각도<90 이거랑 90<각도, 각도<180 이렇게 각각 두 개의 항이 있고 이 두 항을 모두 만족해야 하므로 논리곱 연산자를 같이 사용해보자. 

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

에러가 뜬다...

error: incompatible types: Boolean and Int

이 에러를 구글에서 찾아보았다. Boolean 값은 True나 False 두 개의 값만 가질 수 있다. 그래서 Int인 정수와 양립할 수 없다고 하는 에러인거 같다. 지금 생각해보니 논리연산자는 true와 false라는 값을 갖는데 그 자리에 angle을 넣어서 오류가 생겼다는 거 같다. 그래서 4번째 줄의 when(angle){ 에서 

angle 자리에 true로 정확한 값을 찾는다고 쓰거나 아예 (angle) 즉 괄호를 아예 없애 버리면 값이 제대로 나온다.

근데 이러면 너무 길다.

 

  • in 활용하기

when 식에서 in .. 을 사용하여 범위를 조절 할 수 있다. 따라서 angle은 Int 즉 정수 이므로 0도 이상이면 1부터 시작하니 in 1..89로 하면 1~89까지의 범위를 가질 수 있다. 이것까지 이용해보자. 근데 이 때에는 논리연산자를 사용하는 것이 아니라 진짜 값을 구할 수 있기에 ()괄호 안에 angle을 다시 넣어보자.

class Solution {
    fun solution(angle: Int): Int {
        val answer: Int = 0
        when (angle) { 
         in 1..89 -> return 1
         90 -> return 2
         in 91..179 -> return 3
         180 -> return 4}
        return answer
    }
}

 

  • 튜터님께 찾아가보기

결론적으로 굳이 모두 return이 들어가 있는 상태인데  return answer가 필요했느냐 라는 답변을 받았다. 그리고 문법 강의를 더 들어보라고 하셨다... 저기 위3번째 줄의 Int = 0이 answer에 박혀 있는데 0을 지우고 그대로 when절을 넣으면 answer에 값을 넣을 수 있다고한다. 또 지금 변하지 않는 상수인 val이 들어가 있으니 이거를 변하는 값인 var을 넣어보라고...그리고 answer 에 연결을 시켜줘야 한다고 강조하시고 answer = 1,2,3,4 도 써보라고 하셨다.

우선 answer 1234를 넣어서 answer에 연결시켜주자.

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

들어보니 굳이 return answer랑 3번째 줄이 필요치 않은거 같기도 하다.

자꾸 answer를 강조 하시는걸 보니 retrun answer를 return when이 되게끔 해봐야겠다.

class Solution {
    fun solution(angle: Int): Int {
        return when (angle) { 
         in 1..89 ->  1
         90 ->  2
         in 91..179 ->  3
         180 -> 4
         else -> 0}
    }
}

 

return 과 Int{}이 부분도 굳이 필요없는 부분 아닐까? 한번 빼 보자. 

class Solution {
    fun solution(angle: Int) = when (angle) { 
         in 1..89 ->  1
         90 ->  2
         in 91..179 ->  3
         180 -> 4
         else -> 0}
    }

내일은 우선 문법강의를 머리에 좀 박아 넣으면서 해야겠다.