문자열 s가 "숫자로만 이루어져 있고" + "길이가 4자리 또는 6자리"인지 판단하는 문제임.
처음 코드:
if(s.charAt(i)>47 && s.charAt(i)>57){
return false;
}else if(s.charAt(i)>16 && s.charAt(i)<41){
return false;
}
>47 && >57을 나란히 써놨는데, >57을 만족하는 값은 이미 자동으로 >47도 만족함. 즉 이 두 조건을 &&로 묶어봤자 >57이랑 똑같은 뜻이었음. "숫자가 아닌 것"을 걸러내려면 범위 밖을 표현해야 하는데, 부등호 방향을 안 뒤집고 그냥 갖다 붙인 게 문제였음.
또 >16 && <41이라는 조건도 근거 없이 넣었었는데, 이건 애초에 왜 넣었는지 스스로도 설명을 못 함. ASCII 표 확인 없이 감으로 숫자를 넣은 상태였음.
→ ASCII로 "숫자가 아니다"를 표현하려면 < '0'(48) || > '9'(57)처럼 범위 밖 양쪽을 ||로 묶어야 한다는 걸 다시 정리함.
int num = s.charAt(i)-0;
if(num<49 || num>58){
return false;
}
charAt(i)-0을 해버리면 문자의 ASCII 코드값 그대로 나옴 ('0'은 48). 그런데 조건은 <49 || >58로 짜서, 정작 '0'(48)이나 '9'(57)처럼 진짜 숫자인 경우도 범위 밖으로 판정돼서 false가 튀어나오는 상황이었음.
→ println으로 실제 출력값을 찍어서 '0'~'9'가 정확히 48~57이라는 걸 눈으로 확인하고, 조건을 <48 || >57로 고침.
숫자 여부만 체크하고 있었고, "4자리 또는 6자리여야 한다"는 조건 자체가 코드에 없었음. 문제 조건을 다 나열하지 않고 바로 코딩부터 들어간 게 원인.
→ for문 들어가기 전에 길이부터 먼저 체크하도록 추가함. for문 안에 넣으면 매 반복마다 똑같은 길이 체크를 반복하게 되니 비효율적이라, 조건을 만족 안 하면 바로 return false로 끝내버리고 아예 for문에 진입하지 않게 함.
if(s.length()!=4 && s.length()!=6){
return false;
}
class Solution {
public boolean solution(String s) {
if (s.length() != 4 && s.length() != 6) {
return false;
}
for (int i = 0; i < s.length(); i++) {
int num = s.charAt(i) - 0;
if (num < 48 || num > 57) {
return false;
}
}
return true;
}
}
디버깅용으로 넣었던 System.out.println(num)이랑 안 쓰는 import java.lang.StringBuffer;는 최종 코드에서 제거함.
<하한 || >상한이지, 방향을 안 바꾸고 그대로 이어붙이면 원래 의도랑 다른 걸 걸러내게 됨println, 안 쓰는 import는 제출 전에 정리하는 습관 필요