[백준] 감정이입 (14623)(kotlin)

원본 문제

문제 설명

감정이입에 대해서 알고 있는가? 감정이입이란 자신의 감정을 특정 대상에 이입시키거나 특정 대상의 감정을 자신에게 이입시켜서 서로 공감하는 것이다. 이렇게 자신이 다른 대상이 됐다고 생각을 하면 그전에는 느끼지 못했던 감정을 느낄 수 있어 풍부한 사고를 할 수 있다. 감정이입에 몰입하게 되면 어떠한 단계에 이르게 된다. 이 단계에서는 자신이 감정이입을 하는 대상이 되어 사고를 할 수 있게 된다.

예로부터 많은 천재들이 이 단계에 다다라 많은 업적을 세웠다. 알베르트 아인슈타인은 빛이 되어 상대성 이론을 발견했고, 찰리 채플린은 자신이 연기하는 대상 그 자체가 되어 많은 사람들이 기억하는 희극배우가 됐다.

컴퓨터 공학에서도 이런 단계에 다다를 수 있을까? CPU가 되어서 주변 입/출력 장치를 제어하거나, 뉴럴 네트워크에 존재하는 수많은 뉴런들 중 한 뉴런이 되어 계산에 관여하는 상상을 할 수 있을까?

천 리 길도 한 걸음부터. 컴퓨터에서는 없어서 안될 ALU(Arithmetic Logic Unit)가 되는 상상을 해보자. ALU는 두 이진수의 산술 연산 혹은 논리 연산을 계산하는 회로다. 두 이진수가 주어졌을 때 덧셈은 가산기를, 뺄셈은 보수기와 가산기를 이용해 이루어진다. 그렇다면 두 이진수의 곱셈은 어떻게 이루어 질까? ALU가 되어 이 문제를 해결해보자.

입력

첫 번째 줄에 이진수 B1이 주어진다. 두 번째 줄에 이진수 B2가 주어진다. 입력으로 주어지는 두 이진수의 길이는 1 이상 30 이하의 자연수이다. 또한 두 이진수들이 1로 시작하는 것이 보장된다.

출력

첫 번째 줄에 입력으로 주어진 두 이진수 B1, B2의 곱을 이진수로 출력한다. 출력하는 이진수 앞에 불필요한 0이 붙으면 안 됨에 주의해야 한다. 즉 출력하는 이진수의 시작은 항상 1이어야 한다.

테스트 케이스

입력 출력
1010
11
11110
1000
100
100000

문제 풀이1

import java.util.Scanner

fun main(args: Array<String>) = println(
        (0..1)
            .map { sc.next().toLongDecimal() }
            .reduce { acc, i -> acc * i }
            .toStringBinary()
)

val sc = Scanner(System.`in`)

fun pow(base: Int, exponent: Int) = Math.pow(base.toDouble(), exponent.toDouble()).toInt()

fun String.toLongDecimal(): Long {
    var sum: Long = 0
    this.reversed()
        .forEachIndexed {
        k, v -> sum += v.toString().toLong() * pow(2, k)
    }
    return sum
}

fun Long.toStringBinary(): String {
    val sb = StringBuilder()

    var value = this
    while (value > 0) {
        sb.append("${value % 2}")
        value /= 2L
    }
    return sb.toString().reversed()
}

문제 풀이2

fun main(args: Array<String>) = println((n * n).toString(2))
val n get() = readLine()!!.toLong(2)