백준

백준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;
	}
}