백준 기본 문제 2588번 문제를 풀다가 알게된 것들을 적어본다
1. 풀어본 문제
(세 자리 수) × (세 자리 수)는 다음과 같은 과정을 통하여 이루어진다.
(1)과 (2)위치에 들어갈 세 자리 자연수가 주어질 때 (3), (4), (5), (6) 위치에 들어갈 값을 구하는 프로그램을 작성하시오.
1-1. 풀이 방법
3자리 자연수 두 개를 입력받아 곱하여 출력하는 것(6번)은 쉽기 때문에 아무런 문제가 없었다. 두번째 입력 받은 수(2번)의 일의 자리, 십의 자리, 백의 자리 수를 뽑아내서 첫 번째 입력값(1번)과 곱하는 부분(3,4,5번) 부분만 해결하면 쉽게 풀 수 있을 것 같았다.
Kotlin에서는 문자열을 인덱스로 뽑아낼 수 있다는 것을 이용해 각 자리수들을 뽑아내 문제를 풀어보기로 하였다.
val str1:String = "12345"
println(str1[0])
println(str1[2])
println(str1[4])
위와 같이 입력하여 출력해보면 아래와 같이 숫자들을 뽑아낼 수 있다
1
3
5
각 자리별로 모두 코드를 쓰는 것도 가능하겠지만 for 문을 이용하여 각 자리별로 수를 뽑아내 계산 후 출력되도록 코드를 짜는 것이 깔끔할 것 같다
1-2. 풀이 과정
문제를 풀다가 확실히 알게된 것은 정수형 자료에서는 인덱싱을 이용해 값을 뽑아낼 수 없다는 것이었다.(해보니 오류가 발생한다) 따라서 두 번째 입력받은 숫자를 문자열로 둔채로 값을 뽑아낸 뒤에 정수형으로 바꾼뒤에 계산하도록 코드를 작성했다.
fun main() {
val a = readln().toInt()
val b = readln()
val b_0 = b.toInt()
for (i in 2 downTo 0) {
println(a*(b[i].toInt()))
}
println(a*b_0)
}
그렇게 완성한 코드로 테스트를 돌려보았는데 값이 이상하게 출력되는 것을 볼 수 있었다
정상적으로 출력되어야할 값
입력값 | 출력값 |
472 385 |
2360 3776 1416 181720 |
내가 얻은 테스트 값
입력값 | 출력값 |
472 385 |
25016 26432 24072 181720 |
인덱싱으로 뽑아낸 값으로 곱해서 계산한 결과가 터무니 없이 큰 숫자로 나온 것을 보니 그 부분이 잘못 된 것 같다. Intellij를 보니 아래와 같이 toInt()부분에 줄이 그어져 있다. 이 부분이 잘못된 것 같다.
"'toInt():Int'는 deprecated 되었다. 문자(Char)에서 숫자로의 변환은 deprecated 되었다. Char.code 속성을 대신 사용해라"라고 문구가 나온다. deprecated는 앞으로 지원되지 않을 것이므로 사라지게 될 것이라는 뜻이라고 한다.
선뜻 이해가 되지 않아 구글링을 해보았다. 문자를 정수형으로 형변환하면 해당 유니코드에 해당하는 숫자를 반환하고 8비트 이하의 값들은 아스키코드의 값을 반환한다고 한다.
이제 왜 틀렸는지 알 것 같다. 숫자 하나를 이용해 toInt()와 Char의 code 속성을 이용해 값을 직접 출력해보았다.
fun main() {
val a = '1'
val b = '5'
println(a.toInt())
println(a.code)
println(b.code)
}
코드 실행 결과
49
49
53
이제 왜 결과값이 터무니없이 큰 값이 나왔는지 알 것 같다. 숫자로 이루어진 문자열에서 인덱싱을 이용해 숫자 문자(Char) 하나를 뽑아냈고 그것을 정수형으로 변환했을 때 그 숫자 그 자체가 나온 것이 아니고 그 숫자에 해당하는 코드값이 출력되었기 때문에 값이 잘못된 것이었다.
그래서 문자를 문자열로 변환한 뒤 다시 정수형으로 변환하는 것으로 코드를 수정했다
fun main() {
val a = readln().toInt()
val b = readln()
val b_0 = b.toInt()
for (i in 2 downTo 0) {
println(a*(b[i].toString().toInt()))
}
println(a*b_0)
}
테스트 출력값도 정상으로 나오고 답안 제출도 정상적으로 처리되었다
2. 문자를 정수형으로 변환하기
답은 맞았지만 문자를 정수형으로 변환하는 과정에서 문제가 있었기 때문에 이 부분에 대해 조금 더 찾아보았고 여러가지 방법이 있다는 것을 알 수 있었다. 찾아본 내용을 정리해 보았다.
2-1. Character 클래스의 getNumericValue(char) 메서드 이용하기
JAVA의 Character 클래스의 getNumericValue 메서드를 이용하면 숫자 하나로된 문자의 숫자 값을 정수로 변환할 수 있다
fun main() {
val a = "1234567"
println(Character.getNumericValue(a[3]))
}
코드 실행 결과
4
2-2. 문자열로 변환한 뒤 정수형으로 변환하기
문자를 바로 정수형으로 변환하지 않고 문자열로 변환한 뒤 정수형으로 변환하면 숫자 값이 제대로 반환된다
fun main() {
val a = "1234567"
println(a[5].toString().toInt())
}
코드 실행 결과
6
2-3. digitToInt() 함수를 이용하여 변환하기
Kotlin 공식 문서의 문자(Characters)에 해당하는 내용을 찾아서 읽어보니 맨 아래에 다음과 같은 내용이 있다
https://kotlinlang.org/docs/characters.html
Characters | Kotlin
kotlinlang.org
"문자 변수의 값이 숫자라면, digitToInt() 함수를 이용해 명시적으로 정수 숫자로 변환할 수 있습니다."
바로 사용해 보니 값이 제대로 출력되는 것을 볼 수 있다. 가장 간단히 사용가능하니 기억해두었다가 사용하면 될 것 같다.
fun main() {
val a = "1234567"
println(a[0].digitToInt())
}
코드 실행 결과
1
3. 오늘 알게된 것들
- Kotlin에서 문자열에서 인덱싱으로 문자를 뽑아오면 문자열이 아닌 문자 하나로 뽑아와진다
- 숫자로 이루어진 문자열에서 인덱싱으로 숫자 하나를 뽑아오는 것도 마찬가지이다
- 문자를 정수형으로 형변환하면 그 문자에 해당하는 코드값이 반환된다
- Kotlin에서 문자를 코드값으로 반환하려면 Char.code의 속성을 이용하면 된다
- 숫자 하나로된 문자를 그 숫자에 해당하는 정수로 변환하는 방법 여러가지를 알아보았다
'오늘 배운 것' 카테고리의 다른 글
2024-03-18 오늘 배운 것 (2) | 2024.03.18 |
---|---|
2024-03-17 Kotlin 배열을 문자열로 출력하기 (2) | 2024.03.17 |
24-03-16 Kotlin 이중 반복문 빠져나가기 (2) | 2024.03.16 |
2024-03-15 오늘 배운 것 (2) | 2024.03.15 |
2024-03-13 오늘 배운 것 (2) | 2024.03.13 |