Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
Tags
- 쉬움
- binary tree
- Binary
- string
- recursive
- Depth-first Search
- Python
- 문자열
- math
- leetcode
- 재귀
- sorting
- list
- backtracking
- 이진트리
- easy
- 미디움
- dfs
- hash table
- 중간
- tree
- linked list
- Medium
- 리트코드
- Array
- two pointers
- DP
- HashTable
- matrix
- binary search
Archives
- Today
- Total
부부의 코딩 성장 일기
LeetCode 8(String to Integer (atoi), python) 본문
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: 일치하지 않음
- 이 정규표현식은 주로 숫자를 추출하거나 특정한 형식을 가진 문자열을 검색할 때 사용
'Algorithm > LeetCode' 카테고리의 다른 글
LeetCode 12(Integer to Roman, Python) (0) | 2023.12.13 |
---|---|
LeetCode 11(Container With Most Water, python) (1) | 2023.12.12 |
LeetCode 7(Reverse Integer, Python) (0) | 2023.12.10 |
LeetCode 6(Zigzag Conversio, Python) (0) | 2023.12.09 |
LeetCode 191(Number of 1 Bits, Python) (1) | 2023.12.08 |