문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.
s
는 길이 1 이상, 길이 8 이하인 문자열입니다.s
는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.최종코드
class Solution {
fun solution(s: String): Boolean {
fun checklength (s : String) : Boolean {
return s.length ==4 || s.length ==6
}
fun checkOnlyNumber (s : String): Boolean {
val regex = Regex("\\d+")
return s.matches(regex)
}
return checklength(s) && checkOnlyNumber(s)
}
}
풀이 과정
1. 일단은 문제를 보고 어떻게 코드 짤까 생각했는데 검사할 사항이 두가지니까 각각을 검사할 함수를 만들고 둘다 만족하면 true 리턴하게 해야겠다 생각했음
fun checklength(s:String) : Boolean {
if(s.length==4 || s.length==6){
answer = true}
else{
answer = false
}
fun checkOnlyNumber(s:String): Boolean {
val regex = Regex("\\d")
if(s.matches(regex)){
answer = true
}else{
answer = false
}
}
그래서 원래는 검사하는 함수를 각각 이렇게 작성했었다.
길이 검사는 그냥 s.length 를 활용해서 간단하게 만들어주고,
숫자만 있는지 검사하는 함수는 원래 for 문으로 하나씩 검사해야하나? 생각하다가 Regex를 활용하고싶어서 구글링으로 찾아보니까 matches 라는 함수가 있길래 이거써봐야지 하고 사용해서 작성함!
2. 코드 간결하게 수정
fun checklength (s : String) : Boolean {
return s.length ==4 || s.length ==6
}
fun checkOnlyNumber (s : String): Boolean {
val regex = Regex("\\d")
return s.matches(regex)
}
근데 1번처럼 if else문 다 써서 작성하니까 쓸데없이 길다고 생각돼서
다른 사람들은 다 최대한 간단하게 쓰려고 노력하는 거 같으니까 나도 코드를 더 간결하게 바꿔줌
if else 를 삭제하고 그냥 바로 조건 만족하면 true 리턴하게 바꿔줬당 아직 근데 이렇게 줄여서 쓰는게 익숙하지 않은듯. 약간 풀면서 제발.. 이거 맞겠지? 되어라!!! 이런느낌으로 함ㅎㅎ 슈발
근데 이렇게 했더니 코드 에러는 안나는데 걍 테스트 2번을 통과못함!
뭔가 Regex 문제라고 생각했음 왜냐면 Regex 표현식 쓰는거에 제일 자신이 없었기때문
3. Regex 표현식 수정
fun checklength (s : String) : Boolean {
return s.length ==4 || s.length ==6
}
fun checkOnlyNumber (s : String): Boolean {
val regex = **Regex("\\d+")**
return s.matches(regex)
}
그래서 내가 Regex 정리해놨던 자료를 다시 보면서 뭐가 잘못됐을까 고민하다가
“+” 를 붙여봄 사실 {4,6} 을 붙이는게 맞나? 막 자신 없는 중에 하나씩 해보려고했는데
더하기 붙이니까 통과해서 그냥 이대로 했음
4. 두개 조건 만족하면 true 나오게 코드 추가
class Solution {
fun solution(s: String): Boolean {
fun checklength (s : String) : Boolean {
return s.length ==4 || s.length ==6
}
fun checkOnlyNumber (s : String): Boolean {
val regex = Regex("\\d+")
return s.matches(regex)
}
**return checklength(s) && checkOnlyNumber(s)**
}
}
마지막으로 두개 함수에 s 넣고 둘다 true면 true 나오게 해줬당
1. 숫자인지 검사를 s.toIntOfNull로 할 수 있음
class Solution {
fun solution(s: String) = (s.length == 4 || s.length == 6) && s.toIntOrNull() != null
}
힘들게 Regex 식 고민할 거없이 그냥 s를 toInt 해버릴수도있었나봄
나는 이게 s 중에 문자가 포함된 애들도 있으니까 오류가 날거라고 생각했었는데
아니였나봄! 짱 간단하게 풀수있었군요!
2. filter 함수 사용
class Solution {
fun solution(s: String): Boolean
{
val length = s.filter { it.isDigit() }.length
return (length == 4 || length == 6) && length == s.length
}
}
변수를 하나 만들어서 s 에서 숫자인 것만 골라내서 그것의 길이를 저장하고
length가 4,6 이고 length가 본래 문자열 s의길이와 같으면 true를 리턴하게 하는 식으로 해결한 코드
옹.. 뭔가 나보다 쪼금 더 고차원적으로 생각해서 푼느낌이든다
StringType
.toIntOrNull() 이 다 숫자가 아닌 문자열에서도 사용가능하다는거