Leetcode Java String to Integer (atoi)
업데이트:
문제
코드
class Solution {
public int myAtoi(String s) {
int result = 0;
if (s.length() == 0) {
return result;
}
int idx = getBeginning(s);
if (idx == s.length()) {
return result;
}
int sign = 1;
if (s.charAt(idx) == '+' || s.charAt(idx) == '-') {
sign = s.charAt(idx++) == '-' ? -1 : 1;
}
while (idx < s.length() && s.charAt(idx) >= '0' && s.charAt(idx) <= '9') {
if (isOverflow(result, s.charAt(idx))) {
return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
}
result = result * 10 + s.charAt(idx++) - '0';
}
return result * sign;
}
private int getBeginning(String s) {
int idx = 0;
while (idx < s.length() && s.charAt(idx) == ' ') {
idx++;
}
return idx;
}
private boolean isOverflow(int result, char c) {
return result > Integer.MAX_VALUE / 10
|| (result == Integer.MAX_VALUE / 10 && c - '0' > Integer.MAX_VALUE % 10);
}
}
결과
설명
-
주어진 문자열 s는 0부터 1000까지 길이이므로 s의 길이가 0일 경우, 0을 그대로 주어진 문제의 결과로 반환한다.
- 주어진 문자열 s의 공백을 확인하여 숫자열 탐색의 시작 index를 확인하여 idx 변수에 저장한다.
- 공백 문자열의 길이는 주어진 문자열 s보다 작고, s의 idx번째 문자가 공백 문자열의 경우만 idx를 점층적으로 증가시킨다.
- 만일 idx가 s의 길이와 같거나 공백이 아닌 문자열이 탐색되었을 경우, 반복을 중지하고 idx를 숫자열 탐색의 시작 index로 반환한다.
- 숫자열 탐색의 시작 index인 idx가 주어진 문자열 s의 길이와 같을 경우, 0을 그대로 주어진 문제의 결과로 반환한다.
- 주어진 문자열 s가 공백으로만 이루어진 문자열인 경우이다.
-
주어진 문자열 s의 idx번째 문자가 +나 -인 경우 idx를 증가시키고, -인 경우만 sign을 -1로 변경하여 음수 결과를 반환할 수 있도록한다.
- 주어진 문자열 s을 idx번째 index부터 각 문자가 0 ~ 9 사이의 숫자인 경우만 탐색한다.
- 만일 결과로 반환할 result가 int형의 최댓값의 $\frac{1}{10}$인 214,748,364를 초과 할 경우이거나, result가 214,748,364이고 주어진 문자열 s의 idx번째 문자가 7보다 클 경우 int형의 최댓값과 최솟값을 초과하므로 Overflow 처리한다.
- Character형인 c를 ‘0’으로 빼면 Ascii 값 기준으로 해당 값의 숫자로 반환된다.
- 위의 Overflow 처리된 경우, sign이 1이면 int형의 최댓값인 2,147,483,647를 주어진 문제의 결과로 반환한다.
- sign이 -1이면 int형의 최솟값인 -2,147,483,648을 주어진 문제의 결과로 반환한다.
- Overflow 처리가 되지 않은 경우, result에 reulst * 10과 주어진 문자열 s의 idx번째 문자열의 ascii 코드값에 ‘0’의 ascii 코드값을 뺀 값을 저장하고 반복을 계속 수행한다.
- 만일 결과로 반환할 result가 int형의 최댓값의 $\frac{1}{10}$인 214,748,364를 초과 할 경우이거나, result가 214,748,364이고 주어진 문자열 s의 idx번째 문자가 7보다 클 경우 int형의 최댓값과 최솟값을 초과하므로 Overflow 처리한다.
- 반복이 끝나면 결과로 반환할 result에 음수/양수를 구분할 sign값을 곱하여 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기