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

해당 프로그래머스 문제를 풀다가 알게 된 유용한 방식이 있어 기록하려고한다.

우선 코드는 다음과 같다.

코드

package greedy;

class 큰_수_만들기 {
    public String solution(String number, int k) {
        StringBuilder sb = new StringBuilder(number);
        int startIndex = 0;

        for (int i = 0; i < k; i++) {
            for (int j = startIndex; j < sb.length() - 1; j++) {
                if (sb.charAt(startIndex) == '9') {
                    startIndex++;
                    continue;
                }

                int n1 = sb.charAt(j) - '0';
                int n2 = sb.charAt(j + 1) - '0';

                if (n1 < n2) {
                    sb.deleteCharAt(j);
                    break;
                }
            }
        }

        String answer = sb.toString();

        if (answer.length() > number.length() - k) {
            answer = answer.substring(0, number.length() - k);
        }

        return answer;
    }
}

여기서 주목할 부분은 이 곳이다.

int n1 = sb.charAt(j) - '0';
int n2 = sb.charAt(j + 1) - '0';

뭔가 좀 생소하지만 위와 같은 코드로 바로 정수형의 값을 얻을 수 있다.

설명

StringBuilder 타입인 sb에 "12345"가 들어있다고 가정해보자.

우선 chatAt(i) 메소드를 사용하여 문자 하나를 가져온다. 문자'열'이 아닌, 1개의 '문자'이다.

j가 0이라면, n1에는 '1'이 들어있을 것이다.

하지만 우리는 문자 '1'이 아닌, 정수 1이 필요한 상황이다.

문자 '1'의 아스키코드는 49이다. 그리고 문자 '0'의 아스키코드는 48이다.

'1' - '0' == 49 - 48 == 1 이므로,

숫자인 문자에 '0'을 빼주게 되면 원하는 정수형을 얻을 수 있는 것이다.

문자와 문자의 연산은, 아스키코드로 이루어진다는 점을 활용한 코드라 할 수 있다.

문자 👉🏻 정수 여러 방법

1. Integer.parseInt + String.valueOf 메서드 사용

int n1 = Integer.parseInt(String.valueOf(sb.charAt(j)));

문자를 문자열 (String)으로 바꾸고, 이를 다시 정수형 (int)로 바꿔준다.

2. Integer.parseInt + substring 메서드 사용

int n1 = Integer.parseInt(sb.substring(j, j+1));

애초에 문자열로 자른 후에, 정수형으로 바꿔준다.

3. Character.getNumericValue 메서드 사용

int n1 = Character.getNumericValue(sb.charAt(j));

주어진 문자가 나타내는 정수를 반환한다.

profile
안녕하세요. 비즈니스를 이해하는 백엔드 개발자, 한상호입니다.

0개의 댓글

Powered by GraphCDN, the GraphQL CDN