문제
정수 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
'[Python] Baekjoon > Brute force(브루트포스)' 카테고리의 다른 글
[백준(Baekjoon)] 1051 숫자 정사각형 (0) | 2021.10.10 |
---|---|
[백준(Baekjoon)] 2502 떡 먹는 호랑이 (0) | 2021.10.07 |
[백준(Baekjoon)] 1157 단어 공부 (0) | 2021.10.06 |
[백준(Baekjoon)] 1268 임시 반장 정하기 (0) | 2021.10.05 |
[백준(Baekjoon)] 2578 빙고 (0) | 2021.10.04 |
댓글