PS(Problem Solving)/BOJ

[백준/BOJ] 4619번: 루트

JunsuKim 2021. 11. 22.
728x90

https://www.acmicpc.net/problem/4619

 

4619번: 루트

입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, B와 N이 주어진다. (1 ≤ B ≤ 1,000,000, 1 ≤ N ≤ 9) 입력의 마지막 줄에는 0이 2개 주어진다.

www.acmicpc.net

문제

양의 정수 B와 N이 주어졌을 때, B에 가장 가까운 AN의 정수 A를 찾는 프로그램을 작성하시오. AN은 B보다 작거나, 크거나, 같다.

입력

입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, B와 N이 주어진다. (1 ≤ B ≤ 1,000,000, 1 ≤ N ≤ 9) 입력의 마지막 줄에는 0이 2개 주어진다.

출력

각 테스트 케이스에 해당하는 A를 출력한다.

예제 입력1

4 3
5 3
27 3
750 5
1000 5
2000 5
3000 5
1000000 5
0 0

예제 출력1

1
2
3
4
4
4
5
16

해설

an의 값이 b보다 작을 때까지 while문을 통해 반복을 한다.

여기서 a의 값을 1부터 시작하여 루프를 한번 돌 때마다 1씩 증가시켜 주면 반복문이 끝났을 때 a의 값은 an을 했을 때 b보다 크다. 따라서 |b - an|이 |b - (a-1)n|보다 작으면 a를 출력하고 반대라면 a-1를 출력하면 된다.

소스 코드

import java.lang.Math.abs
import java.lang.Math.pow
import java.lang.StringBuilder
import java.util.*

fun main() {
    val sb = StringBuilder()
    while(true) {
        val st = StringTokenizer(readLine())
        val b = st.nextToken().toInt()
        val n = st.nextToken().toInt()
        if(b == 0 && n == 0) break
        var a = 1
        var cal = 0
        while (true) {
            cal = pow(a.toDouble(), n.toDouble()).toInt()
            if (cal >= b) break
            a++
        }
        val cal2 = pow((a - 1).toDouble(), n.toDouble()).toInt()
        if (abs(b -cal) < abs(b - cal2)) sb.append("${a}\n")
        else sb.append("${a-1}\n")
    }
    println(sb.toString())
}
728x90

댓글