본문 바로가기
[Python] Baekjoon/Brute force(브루트포스)

[백준(Baekjoon)] 2033 반올림

by 파크영 2021. 10. 6.

문제

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

 

입력

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

 

출력

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

입력 출력
15 20

나의 풀이

[Python(파이썬)]

num = int(input())
if num < 10:
    print(num)
else:
    n = 1
    while len(str(num)) != n:
        if str(num)[-n] == '5':
            num = (num // (10**n) + 1) * (10**n)
        else:
            num = round(num, -n)
        n += 1
    print(num)

풀이 과정

1. 첫번째 문제 - 문제 이해 실수

 

처음에는 단순한 반올림 문제라고 생각했다. 

그래서 num이 10의 자리면 1의 자리에서 반올림, 100의 자리면 10에서 반올림, ....이렇게 구현했다.

( 이것도 파이썬 반올림 문제인 5를 해결하진 않았다.) 

num = int(input())
print(num) if num < 10 else print(round(num, -len(str(num//10))))

 

하지만 문제를 다시 보니 이 수가 10보다 크면 일의 자리에서 반올림을 하고, 이 결과가 100보다 크면 다시 10의 자리에서 반올림을 하고, 또 이 수가 1000보다 크면 100의 자리에서 반올림을 하고.. (이하 생략) 

 

ex) 138

138 -> 의 자리 (올림)

140 -> 의 자리 (내림)

= 100

 

ex) 38291

38291 -> 의 자리 (내림)

38290 -> 의 자리 (올림)

38300 -> 의 자리 (내림)

38000 -> 의 자리 (올림)

= 40000

 

이런 식으로 결과에 따라 계속해서 반올림할 자릿수를 올려가며 반올림을 해줘야하는 것이었다. 

 

 

2. 두번째 문제 -> 파이썬 반올림 문제

 

첫번째 문제를 인지하고 아래 코드와 같이 바꿔주었다. 

num = int(input())
if num < 10:
    print(num)
else:
    n = 1
    while len(str(num)) != n:
        num = round(num, -n)
        n += 1
    print(num)

 

 

하지만 제출하고 나니 또 틀려서 생각해보니 파이썬에서는 반올림을 할때 5인 경우 앞의 숫자에 따라서 올림하거나 내림 하는 것 때문이었다. 

 

※ 반올림 해야할 자리의 숫자가 5인 경우는 앞의 숫자가 짝수면 내림, 홀수면 올림

 

>>> round(15, -1)	# 십의 자리가 1(홀수) -> 올림
20
>>> round(25, -1)	# 십의 자리가 2(짝수) -> 내림
20

>>> round(35, -1)	# 십의 자리가 3(홀수) -> 올림
40
>>> round(45, -1)	# 십의 자리가 4(짝수) -> 내림
40

 

ex) 345
345-> 의 자리 (올림)
350-> 의 자리 (올림)
= 400

위와 같이 답이 나와야하는데 아래와 같이 나오는 것이다. 

ex) 345
345-> 의 자리 (올림 -> 내림) -> 반올림할 앞의 숫자 4가 짝수이므로 내림
340-> 의 자리 (내림)
300 -> 틀린 정답

 

 

 

[Python(파이썬)] 올림, 내림, 반올림 (소수점, 일의 자리, 십의 자리, ...)

올림 소수점 올림 math 모듈의 ceil()을 사용하여 올림을 계산한다. >>> import math # 나눗셈 계산 후 올림 >>> 7/3 2.3333333333333335 >>> math.ceil(7/3) 3 >>> math.ceil(4.2) 5 >>> math.ceil(-4.2) -4 정수..

young-library.tistory.com

 

 

if str(num)[-n] == '5':
     num = (num // (10**n) + 1) * (10**n)
else:
     num = round(num, -n)

반올림 할 자리가 5이면 무조건 올림을 해주고 5가 아니면 반올림 해주는 방법으로 코드를 변경했다. 

 


문제 출처

 

2033번: 반올림

정수 N이 주어져 있을 때 이 수가 10보다 크면 일의 자리에서 반올림을 하고, 이 결과가 100보다 크면 다시 10의 자리에서 반올림을 하고, 또 이 수가 1000보다 크면 100의 자리에서 반올림을 하고.. (

www.acmicpc.net

 

댓글