[백준 1008] A/B

백준 1008번: A/B - 상세 풀이

🔍 1. 문제 소개

백준 온라인 저지 1008번 문제 "A/B"는 두 정수 A와 B를 입력받아 A를 B로 나눈 결과를 출력하는 문제입니다. 입력되는 정수 A와 B는 0보다 크고 10보다 작은 정수입니다. 결과는 실수로 출력되며, 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답으로 인정됩니다.

💡 2. 문제 해석

문제의 핵심은 두 정수의 나눗셈 연산을 수행하는 것입니다. 입력 값의 범위는 제한적이지만 (0 < A, B < 10), 출력 값은 실수이므로 정수형 변수만으로는 문제를 해결할 수 없습니다. 정확한 실수 연산을 위해 적절한 자료형을 선택해야 합니다. 또한, 입력 과정에서 예외처리가 필요 없다는 점도 주목할 만합니다. (0으로 나누는 경우는 입력 조건에 의해 발생하지 않음)

🧠 3. 접근 방법

문제 해결을 위한 알고리즘은 매우 간단합니다. 입력으로 주어지는 두 정수 A와 B를 읽어들인 후, A를 B로 나누는 연산을 수행하고 결과를 출력합니다. Kotlin의 readLine() 함수를 이용하여 입력을 받고, split() 함수를 사용하여 두 정수를 분리한 후, toDouble() 함수를 이용하여 실수형으로 변환하여 나눗셈을 수행하면 됩니다.

⚙️ 4. 구현 과정

  1. **입력:** `readLine()` 함수를 사용하여 입력 문자열을 한 줄 읽습니다.

2. 분리 및 변환: split(" ") 함수를 이용하여 공백을 기준으로 문자열을 두 부분으로 나눕니다. 각 부분은 toDouble() 함수를 사용하여 실수형으로 변환합니다. 3. 나눗셈: 변환된 두 실수를 나눗셈 연산(/)을 수행합니다. 4. 출력: 결과를 println() 함수를 사용하여 출력합니다.

💻 5. 코드 설명

fun main() {
    val (a, b) = readLine()!!.split(" ").map { it.toDouble() }
    println(a / b)
}

* readLine()!!: 표준 입력으로부터 한 줄의 문자열을 읽습니다. !!는 null이 아님을 단언하는 연산자로, 문제 조건 상 입력 에러는 없으므로 사용 가능합니다. 실제 서비스 코드에서는 null check를 추가하는 것이 좋습니다. * .split(" "): 공백을 기준으로 문자열을 분리하여 List을 생성합니다. * .map { it.toDouble() }: List의 각 요소를 실수형으로 변환하여 Pair을 생성합니다. val (a, b) = ... 는 구조 분해 할당(destructuring declaration)을 사용하여 Pair의 두 요소를 a와 b 변수에 각각 할당합니다. * println(a / b): a를 b로 나눈 결과를 출력합니다.

⏱️ 6. 시간 복잡도와 공간 복잡도 분석

* 시간 복잡도: 입력 문자열을 읽고, 분리하고, 변환하고, 나눗셈 연산을 수행하는 데 걸리는 시간은 입력 크기에 비례합니다. 따라서 시간 복잡도는 O(n)입니다. (n은 입력 문자열의 길이) 하지만 입력 크기가 매우 작으므로(A, B < 10) 상수 시간 O(1)으로 볼 수도 있습니다. * 공간 복잡도: 입력 문자열과 변수 a, b를 저장하는 데 필요한 공간은 입력 크기에 관계없이 일정합니다. 따라서 공간 복잡도는 O(1)입니다.

🎯 7. 결론

백준 1008번 문제는 간단한 나눗셈 연산을 수행하는 문제로, Kotlin의 표준 라이브러리를 활용하여 간결하고 효율적으로 해결할 수 있습니다. 제시된 코드는 시간 및 공간 효율성이 뛰어나며, 추가적인 최적화는 실질적인 성능 향상에 기여하지 않습니다. 이 문제를 통해 Kotlin의 기본 입출력 및 자료형 변환, 구조 분해 할당 등의 기능을 익힐 수 있습니다. 실제 서비스 코드를 작성할 때는 입력값에 대한 예외 처리를 추가하는 것이 좋습니다.

다음 이전