백준/백준 파이썬

백준 파이썬 2033번 반올림 (Today I Learn 2023.12.13)

군청레프 2023. 12. 30. 01:46
728x90

12/ 13 파이썬 공부
백준 2033번 반올림

1) 문제
정수 N이 주어져 있을 때 이 수가 10보다 크면 일의 자리에서 반올림을 하고, 
이 결과가 100보다 크면 다시 10의 자리에서 반올림을 하고, 
또 이 수가 1000보다 크면 100의 자리에서 반올림을 하고.. (이하 생략) 
이러한 연산을 한 결과를 출력하시오.

2) 입력
첫째 줄에 정수 N이 주어진다. (0 ≤ N ≤ 99,999,999)

3) 출력
첫째 줄에 위와 같은 연산을 한 결과를 출력하시오.

>>>코드1. round 함수 이용: 오답

n = int(input())
i = 1
while True:
    if n > 10 ** i:
        n = round(n, -i)
    else:
        print(n)
        break
    i += 1



>>> 문제 오류
446을 입력 했을 시에 446 -> 450 -> 500 이 아닌 400이 출력된다.

찾아보니 round() 함수에서 두 번째 인자음수 값을 사용할 때, 
십진수 자릿수가 아니라 10의 거듭제곱의 자릿수로 해석한다.

예를 들어, round(450, -2)는 450을 가장 가까운 10의 100의 자릿수로 반올림하려는 것이다. 
즉, 소수점 이하에서 두 자리를 반올림하여야 한다.

450을 100으로 나누면 4.5가 되고, 가장 가까운 정수는 4이다. 
따라서 round(450, -2)는 400을 반환하게 된다.

이는 round() 함수에서 두 번째 인자를 음수 값으로 사용할 때, 
해당 값의 음수에 따라 십진수 자릿수가 아닌 10의 거듭제곱의 자릿수로 반올림을 수행하기 때문이다.

>>>코드2. 직접 반올림 함수 만들기

n = int(input())
i = 1
while True:
    if n > 10**i:
        if n % (10**i) >= 5*(10**(i-1)):
            n = (n//(10**i) +1)*(10**i)
        else:
            n = (n//(10**i))*(10**i)
    else:
        print(n)
        break
    i += 1



>>>문제링크
https://www.acmicpc.net/problem/2033

728x90