문제
각에서 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
//반환값 이하는 작성하지 않는다
}
}
'코틀린 > 코딩테스트' 카테고리의 다른 글
코딩테스트 [배열 두배 만들기] (0) | 2024.06.07 |
---|---|
코딩테스트 [분수의 덧셈] (0) | 2024.06.07 |
코딩테스트 [나이 출력] (0) | 2024.06.05 |
코딩테스트 [숫자 비교하기] (0) | 2024.06.04 |
코딩테스트 [나눗셈] (0) | 2024.06.04 |