본문 바로가기

코딩 연습

프로그래머스(문자열 다루기 기본)

문제 설명
문자열 s의 길이가 4 혹은 6이고, 숫자로만 구성돼있는지 확인해주는 함수, solution을 완성하세요. 예를 들어 s가 "a234"이면 False를 리턴하고 "1234"라면 True를 리턴하면 됩니다.

제한 사항
s는 길이 1 이상, 길이 8 이하인 문자열입니다.
s는 영문 알파벳 대소문자 또는 0부터 9까지 숫자로 이루어져 있습니다.

 

입출력 예
    s       return
"a234"   false
"1234"   true


1. 문자열의 길이 4, 6을 확인

2. 문자열 길이가 4, 6일 때 s의 문자열을 순회하여 숫자인지 확인(아스키 코드를 이용함)

3. s의 원소(문자)가 숫자면 1을, 아니면 0을 곱함(true = 1, false = 0 을 이용함) 

#include <string>
#include <vector>

using namespace std;

bool solution(string s)
{
    bool answer = false; // 기본이 false
    int num = 1;

    if (s.length() == 4 || s.length() == 6) // 문자열 길이 4, 6 먼저 확인
    {
        for (auto str : s) // s를 순회
        {
            if (str >= 48 && str <= 57) // ASCII코드 48~57 = 숫자 0~9
            {
                num *= 1;
            }
            else
            {
                num *= 0;
            }
        }
    }
    answer = num;

    return answer;
}

위 코드처럼 하니 어떤 상황에서는 실패가 떴다.

로직상 문제는 없어 보이지만 num은 int, answer는 bool 타입 이여서 대입할 때 뭔가 문제가 일어나는 것 같다.

그래서 num을 사용하지 않고 기본이 true고 조건에 만족하지 않는 상황에서 false를 반환하도록 구현했다.

#include <string>
#include <vector>

using namespace std;

bool solution(string s)
{
    bool answer = true; // 기본이 true
    
    if(s.length() != 4 && s.length() != 6) // 문자열 길이 4, 6 아니면 false
    {
        return false;
    }
    
    for(auto str : s) // s 문자열 순회
    {
        if(str < '0' || str > '9') // ASCII 코드를 이용
        {
            return false;
        }
    }
    
    return answer;
}

위처럼 하니 로직은 바뀐게 없지만 해결이 됐다.