-
이상한 곱셈(공부필요)백준 2023. 7. 31. 11:59728x90
예시에서 나온 값들을 입력했을때는 정상적으로 값이 출력됬지만, 백준에서 채점만하면 numberFormat런타임 에러가 발생하며, 오답처리가 되어서 시간이 걸린문제다..
문제
A×B를 계산하다 지겨워진 형택이는 A×B를 새로운 방법으로 정의하려고 한다.
A에서 한 자리를 뽑고 × B에서 임의로 한 자리를 뽑아 곱한다.
의 가능한 모든 조합 (A가 n자리, B가 m자리 수라면 총 가능한 조합은 n×m개)을 더한 수로 정의하려고 한다.
예를 들어 121×34는
1×3 + 1×4 + 2×3 + 2×4 + 1×3 + 1×4 = 28
이 된다. 이러한 형택이의 곱셈 결과를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 A와 B가 주어진다. 주어지는 두 수는 모두 10,000자리를 넘지 않는 음이 아닌 정수이다. 수가 0인 경우에는 0만 주어지며, 그 외의 경우 수는 0으로 시작하지 않는다.
출력
첫째 줄에 형택이의 곱셈 결과를 출력한다.
예제 입력 1
123 45
예제 출력 1
54
오답코드
fun main() { val iput = readLine() val (num1,num2)=iput?.split(" ")?.map{it.toInt()}?: listOf(0,0) val digits1 = num1.toString().toCharArray() val digits2=num2.toString().toCharArray() val digitNum1 = digits1.map{ it.toString().toInt() } val digitNum2 = digits2.map { it.toString().toInt() } var num:Int=0; for(i in digitNum1){ for(j in digitNum2){ num+=i*j } } print(num) }
정답코드
import java.io.BufferedReader import java.io.InputStreamReader import java.util.* fun main() { solution() } private fun solution() { val br = BufferedReader(InputStreamReader(System.`in`)) val st = StringTokenizer(br.readLine()) val a = st.nextToken() val b = st.nextToken() var sum = 0L for (i in 0 until a.length) { for (j in 0 until b.length) { sum += (a[i] - '0') * (b[j] - '0') } } println(sum) }
한줄로 입력받고 공백을 기준으로 나누느라, **readLine()**과 **split**을 사용하는것 대신
StringTokenizer 를 사용했다.
이 객체는 주어진 문자열을 지정된 구분자를 기준으로 분리하여 토큰으로 나누는 역할을 한다. 이때 **StringTokenizer**는 기본적으로 공백을 구분자로 사용한다.
예를 들어, 입력이 "121 34"와 같은 형식으로 주어진다면 **StringTokenizer**는 이를 공백을 기준으로 "121"와 "34"라는 두 개의 토큰으로 분리하고, st.nextToken() 메서드를 호출하면 **StringTokenizer**는 다음 토큰을 반환한다.
그리고 생소한 코드로는 **sum += (a[i] - '0') * (b[j] - '0')** 이 부분이 있을 수 있다. 문자열이 숫자로 어떻게 계산되나 싶었는데, 아스키코드의 값을 이용한 계산이었다.
0을 기준으로 각 숫자를 빼면 그 숫자를 얻을 수 있음을 이용한 코드이다!
배울점이 여러 모로 많은 문제였던것 같다!
'백준' 카테고리의 다른 글
2007년 (0) 2023.07.31 수 정렬하기3 (0) 2023.07.31 최대공약수와 최소공배수<유클리드 호제법> (0) 2023.07.31 나이순 정렬 (0) 2023.07.31 2751번 수 정렬하기 (0) 2023.07.31