코딩 (독학)/★ Algorithm

[백준] 2588번 : 곱셈 - Kotlin [코틀린]

짱득이 2022. 4. 6. 17:03
300x250
반응형


 

2588번: 곱셈

첫째 줄부터 넷째 줄까지 차례대로 (3), (4), (5), (6)에 들어갈 값을 출력한다.

www.acmicpc.net


  • 문제


  • 알고리즘

(1)과 (2)의 곱셈을 진행하는 문제이고, (3), (4), (5)는 각각 (2)의 자릿수에 따른 곱셈 과정이다.

(3)은 472*5의 과정이고, (4)는 472*5, (5)는 472*3의 과정이다.

 

1. 수학적으로 접근하여 각각의 자리수를 나누어 출력하고, 맨 마지막 결과는 (1)과 (2)의 곱셈을 출력하면 된다는 것이 가장 먼저 드는 단순한 방법인 것 같다.

 

2. (2)를 문자열로 받아서 JAVA에서의 charAt( )과 같이 한문자식 .toInt( ) 로 변환하여 (1)과 곱해서 출력하는 방법이 있는 것 같다.

 


  • 풀이 

 

- 1번 방법

import java.util.*

fun main(args : Array<String>) : Unit = with(Scanner(System.`in`)) {
    val a = nextInt()
    val b = nextInt()
    
    val b_1 = (b%10)
    val b_10 = ((b%100)/10)
    val b_100 = (b/100)
    
    println("${b_1*a}")
    println("${b_10*a}")
    println("${b_100*a}")
    println("${a*b}")
}

대부분 흔히 사용하는 풀이 방법이었지 싶다.

Scanner를 이용하여 a와 b를 Int 형식으로 받아주고, b에서 파생된 각각의 변수에 b의 자리수를 나눠 줄 값들을 저장한다.

 

b%10 => 나머지로 1의자리수가 생성 => 5 출력

((b%100)/10) => 나머지의 몫으로 10의 자리수가 생성 => 8 출력

(b/100) => 몫으로 100의 자리수가 생성 => 3 출력

 

이렇게 계산하여 간단히 출력만 해 주었다.

 

 

 


 

 

- 2번 방법

 

이 방법은 조금 이상하고 낯설긴 하지만.. 이번에 문제를 풀면서 새롭게 알게 된 방법이다.

 

Char 형식의 문자를 Int형으로 변환할 때 생기는 문제에 대하여 다루었고, 풀이 방법을 알게되었다.

 

바로 ASCII 코드와 겹치는 경우, 변환하였을 때 우리가 기대한 Int 값이 아닌 ASCII에 해당하는 값이 출력된다는 것이다.

 

fun main(args : Array<String>) : Unit {
    val a = readLine()!!.toInt()
    val b = readLine()!!

    println("${a*Character.getNumericValue(b[2])}")
    println("${a*Character.getNumericValue(b[1])}")
    println("${a*Character.getNumericValue(b[0])}")
    println("${a*b.toInt()}")
}

a에는 (1)의 값이, b에는 (2)의 값이 들어갈 수 있도록 readLine( ) 으로 불러와 주었다.

 

a의 경우 바로 .toInt( ) 로 변환하였고, ASCII코드에 해당하는 값이 없었다.

b의 경우에는 한 문자씩 .toInt( ) 로 읽어와야 했었기 때문에 각각의 값이 기대한 값과 다르게 ASCII 문자에 해당하는 값이 출력되어버렸다.

 

그에 대한 해결 방법으로 간단하게 위와 같이 Character.getNumericValue( ) 함수 사용하였다.

 

 


 

  • 제출 결과 및 정리

지금 시점이 아직 백준 알고리즘을 시작한지 얼마 되지 않은 코린이라서 참.. 한 문제 푸는데도 컴파일 에러, 오답이 많이 나오는 것 같은데.. 에러 없이도 완벽한 클린코드를 작성할 수 있는 날이 되고싶다 ㅠㅠ

728x90
반응형