https://school.programmers.co.kr/learn/courses/30/lessons/12918
문자열의 길이가 4 또는 6이며 숫자로만 구성돼있는지 판별.
- 풀이 1
class Solution { fun solution(s: String): Boolean {
if (s.length != 4 && s.length != 6) return false
try {
s.first { it > '9' }
} catch (e: Throwable) {
return true
}
return false }
}
first를 사용해봤다. 조건에 맞는 첫 원소를 반환하는데, 조건에 해당하는 원소가 없으면 예외를 던진다. try catch 문으로 판별했다.
- 풀이 2
class Solution { fun solution(s: String): Boolean {
if (s.length != 4 && s.length != 6) return false
s.forEach { if (it > '9') return false }
return true }
}
정석적인 풀이다. forEach로 전체에 대해서 조건에 맞지 않으면 false를 반환했다.
- 참고 풀이 3
class Solution { fun solution(s: String): Boolean =
(s.length == 4 || s.length == 6) && s.all { it.isDigit() }
}
다른 풀이를 살펴보니 all이란 메서드가 있었다. 모든 원소에 대해 조건을 만족하는지를 판별한다. 불리언으로 반환되므로 if 필요없이 그대로 반환해줬다.
all과 유사한 메서드가 더 있는지 찾아보았다.
all: 모든 원소가 조건에 맞으면 참.
any: 조건에 맞는 원소가 하나라도 있으면 참.
none: 조건에 맞는 원소가 없으면 참.
contains: 주어진 원소를 포함하면 참.
containsAll: 주어진 원소들을 모두 포함하면 참.
다만 containsAll은 리스트나 셋 등 Collection<T> 타입에만 사용할 수 있다. 매개변수 역시 마찬가지이다. 다만 매개변수는 원본과 다른 타입의 컬렉션이어도 괜찮다. (참고로 배열은 Collection이 아니다!)
(contains는 any의 단순화 버전?이라고 생각할 수 있겠다.)
contains는 그대로 indexOf를 호출한다. 그 결과가 0 이상이면 true를 반환하는 것이다.
any와 none은 매개변수 없이 사용하면 각각 !isEmpty()와 isEmpty() 이다. (iterator().hasNext() 와도 같다.)