풀이
class Solution {
public boolean solution(String s) {
boolean answer = false;
int k=0;
if(s.length()==4 || s.length()==6){
for(int i=0; i<s.length(); i++){
if(s.charAt(i)>57){
k-=1;
}
}answer=(k<0)?false:true;
}
return answer;
}
}
풀이방법
0) 문제를 잘 읽어보자. 문자열s의 길이가 4 또는 6 일때의 true조건이 있다.
1) charAt()메서드로 문자열s를 for반복하여 아스키코드57(숫자9)보다 큰 값(알파벳은 64이상)을 음수(-)로 만들어 음수일 때 false를 출력하도록 했다.
다른 사람 풀이 [1]
class Solution {
public boolean solution(String s) {
if(s.length() == 4 || s.length() == 6){
try{
int x = Integer.parseInt(s);
return true;
} catch(NumberFormatException e){
return false;
}
}
else return false;
}
}
위의 풀이법은 try catch문으로 예외를 발생시켜 T/F를 판별하는 참신한?방법을 사용했는데
댓글에 "Effective Java"라는 이야기가 있어서 찾아보니
책에서 말하는 '예외'는
1. 예외는 진짜 예외 상황에만 적용하라
2. 복구가능한 상황에는 검사예외를 프로그래밍 오류에는 런타임 예외를 사용하라
3. 메서드가 던지는 모든 예외를 문서화하라
4. 예외의 상세 메세지에 실패 관련 정보를 담아라
5. 가능한 실패원자적으로 만들어라
라는 내용이 있었고, 해당 풀이는 1번 사항에 위배됨을 알 수 있었다.
(하지만 정말 참신한 접근이었다. 마치 절대 열어선 안되는 상자를 연 판도라처럼...)
결론은 흐름제어에 예외처리 사용은 '금기'시 된다.
다른 사람 풀이[2]
class Solution {
public boolean solution(String s) {
return (s.length() != 4 && s.length() != 6) || (s.split("[0-9]").length > 0) ? false:true;
}
}
위 풀이 방법은 split()에 대한 지식이 얄팍했음을 깨우치게했다.
프로그래머스에서 특히 애용하던? split()을 단일 문자로 자를줄만 알았지
"[0-9]"와 같은 정규식을 사용해서 문자와 정수를 분리해낼 수 있다는 생각을 못했다.
처리 속도면에서는 내 풀이가 더 빠르지만, 간결함과 더불어 정규표현식까지 배울점이 많은 풀이임은 틀림없다.