728x90
https://www.acmicpc.net/problem/20164
20164번: 홀수 홀릭 호석
호석이는 짝수랑 홀수 중에서 이니셜이 같은 홀수를 더 좋아한다. 운전을 하던 호석이는 앞차의 번호판이 홀수로 가득할 때 사랑스러움을 느낄 정도이다. 전화번호도 홀수만 있고 싶다. 그렇게
www.acmicpc.net
1 ~ 10^9 - 1 범위의 정수 N이 주어지면, N을 잘 분해하여 홀수의 개수를 구하는 문제이다.
당연히 N의 길이가 1인 경우와 2인 경우, 3 이상인 경우를 나누어 생각했고,
1인 경우와 2인 경우는 쉬우나 3 이상인 경우에는 N을 쪼갤 수 있는 모든 방법으로 쪼갠 결과를 저장해야했으므로
3 이상인 경우를 생각해보았다.
먼저 예제로 주어진 82019를 보면
8 / 2 / 019 => 29
8 / 20 / 19 => 47
8 / 201 / 9 => 218
82 / 0 / 19 => 101
82 / 01 / 9 => 92
820 / 1 / 9 => 830
이렇게 6가지의 경우가 나오는데, 이를 위해 substring 함수를 사용해서 반복문을 돌려 분할해주었다.
여기서 더해진 값이 다시 3 이상인 경우가 될 수도 있으니 이를 다시 재귀적으로 풀어주어야했다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
#include <iostream>
#include <string>
using namespace std;
int mi=2147483647, ma;
void back(string s, int ans){
string a, b, c;
if(s.length()==1){
if((s[0]-'0')%2) ans++;
mi=min(mi, ans);
ma=max(ma, ans);
return;
}
else if(s.length()==2){
if((s[0]-'0')%2) ans++;
if((s[1]-'0')%2) ans++;
s=to_string(s[0]-'0'+s[1]-'0');
back(s, ans);
}
else{
int cnt=stoi(s);
while(cnt!=0){
if(cnt%2) ans++;
cnt/=10;
}
for(int i=1; i<s.length()-1; i++){
for(int j=1; j<s.length()-i; j++){
a=s.substr(0,i);
b=s.substr(i,j);
c=s.substr(i+j,s.length());
cnt=stoi(a)+stoi(b)+stoi(c);
back(to_string(cnt), ans);
}
}
}
}
int main(){
string s; cin >> s;
back(s, 0);
cout << mi << " " << ma;
}
|
cs |
'PS > BOJ' 카테고리의 다른 글
[C++] 백준 13018번: 특이한 수열 - Ad-hoc (0) | 2024.01.12 |
---|---|
[C++] 백준 1351번: 무한 수열 - Recursion, DP (0) | 2024.01.11 |
[C++] 백준 7570번: 줄 세우기 - DP (0) | 2024.01.09 |