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'
을 빼주게 되면 원하는 정수형을 얻을 수 있는 것이다.
문자와 문자의 연산은, 아스키코드로 이루어진다는 점을 활용한 코드라 할 수 있다.
int n1 = Integer.parseInt(String.valueOf(sb.charAt(j)));
문자를 문자열 (String)으로 바꾸고, 이를 다시 정수형 (int)로 바꿔준다.
int n1 = Integer.parseInt(sb.substring(j, j+1));
애초에 문자열로 자른 후에, 정수형으로 바꿔준다.
int n1 = Character.getNumericValue(sb.charAt(j));
주어진 문자가 나타내는 정수를 반환한다.