C++/백준

[C++] 백준) 2033번 반올림 문제풀이

S_Hoon 2020. 8. 25. 22:48

https://www.acmicpc.net/problem/2033

 

2033번: 반올림

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

www.acmicpc.net

문제

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

입력

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

출력

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

예제 입력 1

15

예제 출력 1

20


문제를 보고 잘 이해가 안가실 수 있다

간단히 설명하자면

1543라는 수가 있다면

1540으로 반올림하고

1500으로 반올림하고

2000으로 반올림한다

10, 100, 1000 ... 이렇게 나아가면서 반올림을 한다


#include <iostream>

int round(int ten, int n) { // 2개의 인자를 받는 반올림 함수를 선언
    if(n >= ten / 2) return ten; // ten이 10이라면 n이 5보다 크거나 작으면 10을 리턴한다
    else return 0; // n이 4보다 작거나 같으면 0을 리턴한다
}

int main() {
    int n; // 입력을 위한 변수 선언
    int ten = 10; // 10의 자리수부터 100 1000 점점 나아가야하기 위한 변수 ten = 10 선언
    std::cin >> n; // 입력
    
    while(n > ten) { // n이 ten보다 클 때까지 이 반복문을 돈다
        n = (n - n % ten) + round(ten, n % ten);
        // n = 54라고 하자면, (54 - 54 % 10) == 50, round(10, 54 % 10) == 0
        // 그러므로 n == 50이 된다
        ten *= 10; // while루프를 돌 때마다 ten에 10을 곱해서 10 100 1000 10000 이렇게 나아갈 수 있도록 한다
    }
    
    std::cout << n << std::endl; // while 루프가 끝나면 n 출력
    return 0;
}

#include <iostream>
#include <cmath>
#include <string>

int round(int ten, int n) {
    if(n >= ten / 2) return ten;
    else return 0;
}

int main() {
    int n;
    int ten = 10;
    std::cin >> n;
    
    while(n > ten) {
        n = (n - n % ten) + round(ten, n % ten);
        ten *= 10;
    }
    
    std::cout << n << std::endl;
    return 0;
}