백준
백준2033 - 반올림
개발하는꼬마
2019. 8. 5. 17:58
https://www.acmicpc.net/problem/2033
2033번: 반올림
정수 N이 주어져 있을 때 이 수가 10보다 크면 일의 자리에서 반올림을 하고, 이 결과가 100보다 크면 다시 10의 자리에서 반올림을 하고, 또 이 수가 1000보다 크면 100의 자리에서 반올림을 하고.. (이하 생략) 이러한 연산을 한 결과를 출력하시오.
www.acmicpc.net
단순한 반올림 문제가 아니다. 바로 예를 들겠다.
ex1.) 453
453 -> 3내림
450 -> 5올림
500 -> 종료
ex2.) 445678
445678 -> 8올림
445680 -> 8올림
445700 -> 7올림
446000 -> 6올림
450000 -> 5올림
500000 -> 종료
ex3.) 5
5 -> 종료
ex4.) 0
0 -> 종료
ex5.)95345
95345 -> 5올림
95350 -> 5올림
95400 -> 4내림
95000 -> 5올림
100000 -> 종료
ex6.) 999
999 -> 9올림
1000 -> 종료
#include <iostream>
#include <string>
using namespace std;
string s;
int num;
//반올림할 대상이 9인 경우
void loop(int &x) {
int start = x; //숫자 9인 곳의 인덱스를 저장
while (1) {
s[start] = '0'; //9인 곳을 0으로 만듬
start--; //인덱스로 앞으로 이동
if (start == 0) { //인덱스가 0인 경우
if (s[start] == '9') { //인덱스가 가리키는 곳이 9이면
//9를 10으로 만든다.
s[start] = '0';
s = "1" + s;
break;
}
else { //인덱스가 가리키는 곳이 9가 아니면
s[start] = char(s[start] + 1); //현재 숫자를 올림
break;
}
}
else { //인덱스가 0이 아닌 경우
if (s[start] == '9') { //현재 있는 곳이 9이면
continue; //반복문 처음으로 올라감
}
else { //현재 있는 곳이 9가 아니면
s[start] = char(s[start] + 1); //현재 숫자를 올림
break;
}
}
}
x = start + 1; //숫자를 바꾸고 현재 위치보다 한 칸 뒤에 저장하여 그 위치부터 반올림을 결정하도록 한다.
return;
}
int main() {
cin >> s; //숫자 입력
if (s.size() == 1) { //한자리 숫자이면
cout << s; //그냥 출력
}
else { //한자리 수가 아니면
for (int i = s.size() - 1; i >= 1; i--) { //입력된 숫자를 맨 끝자리부터 맨 앞자리까지 반복
num = s[i] - '0'; //현재 숫자 입력
if (0 <= num && num <= 4) { //현재 위치가 0 ~ 4 사이이면
s[i] = '0'; //0으로 만든다.
}
else if (5 <= num && num <= 9) { //현재 위치가 5 ~ 9 사이이면
s[i] = '0'; //0으로 만든다.
if (s[i - 1] != '9') { //올림할 수가 9가 아니면
s[i - 1] = char(s[i - 1] + 1); //올림
}
else { //9이면
loop(i); //loop함수 실행
}
}
}
cout << s;
}
}