어흥

[Leetcode] String to Integer (atoi) (C++) 본문

카테고리 없음

[Leetcode] String to Integer (atoi) (C++)

라이언납시오 2023. 8. 11. 14:00
728x90
반응형

문제 링크: https://leetcode.com/problems/string-to-integer-atoi/description/?envType=list&envId=rdlarbki 

 

String to Integer (atoi) - LeetCode

Can you solve this real interview question? String to Integer (atoi) - Implement the myAtoi(string s) function, which converts a string to a 32-bit signed integer (similar to C/C++'s atoi function). The algorithm for myAtoi(string s) is as follows: 1. Read

leetcode.com

1. 주의할 점

- stoi나 stol을 사용하면 범위를 벗어난 숫자가 있을 수 있으니 사용하지 않는다

- 양수/음수 여부는 따로 저장한다

- leading whitespace 뿐만 아니라 leading zero도 처리한다

 

2. 구현

- 본문에 적힌 순서대로 구현하면 된다(주석으로 각 요청에 맞는 번호를 적었다)

- 공백이 아닌 문자가 나올때까지 idx++를 진행한다

- 공백 이후의 문자가 부호라면 positive를 통해 저장한다(부호가 없을때를 대비해서 positive의 default는 true로 설정한다)

- 숫자라면 number String에 계속해서 저장한다. 단, leading zero를 의식해서 구현한다

- intMax와 intMin을 통해 number 문자열을 비교하여 각 범위를 벗어난다면 intMax와 intMin으로 재설정되도록 한다

class Solution {
public:
    int myAtoi(string s) {
        string number ="";
        long long answer = 0;
        bool positive = true;
        int idx = 0, len = s.size();
        //1
        while(idx<len){
            char c = s[idx];
            if(c==' ') idx++;
            else break;
        }
        //2
        if(idx<len){
            if(s[idx]=='-'){
                positive = false;
                idx++;
            }
            else if(s[idx]=='+'){
                idx++;
            }
        }

        //3
        while(idx<len){
            char c = s[idx];
            if('0'<=c && c<='9') {
                idx++;
                //4
                if(number=="" && c=='0') continue;
                number+=c;
            }
            else break;
        }
        
        //5
        if(number.size()>0){
            string intMax = "2147483647";
            string intMin = "2147483648";
            if(positive){
                if(number.size()>intMax.size() || (number.size()==intMax.size() && number >= intMax)){
                    answer = INT_MAX;
                }
                else answer = stol(number);
            }
            else{
                if(number.size()>intMin.size() ||  (number.size()==intMin.size() && number >= intMin)){
                    answer = INT_MIN;
                }
                else answer = stol(number)*-1;
            }
        }
        return answer;
    }
};
728x90
반응형
Comments