Chloe Jungah Kim
Chloe Jungah Kim
A blogger who writes about everything.

[Leetcode] 8. String to Integer (atoi)

https://leetcode.com/problems/string-to-integer-atoi/
[Leetcode] 8. String to Integer (atoi)

문자열이 주어졌을 때, 해당 문자열을 정수로 변환하는 문제

  • 문자열은 whitespace character, 숫자 및 문자로 구성된다.
  • 스페이스(‘ ‘)만이 whitespace character로 간주되며, 시작 부분을 포함하여 문자열 내에 많이 존재할 수 있다.
  • minus(‘-‘) 및 plus(‘+’) 기호로 숫자가 시작될 수 있다.
  • 첫 non-whitespace character가 숫자 및 ‘+’, ‘-‘가 아닐 경우, 0을 리턴
  • 32-bit signed integer(-2^31 ~ 2^31 - 1)를 기준으로 하여, 해당 범위를 넘는 경우 INT_MAX 혹은 INT_MIN을 리턴

Example 1

  • Input : s = “42”
  • Output : 42

Example 2

  • Input : s = “ -042”
  • Output : -42

Example 3

  • Input : s = “1337c0d3”
  • Output : 1337

Example 4

  • Input : s = “0-1”
  • Output : 0

Example 5

  • Input : s = “words and 987”
  • Output : 0

Solution 1

Note

  • strip() : 문자열 양쪽으로 한 칸 이상의 연속된 공백을 모두 지우는 함수
  • split() : 공백을 기준으로 문자열을 나누어 리스트로 반환
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution:
    def myAtoi(self, str: str) -> int:
        idx = 0
        s = str.strip().split()
        if len(s) == 0 : 
            return 0
        
        s = s[0]
        if s[0] == '+' or s[0] == '-' :
            idx = 1
        for ch in s[idx:] :
            if ch.isdigit() :
                idx += 1
            else :
                break
        
        res = s[:idx]
        res = int(res) if (res != '+' and res != '-' and res) else 0
        if res < -2 ** 31 :
            return -2 ** 31
        elif res > 2 ** 31 - 1 : 
            return 2 ** 31 - 1
        else :
            return res

Solution 2

Note

str을 한 문자씩 확인하면서 숫자를 찾는 방식으로 구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution:
    def myAtoi(self, str: str) -> int:
        res, idx, isminus = 0, 0, False
        intmax, intmin = 2 ** 31 - 1, -2 ** 31
        if not str :
            return 0
        for i in range(len(str)) :
            if str[i] != ' ' :
                idx = i
                break
        if str[idx] == '-' or str[idx] == '+' :
            isminus = True if str[idx] == '-' else False
            idx += 1
        for i in range(idx, len(str)) :
            if str[i].isdigit() :
                res = res * 10 + int(str[i])
            else :
                break
        if isminus :
            res *= -1
            return intmin if res < intmin else res
        else :
            return intmax if res > intmax else res