문자열을 정수로 바꾸기
문제 설명
문자열 s를 숫자로 변환한 결과를 반환하는 함수, solution을 완성하세요.
제한 조건
- s의 길이는 1 이상 5 이하입니다.
- s의 맨 앞에는 부호(+, -)가 올 수 있습니다.
- s는 부호와 숫자로만 이루어져 있습니다.
- s는 "0"으로 시작하지 않습니다.
입출력 예
예를 들어 str이 "1234"이면 1234를 반환하고, "-1234"이면 -1234를 반환하면 됩니다.
str은 부호(+,-)와 숫자로만 구성되어 있고, 잘못된 값이 입력되는 경우는 없습니다.
코드
class Solution {
public int solution(String s) {
int answer = 0;
boolean sign = true;
char c = ' ';
for(int i=0; i<s.length(); i++){
c = s.charAt(i);
if(c == '-'){
sign = false;
}else if(c != '+'){
answer = answer * 10 + (c - '0');
}
}
return sign? answer : -1 * answer;
}
}
해설
제 코드를 보시고, 대부분 사람들이 왜 이렇게 어렵게 했지?라고 생각이 드실 겁니다.
class Solution {
public int solution(String s) {
return Integer.parseInt(s);
}
}
물론 int형 형 변환을 Integer.parseInt(s); 혹은 Integer.valueOf(s); 를 사용하면 이렇게 한 줄로 끝나는 문제입니다..
저는 개인적으로 알고리즘적으로 한번 접근을 해서 풀어보았습니다.
boolean sign을 통해서 '+', '-'를 구분합니다.
첫 번째 문자가 '-'인 경우 sign을 false로 변경합니다.
else if( c!= '+') 두 번째 문자부터는 무조건 이쪽으로 들어오게 됩니다.
answer = answer * 10 + (c - '0');
이때 answer가 int형 이기 때문에 자동으로 int형으로 형 변환해서 들어가게 되는데,
아스키코드값으로 0 = 48 이기 때문에 (c - '0') or (c - 48) 0을 빼줘야 우리가 원하는 정수가 들어가게 됩니다.
1 = 0 * 10 + ( 1 )
12 = 1 * 10 + ( 2 )
123 = 12 * 10 + ( 3 )
1234 = 123 * 10 + ( 4)
이런 식으로 계산이 되어서 sign 값에 따라 return 하게 됩니다!
만약 (c - '0') or (c - 48)을 하지 않은 경우?
1 = 0 * 10 + ( 49 )
2 = 49 * 10 + ( 50 )
3 = 540 * 10 + ( 51 )
4 = 5451 * 10 + ( 52 )
5 = 54562 * 10 + ( 53 )
추가적으로 저도 이 글을 작성하다 자료를 찾아보고 알게 된 char의 Wrapper클래스 Character클래스의 메서드입니다.
Character.getNumericValue(c);
메서드의 경우 char c = '1'이면 그 숫자 자체가 int형 1로 들어가게 됩니다.
출처: 프로그래머스, https://programmers.co.kr/learn/courses/30/lessons/12925
'코딩 테스트 > Java' 카테고리의 다른 글
[프로그래머스]Level 1 : 하샤드 수(JAVA) (0) | 2021.05.23 |
---|---|
[프로그래머스]Level 1 : 핸드폰 번호 가리기(JAVA) (0) | 2021.05.23 |
[프로그래머스]Level 1 : 짝수와 홀(JAVA) (0) | 2021.05.17 |
[프로그래머스]Level 1 : x만큼 간격이 있는 n개의 숫자(JAVA) (0) | 2021.05.17 |
[프로그래머스]Level 1 : 행렬의 덧셈(JAVA) (0) | 2021.05.17 |