문자열 다루기 기본

나의 기록·2026년 8월 20일

코딩테스트

목록 보기
35/35

문제

프로그래머스 - 카드 번호 유효성 검사 (Lv.1)

문자열 s가 "숫자로만 이루어져 있고" + "길이가 4자리 또는 6자리"인지 판단하는 문제임.

시행착오 1 - ASCII 비교 조건을 잘못 짬

처음 코드:

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)처럼 범위 밖 양쪽을 ||로 묶어야 한다는 걸 다시 정리함.

시행착오 2 - 문자 → 숫자 변환 시 기준값을 잘못 뺌

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로 고침.

시행착오 3 - 길이 조건이 아예 빠져있었음

숫자 여부만 체크하고 있었고, "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;는 최종 코드에서 제거함.

배운 점

  • 문제 조건은 코딩 시작 전에 전부 나열해야 함. 이번엔 "숫자로만 구성" 조건에만 꽂혀서 "길이 4 또는 6" 조건을 통째로 빼먹었음
  • ASCII로 "범위 밖"을 표현할 땐 부등호 방향에 주의해야 함. "이 범위 안이 아니다"는 <하한 || >상한이지, 방향을 안 바꾸고 그대로 이어붙이면 원래 의도랑 다른 걸 걸러내게 됨
  • 근거 없이 숫자를 넣지 말고, ASCII 표든 실제 출력값이든 확인하고 조건을 짜야 함
  • 디버깅용 println, 안 쓰는 import는 제출 전에 정리하는 습관 필요
profile
뭐든 남겨본다

0개의 댓글