Algorithm/LeetCode

[LeetCode # 65] Valid Number

꼽냥이 2021. 5. 21. 18:13
반응형

Valid Number 는 주어진 문자열이 문제의 조건에 맞는 지 확인하는 문제이다.

문제에서 주어진 확인해야 하는 조건은 다음과 같다.

 

1. 전체 문자열이 Decimal Number / Integer 로 구성되었는가.

(Optional) 지수 표현을 위한 'e' / 'E' 가 등장했을 때 해당 문자 뒤로 Integer 가 나타나는가.

 

2. Decimal Number 는 부호('+' / '-') 와 소수로 주어진다. 소수는 다음의 3가지 포맷 중 하나이다.

2-1. 하나 이상의 Digit 과 소수점 ex) "2."

2-2. 소수점과 하나 이상의 Digit ex) ".2"

2-3. 하나 이상의 Digit 과 소수점, 그리고 다시 하나 이상의 Digit ex) "2.2"

 

3. Integer 는 부호('+' / '-') 와 하나 이상의 Digit 으로 이루어진다.

 

이 조건을 모두 만족하면 함수의 결과값으로 true 를 반환하고, 만족하지 못할 경우 false 를 반환한다.

 

문제의 해결 방식은 지수 표현을 위한 부분과 그렇지 않은 부분을 나눠서 조건을 검사하는 것이었다.

우선, 문자열의 시작부터 탐색을 하며 문자열이 Sign 과 Digit 으로만 이루어져 있는지를 확인한다.

이 때 Dot 이 문자열에 등장한 경우 Dot 의 개수를 저장해 놓는다. 하나의 Valid Number 가 가질 수 있는 Dot 의 개수는 한 개이다.

또한 지수 문자 'e' / 'E' 가 등장하기 전까지 Digit 의 개수가 최소 1개는 등장해야 하므로 이를 확인한다.

 

지수 표현을 위한 부분은 위와 유사하게 지수 문자 'e' / 'E' 의 뒤에 Digit 만이 존재하고, Digit 이 한 개 이상 존재하는 지를 확인한다.

마지막으로 Index 가 문자열의 끝에 도달했는 지를 확인하면 주어진 문자열이 Valid Number 인지 확인할 수 있다.

 

소스 코드는 다음과 같다.

class Solution {
public:
    bool isDecimal(char c) {
        return c >= '0' && c <= '9';
    }

    bool isSign(char c) {
        return c == '+' || c == '-';
    }

    bool isNumber(string s) {
        int i = 0;
        while (s[i] == ' ')
            i++;
        if (isSign(s[i]))
            i++;

        int decimal = 0, dot = 0;
        while (isDecimal(s[i]) || s[i] == '.'){
            if (s[i] == '.'){
                dot++;
            } else {
                decimal++;
            }
            i++;
        }

        if (dot > 1 || decimal < 1)
            return false;

        if (s[i] == 'e' || s[i] == 'E'){
            i++;
            if (isSign(s[i]))
                i++;

            decimal = 0;
            while (isDecimal(s[i])){
                decimal++;
                i++;
            }

            if (decimal < 1)
                return false;
        }

        return s[i] == '\0';
    }
};