문제
https://www.acmicpc.net/problem/2231
소스코드
#include <iostream>
#include <string>
using namespace std;
int main(void) {
int N; cin >> N;
int digit = 0;
int m = N;
while (m) {
m /= 10;
digit++;
}
//범위는 N-digit*9 ~ N
int answer = 0; int complete = false;
for (int i = digit * 9; i > 0; i--) {
int now = N - i;
string s = to_string(now);
int sum = now;
for (int j = 0; j < s.length(); j++) {
sum += s[j]-'0';
}
if (sum == N) {
answer = now;
complete = true;
break;
}
}
if (complete) cout << answer << endl;
else cout << 0 << endl;
}
코드설명
1. N의 자릿수를 구한다. 예를 들어 216의 자릿수를 구하려면 216/10 = 21, 21/10 = 2, 2/10= 0 이렇게 0이 될 때까지 10으로 나누어 주면 구할 수 있다. 따라서 216의 자리수 digit은 3이다.
2. 216의 각각의 자릿수가 가질 수 있는 최댓값은 9이다. 따라서 216이 분해합이 될 수 있는 최솟값은 216-3*9 = 189 이다. 따라서 189부터 216까지의 숫자에 대한 분해합을 구하고, 그 수가 216인지 확인하면 된다.
3. 각각의 자릿수를 더하기 위해 정수 216을 string으로 변환한다(to_string). 그 다음 모든 자릿수 -'0'을 하면 숫자의 아스키코드 값이 되는데, 그렇게 하여 각각의 자릿수와 자기 자신을 더해준다. 그 결과가 216인지 확인하는 것이 끝이다!
'개인 공부 > 코딩테스트' 카테고리의 다른 글
[C++] 백준 1436번 영화감독 숌 :: seoftware (0) | 2020.03.26 |
---|---|
[C++] 백준 1874번 스택 수열 :: seoftware (0) | 2020.03.18 |
[C++] 백준 1181번 단어 정렬 :: seoftware (0) | 2020.03.13 |
[C++] 백준 11053번 가장 긴 증가하는 부분 수열 :: seoftware (0) | 2020.03.13 |
[C++] 백준 10250번 ACM 호텔 :: seoftware (0) | 2020.03.13 |
댓글