ABOUT ME

Today
Yesterday
Total
  • [백준 10757] 큰 수 A+B(Kotlin 풀이)
    자료구조 & 알고리즘/BOJ 문제풀이 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())
    }

    댓글

Designed by Tistory.