본문 바로가기
Problem solving/LeetCode

[LeetCode] 8. String to Integer (atoi) (C++)

by 겸 2023. 6. 23.

문제

문자열을 정수로 바꾸기

  • 조건
    • 공백은 제외
    • -, +문자는 양수인지 음수인지를 의미
    • 다음에 오는 문자가 정수가 아닐 경우 끝을 의미
    • 자릿수 앞에 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;
    }
};
반응형