코딩 테스트/Java

[프로그래머스]Level 1 : 문자열을 정수로 바꾸기(JAVA)

반응형
문자열을 정수로 바꾸기
문제 설명

문자열 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

반응형