문제
문자열을 정수로 바꾸기
- 조건
- 공백은 제외
- -, +문자는 양수인지 음수인지를 의미
- 다음에 오는 문자가 정수가 아닐 경우 끝을 의미
- 자릿수 앞에 0이 붙어있는 경우 무시
- 정수 범위에 속하지 않는 경우 -2^31이나 2^31 - 1로 고정
반례
입력 : "-91283472332”
생각하지 못했던 조건..!
sign을 return하기 전 마지막에 붙여서 int범위를 확인할 때 잘못된 값과 비교를 하게 되었다!
if (sign * res < INT_MIN / 10 ) return INT_MIN;
else if(sign * res > INT_MAX/10) return INT_MAX;
입력 : "+1”
문자 +는 그냥 무시해도 된다고 생각을 해서 조건에 넣지 않았더니 else에 걸려서 for문이 종료되었다.
else if(s[i] == '+' || s[i] == ' ')
입력 : "+-12”
출력이 0이 되는지 이해를 못했었다.
알고보니 문제 이해를 잘못했던 것이었다!
→ 문제의 조건이 처음에 공백 다 제외하고 처음 나온 제대로 된 수를 리턴해야 한다.
결과 코드
class Solution {
public:
int myAtoi(string s) {
int index = 0;
int sign = 1;
int res = 0;
// 공백 제거
while(s[index] == ' ') index++;
// 부호 판별
if(s[index] == '+') {
index++;
}
else if(s[index] == '-'){
sign = -1;
index++;
}
// 이후에 오는 문자가 숫자가 아니거나 결과가 int 범위를 벗어나는 경우 종료
// int 범위 -2147483648 ~ 2147483647
while(0 <= s[index] - '0' && s[index] - '0' <= 9) {
if (res > INT_MAX/10 || (res == INT_MAX/10 && s[index]-'0' > 7)) {
if(sign < 0) return INT_MIN;
else return INT_MAX;
}
res *= 10;
res += s[index] - '0';
index++;
}
return sign * res;
}
};
반응형
'Problem solving > LeetCode' 카테고리의 다른 글
[LeetCode] 13. Roman to Integer (C++) (0) | 2023.06.27 |
---|---|
[LeetCode] 11. Container With Most Water (C++) (0) | 2023.06.27 |
[LeetCode] 7. Reverse Integer (C++) (0) | 2023.06.23 |
[LeetCode] 5. Longest Palindromic Substring (C++) (0) | 2023.06.23 |