부부의 코딩 성장 일기

LeetCode 8(String to Integer (atoi), python) 본문

Algorithm/LeetCode

LeetCode 8(String to Integer (atoi), python)

펩시_콜라 2023. 12. 11. 19:00

1. 문제 링크

2. 문제 설명

  • 주어진 문자열을 숫자로 바꾸는 것
  • 규칙
    • 처음 나오는 공백 ''은 무시
    • 그러다가 처음에 부호('+', '-')가 나오면 이를 최종 결과에 반영
    • 그 외 수가 아닌 문자가 나오면 멈춤 (기본값은 0, 그 전에 수가 나와서 반영되었다면 그 값)
    • 수가 나오기 시작했으면 그 이후에 수가 아닌 것이 나오면 멈춤 
    • 마지막으로 32bit 넘어가면, 내리거나(너무 큰 수), 올려서(너무 작은 수) 반환
  • 예시1) "42" → 42 
  • 예시2) "       -42" → -42 (공백 무시) 
  • 예시3) "4193 with words" → 4193 (수 뒤에 수 아닌 것 나오면 stop)
  • 예시4) "-1123u3761867" → -1123 (수 뒤에 수 아닌 것 나오면 stop)
  • 예시5) "00000-42a1234" → 0 (-가 수 뒤에 나왔을 때 stop)
  • 예시6) "words and 987" → 0 (문자가 수보다 먼저 나왔으므로 stop) 
  • 예시7) "+-2" → 0 (+부호가 나왔으니 -는 stop)

3. 처음 풀이

  • 모든 경우의 수를 다 코드화 하면 뭔가 복잡해질 것 같아서 생각한게 try~ except
    • 우선 앞의 공백은 무시가 가능하므로, 문자열의 앞 공백은 lstrip으로 제거 후 
    • 문자열을 slice하면서 int 함수에 집어 넣는다. 
      • 만약 에러가 나오면 except를 걸어 pass 시키고,
      • 에러가 아니면 그 값을 result에 저장 
    • 그리고 32비트보다 큰 숫자 혹은 작은 숫자에 대한 처리를 하여 최종 result 값 반환
    • 다행히 예외조건 없이 pass
class Solution:
    def myAtoi(self, s: str) -> int:
        s = s.lstrip()

        result = 0
        for i in range(len(s)):
            try:
                result = int(s[:i+1])
            except:
                pass 
        
        if result > 2**31-1:
            result = 2**31-1
        elif result < -2**31:
            result = -2**31 

        return result

 

4. 다른 풀이

  • 다른 사람 풀이. regular expression을 사용하여 조금 더 깔끔히 해결 했다.
import re

class Solution:
    def myAtoi(self, s: str) -> int:
        # 정수의 최대값 및 최소값 정의
        MAX_INT = 2147483647
        MIN_INT = -2147483648

        # 주어진 문자열에서 부호(+ 또는 -)와 숫자를 추출
        parse_res = re.match(r'[-+]?\d+', s.lstrip())

        # 추출한 결과가 있으면 해당 부분을 가져오고, 아니면 "0"으로 설정
        parse_res = parse_res.group(0) if parse_res else "0"

        # 정수로 변환하고, 최대값 및 최소값을 초과하지 않도록 조정
        result = max(MIN_INT, min(MAX_INT, int(parse_res)))

        return result

5. 배운점

  • 정규 표현식
    • 정규표현식(Regular Expression 또는 간단히 RegEx)은 문자열을 검색하거나 변형하기 위한 유연하고 강력한 표현 언어. 특정한 패턴을 정의하여 문자열에서 일치하는 부분을 찾거나 대체할 수 있음. Python에서는 re 모듈을 통해 정규표현식을 사용할 수 있음.
    • 간단한 정규표현식의 예를 들어보면:
      • ^: 문자열의 시작
      • [-+]?: 부호(- 또는 +)가 0 또는 1회 등장
      • \\\\d+: 하나 이상의 숫자에 일치
    • 이를 합쳐서 부호와 하나 이상의 숫자를 찾는 정규표현식은 [-+]?\\\\d+
      • 예를 들어:
      • 123: 일치
      • 45: 일치
      • +6: 일치
      • abc: 일치하지 않음
    • 이 정규표현식은 주로 숫자를 추출하거나 특정한 형식을 가진 문자열을 검색할 때 사용