[프로그래머스] 문자열을 정수로 바꾸기

문자열의 길이는(s는) 1~5이고, s 맨 앞에는 부호(+,-)가 올 수 있다고 한다.

부호에 따른 처리가 필요한 것인지 궁금했지만 일단 매개변수로 받은 문자열 s를 정수로 casting 해보았다.

1
2
3
4
5
6
7
8
9
import java.util.*;
class Solution {
public int solution(String s) {
int answer = 0;
answer = Integer.parseInt(s);

return answer;
}
}

우선 이렇게 코딩 후 실행하니 테스트케이스를 전부 통과했고, 놀랍게도 제출하니 정답으로 통과했다.

하지만 남들이 푼 코드를 보니 API에 의존한 내가 너무 부끄럽게 느껴질 정도였다.
남들이 푼 코드 중 하나를 가져와서 atoi에 대해 다시 한번 익혀보도록 하자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Solution {
public int solution(String str) {
boolean plus = true;
int value = 0;

for (char ch : str.toCharArray()) {
if (ch == '-') {
plus = false;

} else {
int num = ch - 48;
value = num+value*10;
}

}
return (plus==true)? value : -1*value;

}
}

매개변수 문자열 str을 toCharArray로 문자로 char 변수에 받은 후 - 부호가 존재하면 plus 상태를 false라고 해주고 만약 +부호 일때는 if문을 벗어난다.

문자 중 부호가 없으면 else 문으로 진입하게 되는데, 여기서부터가 atoi의 핵심이다.

1
2
3
4
5
6
7
8
for (char ch : str.toCharArray()) {
if (ch == '-') {
plus = false;

} else {
int num = ch - 48;
value = num+value*10;
}

String 객체에 담긴 문자열이 int 형 변수에 Integer로 Casting 되는 과정이다.

1
2
3
4
5
6
//ex) String = 12
result = 0; //초기값
result = (result * 10) + '1' - 48; //1
result = (1 * 10) + '2' - 48; //12

//result의 최종 결과 값은 12

초반에 result에 10을 곱해주는 이유는 Decimal 데이터를 얻어야 하기에 그렇다.

또한 아스키코드 상에서 48은 문자열 0이므로 문자열 1(49)에서 문자열 0(48)을 빼주면 정수 1이 출력될 수 있다. 마지막으로 plus 상태가 true이면 바로 value 출력, false면 value에 -1을 곱한 후 리턴해주면 된다.

Author

MoonDoni

Posted on

2020-02-06

Updated on

2020-02-07

Licensed under

댓글