자료구조 & 알고리즘/BOJ 문제풀이

[백준 10757] 큰 수 A+B(Kotlin 풀이)

쉽코기 2022. 1. 11. 22:43

1.문제 

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

2. 입력

첫째 줄에 A와 B가 주어진다. (0 < A,B < 1010000)

3. 출력

첫째 줄에 A+B를 출력한다.


4. 포인트

    1. 자료형에 대한 이해
    2. 구현 

4. 문제 풀이

BigInteger 를 통한 간단한 풀이도 있지만 연습하는 과정이기에 함수를 사용하지 않고 풀어보았다.

처음에는 수를 직접 잘라 가는 풀이를 구성했다. 

추후 다른 풀이들을 참고 한 결과 길이를 통해 접근하는 방법을 참고하여 고쳐보았고

결과적으로 메모리 와 시간을 줄일 수 있었다.

아마도 String을 직접 잘라서 사용해 객체를 많이 생성한 탓인 것 같다.

 

// 처음 풀이 - string을 잘라가면 진행

import java.io.BufferedReader
import java.io.InputStreamReader
import java.util.*
import javax.xml.stream.events.Characters

fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
    val st = StringTokenizer(readLine(), " ")

    var num1 = st.nextToken()
    var num2 = st.nextToken()
    val result = mutableListOf<String>()
    var carry = 0


    while (num1.isNotEmpty() || num2.isNotEmpty()) {

        var bitA = 0
        var bitB = 0

        if (num1.isNotEmpty()) {
            bitA = num1.substring(num1.lastIndex).toInt()
            num1 = num1.substring(0, num1.lastIndex)
        }
        if (num2.isNotEmpty()) {
            bitB = num2.substring(num2.lastIndex).toInt()
            num2 = num2.substring(0, num2.lastIndex)
        }

        val tempResult = bitA + bitB + carry

        result.add((tempResult % 10).toString())

        carry = if (tempResult > 9) 1 else 0
    }
    if (carry == 1) {
        result.add("1")
    }

    result.reversed().forEach {
        print(it)
    }

}
// 두번째 풀이  - 길이를 통한 접근

import java.io.BufferedReader
import java.io.InputStreamReader
import java.lang.StringBuilder
import java.util.*
import javax.xml.stream.events.Characters

// 1052
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {

    val st = StringTokenizer(readLine(), " ")

    var num1Sb = StringBuilder(st.nextToken())
    var num2Sb = StringBuilder(st.nextToken())

    var resultBilder = StringBuilder()

    var len1 = num1Sb.length - 1
    var len2 = num2Sb.length - 1

    var carry = 0
    while (len1 >= 0 || len2 >= 0) {
        var c1 = if (len1 < 0) 0 else Character.getNumericValue(num1Sb[len1])
        var c2 = if (len2 < 0) 0 else Character.getNumericValue(num2Sb[len2])

        var sum = c1 + c2 + carry

        var bit = sum % 10
        carry = sum / 10

        resultBilder.insert(0, bit)

        len1--
        len2--
    }

    if (carry > 0) {
        resultBilder.insert(0, carry)
    }
    println(resultBilder.toString())
}