λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 20164번 - ν™€μˆ˜ 홀리 ν˜Έμ„

by μ•ˆμ£Όν˜• 2022. 9. 15.

문제

 

20164번: ν™€μˆ˜ 홀릭 ν˜Έμ„

ν˜Έμ„μ΄λŠ” μ§μˆ˜λž‘ ν™€μˆ˜ μ€‘μ—μ„œ μ΄λ‹ˆμ…œμ΄ 같은 ν™€μˆ˜λ₯Ό 더 μ’‹μ•„ν•œλ‹€. μš΄μ „μ„ ν•˜λ˜ ν˜Έμ„μ΄λŠ” μ•žμ°¨μ˜ 번호판이 ν™€μˆ˜λ‘œ 가득할 λ•Œ μ‚¬λž‘μŠ€λŸ¬μ›€μ„ λŠλ‚„ 정도이닀. μ „ν™”λ²ˆν˜Έλ„ ν™€μˆ˜λ§Œ 있고 μ‹Άλ‹€. κ·Έλ ‡κ²Œ

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

int max_v = -1, min_v = 1e9+1;

void backtraking(string s, int cnt){
    for(char c : s){
        if((c-'0')&1) cnt++;    // ν™€μˆ˜ 갯수 μΉ΄μš΄νŒ…
    }
    if(s.length() == 1){
        max_v = max(max_v , cnt);
        min_v = min(min_v, cnt);
        return;
    }
    if(s.length() == 2){
        backtraking(to_string(s.front()- '0' + s.back() - '0'), cnt); // μˆ˜κ°€ 두 자리이면 2개둜 λ‚˜λˆ μ„œ 합을 κ΅¬ν•˜μ—¬ μƒˆλ‘œμš΄ 수둜 μƒκ°ν•œλ‹€.
    }
    if(s.length()>=3){
        for(int i=1; i<s.length(); i++){
            for(int k= i+1; k<s.length(); k++){
                string a = s.substr(0, i);
                string b = s.substr(i, k-i);
                string c = s.substr(i + k - i, s.length() - k);
                if(a == "") a = "0";
                if(b == "") b = "0";
                if(c == "") c = "0";
                backtraking(to_string(stoi(a) + stoi(b) + stoi(c)), cnt);
            }
        }
    }
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    string s; cin>>s;
    
    backtraking(s, 0);
    
    cout<<min_v<<' ' << max_v;
}

 

풀이

문제의 풀이 쑰건 쀑 λ‹€μŒ 쑰건을 μ²˜λ¦¬ν•˜κΈ°κ°€ κΉŒλ‹€λ‘œμ› μŠ΅λ‹ˆλ‹€.

μˆ˜κ°€ μ„Έ 자리 이상이면 μž„μ˜μ˜ μœ„μΉ˜μ—μ„œ λŠμ–΄μ„œ 3개의 수둜 λΆ„ν• ν•˜κ³ , 3개λ₯Ό λ”ν•œ 값을 μƒˆλ‘œμš΄ 수둜 μƒκ°ν•œλ‹€.

μž„μ˜μ˜ μœ„μΉ˜μ—μ„œ λŠμ–΄μ„œ 3개의 수둜 λΆ„ν• ν•΄μ•Ό ν•˜λŠ”λ°, ν•΄λ‹Ή 방법은 λ‹€μŒ 둜직과 κ°™μŠ΅λ‹ˆλ‹€.

for(int i=1; i<s.length(); i++){
            for(int k= i+1; k<s.length(); k++){
                string a = s.substr(0, i);
                string b = s.substr(i, k-i);
                string c = s.substr(i + k - i, s.length() - k);
                if(a == "") a = "0";
                if(b == "") b = "0";
                if(c == "") c = "0";
                backtraking(to_string(stoi(a) + stoi(b) + stoi(c)), cnt);
            }
        }

μœ„ 쑰건만 κ΅¬ν˜„ν•œλ‹€λ©΄ 크게 λ¬Έμ œμ—†λŠ” λ¬Έμ œμ˜€μŠ΅λ‹ˆλ‹€.

λŒ“κΈ€