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: 일치하지 않음
- 이 정규표현식은 주로 숫자를 추출하거나 특정한 형식을 가진 문자열을 검색할 때 사용