문제 링크
풀이
전탐색을 하여 풀 수 있다.
처음에 N조건이 10억으로 매우 크기 때문에 전탐색을 생각하기 쉽지 않지만, 이 문제는 n의 자릿수만 중요한 문제이기 때문에, 분할하는 경우가 한 번당 10^2밖에 되지 않는다. 최대 몇 번 쪼갤 수 있을지는 아무리 크게 잡아봤자 10번 미만일 것 같은 직감이 들기 때문에 O(10^3) 보다 작은 시간 안에 풀 수 있다는 믿음을 가지고 풀었다.
cf) n & 1의 값이 1이라면 n은 홀수이다. 홀수는 항상 첫번째 비트가 1이고 짝수는 0이기 때문에 이처럼 계산할 수 있다.
코드
#include <cstdio>
#include <algorithm>
using namespace std;
int m = 1e9, M = -1e9;
void solve(int n, int cnt) {
if (n < 10) {
if (n & 1) cnt++;
m = min(m, cnt);
M = max(M, cnt);
return;
}
// 각 자리수의 홀수 개수 세는 부분
int tmp = n;
while (tmp) {
if ((tmp % 10) & 1) cnt++;
tmp /= 10;
}
if (n < 100) {
solve(n / 10 + n % 10, cnt);
} else {
for (int i = 10; i < n; i *= 10) {
for (int j = i * 10; j <= n; j *= 10) {
// 수를 3등분으로 쪼개기
int a = n % i, b = (n / i) % (j / i), c = n / j;
solve(a + b + c , cnt);
}
}
}
}
int main() {
int n; scanf("%d", &n);
solve(n, 0);
printf("%d %d", m, M);
}
'Algorithm > BOJ' 카테고리의 다른 글
백준[3015] 오아시스 재결합 (0) | 2021.10.15 |
---|---|
백준[14428] 수열과 쿼리 16 (0) | 2021.10.14 |
백준[16401] 과자 나눠주기 (0) | 2021.10.14 |
백준[2239, 2580] 스도쿠 (0) | 2021.10.14 |
백준[14500] 테트로미노 (0) | 2021.10.13 |