class Solution {
public boolean solution(String s) {
boolean answer = true;
for(int i=0; i<s.length();i++){
if(s.charAt(i)>57){
answer = false;
}
}
return answer;
}
}
확인해야 할 조건이 두 가지인데 하나를 아예 빠뜨렸다.
💡 간단해 보이는 문제일수록 조건을 빠뜨리기 쉽다.
코드 작성 전에 체크해야 할 조건을 먼저 리스트업하고 시작하자.
숫자의 ASCII 범위는 48('0') ~ 57('9') 인데, 처음엔 위쪽(> 57)만 막았다.
// ❌ 위쪽만 막음
if(s.charAt(i) > 57)
// ❌ 양쪽을 막았지만 범위가 틀림
if((s.charAt(i)-'0') <= 10 && (s.charAt(i)-'0') >= 0)
// ✅ 올바른 ASCII 범위 체크
if((s.charAt(i)-'0') <= 9 && (s.charAt(i)-'0') >= 0)
예시: !의 ASCII는 33 → > 57 조건을 그냥 통과해버림
"길이가 4 혹은 6이 아니면 false" 를 코드로 옮기는 과정에서 여러 번 틀렸다.
// ❌ 동시에 4이면서 6일 수 없음 → 항상 false
if(s.length() == 4 && s.length() == 6)
// ❌ 항상 true → 모든 길이에서 return false
if(s.length() != 4 || s.length() != 6)
// ✅ 정답
if(s.length() != 4 && s.length() != 6)
💡 드모르간 법칙:
!(A || B)=!A && !B
"4 또는 6이다"의 부정 = "4가 아니다 AND 6이 아니다"헷갈리면 실제 값을 직접 대입해서 참/거짓을 따져보자.
class Solution {
public boolean solution(String s) {
if(s.length() != 4 && s.length() != 6){
return false;
}
for(int i=0; i<s.length(); i++){
if(!Character.isDigit(s.charAt(i))){
return false;
}
}
return true;
}
}
| 포인트 | 내용 |
|---|---|
| 길이 조건 | s.length() != 4 && s.length() != 6 |
| 숫자 판별 | Character.isDigit(c) |
| 조기 리턴 | 조건 불만족 시 즉시 return false |
Character.isDigit() 을 쓰자ASCII 계산으로 직접 비교하는 것보다 Character.isDigit() 이 훨씬 가독성이 좋다.
문자 관련 판별은 Character 클래스를 먼저 찾아보는 습관을 들이자.
// ❌ ASCII 직접 계산 → 의도 파악이 어렵다
(s.charAt(i)-'0') <= 9 && (s.charAt(i)-'0') >= 0
// ✅ Character 클래스 활용 → 한눈에 읽힌다
Character.isDigit(s.charAt(i))
간단해 보이는 문제일수록 조건을 빠뜨리기 쉽다.
코드 작성 전 30초만 투자해서 조건을 먼저 정리하고 시작하자.