[Programmers] Lv1 문자열을 정수로 만들기 Java

2023. 2. 5. 18:33CS/자료구조 & 알고리즘

728x90

문제 출처

[프로그래머스 코딩 테스트 연습]

https://school.programmers.co.kr/learn/courses/30/lessons/12925#

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제 풀이

이 문제는 다음과 같이 2가지 부분으로 나눈다.

  1. 부호를 구분하는 것
  2. char형을 정수로 만드는 법

 

1. 부호를 구분하는 것

문제의 제한 조건에 부호(+, -)가 올 수가 있다고 하였다.

 

즉 ‘+’가 오는 경우 ‘-’가 오는 경우 부호가 생략된 경우로 나뉜다.

 

부호가 오는 경우는  charAt(index)  메소드를 이용하여 0번째 index를 확인해주면 된다.

boolean isAsign = s.charAt(0) == '-' || s.charAt(0) == '+';

 

이후 ‘-’ 인 경우에는 이후 -1을 곱해주는 경우로 사용하기 위해 미리 변수를 저장한다.

int asign = s.charAt(0) == '-' ? -1 : 1;

 

 

부호가 있을 경우에는 숫자를 변환하기에는 불편하다.

 

그렇기 때문에 문자열을 잘라서 숫자 부분만 유지하게 해야 된다.

if (isAsign)
    s = s.substring(1);

 

2. char형을 정수로 만드는 방법

 

우선 char 형은 ASCCI 코드를 이용할 수 있다는 것을 알아야 한다.

 

즉 ‘0’은 개발자한테 보이는 것이 ‘0’ 이지만 내부적으로 48이라는 숫자가 저장되어 있다.

‘0’은 48, ‘1’은 49, ‘2’는 50 … ‘9’는 57로 되어 있다.

 

이렇듯 숫자를 이용하여 문자를 표현할 수 있는 것이 ASCCI 코드이다.

 

여담으로 소문자, 대문자도 이렇게 되어있어 ASCCI 코드를 이용하여 문자열 정렬, n번째 소문자 등 계산이 가능해진다.

 

우리가 원하는 것은 ‘1’ 일 때 1을 얻는 방법이다.

‘1’ - ‘0’을 하면 1을 얻을 수 있다.

 

이제 자릿수를 구현해야 한다.

“11111”이라는 input이 들어왔을 때

이렇게 얻은 1을 계속 더하면 5가 되지 11111이 되지 않는다.

이를 위해서는 다음과 같이 2가지 방법이 있다.

 

1. 미리 최대 자릿수를 계산해서 하는 방법

2. 최대 자리수를 생각하지 않는 방법이다.

 

여기서는 최대 자리수를 생각하지 않는 방법을 이용한다.

 

1에서부터 지속적으로 10을 곱하면서 자릿수를 더하는 방법이다.

 

이때 중요한 것은 ‘0’이 왔을 때다.

 

이때는 더하지 않아야 한다.

 

더하지 않더라도 다음에 올 자릿수에 인해서 자동으로 자릿수가 채워진다.

 

우선 1의 자리부터 더하기 위해서 String을 반전시킨다.

 

StringBuilder에서 reverse를 이용후 String으로 변환시켜 주면 된다.

 

toString을 하는 이유는 s 변수는 String이기 때문에 클래스를 맞춰져야 한다.

 

이렇게 안 하고 for (int i = s.length()-1; i >= (asgin < 0? 1 : 0 ); i--)를 이용하여 1의 자리부터 접근이 가능하긴 하나 가독성(for_each 문 사용)을 위해서 다음과 같이 작성하였다.

StringBuilder sb = new StringBuilder(s);
s = sb.reverse().toString();

 

이후 carry 즉 자릿수와 num 숫자 부분을 계산하기 위해 변수를 생성한다.

그 이후 charArray로 변환 후 for_each 문을 이용하여 각 자릿수의 수를 얻는다.

자리 수를 얻으면 수가 ‘0’ 일 때를 제외하고 각 자릿수에 해당하는 carry와 수

(c -’ 0’)를 곱한 것을 num에 더해준다.

이후 각 자릿수가 바뀌므로 carry를 10씩 곱해준다.

int carry = 1;
int num = 0;
for (char c : s.toCharArray()) {
    if (c != '0')
        num += carry * (c - '0');
    carry *= 10;
}

 

마지막으로 부호를 곱해주면 된다.

return asign * num;

 

소스 코드

class Solution {
    public int solution(String s) {
        
        boolean isAsign = s.charAt(0) == '-' || s.charAt(0) == '+';
        int asign = s.charAt(0) == '-' ? -1 : 1;
        
        if (isAsign)
            s = s.substring(1);
        
        StringBuilder sb = new StringBuilder(s);
        s = sb.reverse().toString();
        
		int carry = 1;
        int num = 0;
        for (char c : s.toCharArray()) {
            if (c != '0')
                num += carry * (c - '0');
            carry *= 10;
        }   
        return asign * num;
    }
}
728x90