https://www.acmicpc.net/problem/2033
문제
> 정수 N에 대해 10보다 크면 일의 자리에서 반올림, 이 결과가 100보다 크면 다시 10의 자리에서 반올림, 1000보다 크면 100의 자리에서 반올림을 반복한다. 결과를 출력하라.
접근
수를 10, 100, 1000..과 비교하며 조건에 만족하면 해당 자리를 반올림 하고 수를 변화시켜 계속 조건을 검증한다.
문제해결
> 입력받은 수를 가장 먼저 10과 비교해야 하기 때문에 i를 10으로 주고 i보다 작아지면 while문이 끝나도록 준다.
> 자리수를 비교해야 하기 때문에 N / (i/10) % 10 하면 원하는 자리의 수만 얻을 수 있다. 이제 그 수를 반올림 해야하기 때문에 5와 비교해서 크거나 같으면 올리고 아니면 내린다.
> 10. 100. 1000...과 비교해야돼서 i의 값에 10씩 곱해준다. 더 이상 반올림연산을 못하면 수를 출력한다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N;
cin >> N;
int i = 10;
while (N > i)
{
if (N / (i/10) % 10 >= 5)
{
N = (N / i + 1) * i;
}
else
N = N / i * i;
i *= 10;
}
cout << N << '\n';
}

후기
if문의 반올림 검증 부분에서 만약 수가 446이면 십의 자리 검증에 4가 아닌 46으로 했더니 틀렸다.
검증하려는 수가 46인데 검증조건은 5보다 크거나 같다여서 오류가 났다. 해당 자리수로 4로 가져오거나 5를 50, 500 으로 만들어야 하는데 문제에선 "자리수를 비교한다" 이므로 자리수만 가져오는 수식을 만들어 썼다.