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';
}
};
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode # 29] Divide Two Integers (0) | 2021.05.31 |
---|---|
[LeetCode # 25] Reverse Nodes in k-Group (0) | 2021.05.31 |
[LeetCode # 62 ~ 64] 문제 풀이 (0) | 2021.05.03 |
[LeetCode # 58, 59, 61] 문제 풀이 (0) | 2021.04.28 |
[LeetCode # 55 ~ 57] 문제 풀이 (0) | 2021.04.07 |