알고리즘 문제를 풀다가 오랜만에 Char 타입을 Int 타입으로 변환해서 푸는 문제를 만났다.
이 문제는 대략 48% 오답률을 갖고 있어서 비교적 쉽게 알고리즘을 구상할 수 있었다. 그런데 왠걸, 예상하지 못한 이슈를 만났다.
( 사실 저번에도 만났던 이슈였는데 오랜만에 Char를 Int로 변환해야하는 알고리즘 문제를 만나서 까먹었었다. )
Char를 Int 타입으로 변환할 때 c.toInt() 와 같이 사용했는데 기대한 동작을 하지 않았다 이렇게 하니 Char는 ASCII 코드 값으로 반환하고 있었기 때문이다. 그래서 이 문제를 해결하기 위해서는 크게 두 가지의 방법이 있었다.
1번의 방법은 0~9까지 Char 타입을 Int 타입으로 변경해주고 A~Z의 Char 타입을 입력하면 대소문자 구분 없이 10~35까지의 숫자로 변환해준다. 그리고 0~9, A~Z의 값 외의 Char 타입을 넣게 되면 -1을 리턴한다.
2번의 방법은 간단하다. Char 타입의 0~9의 ASCII 코드 값에서 '0' ASCII 코드 값을 빼므로 숫자를 구하는 간단한 방식이다. 예를 들어, '0'의 ASCII 코드 값이 48이고 '1'의 ASCII 코드값이 49이다. 그러면 '1' - '0' = 1의 정수값으로 사용할 수 있는 것이다.
위의 두 방법 말고도 c.toString().toInt() 이렇게 하는 방법도 있는데 Char -> String -> Int 이렇게 형변환을 거쳐야 하니 끌리지 않는 방법이었다.
아래는 이 형변환을 활용해서 풀었던 알고리즘 문제다. 이 문제는 백준 알고리즘의 2231번 분해합 문제다.
import java.util.*
fun main() = with(Scanner(System.`in`)) {
val n = next()
val num = n.toInt()
for (g in (num - (n.length * 9)) until num) {
var sum = g
g.toString().forEach { sum += it - '0' }
if (sum == num) {
print(g)
return
}
}
print(0)
}