๐Ÿ•๏ธ ICPC Sinchon/Backtracking

[BOJ][C++] ๋ฐฑ์ค€ 14888๋ฒˆ: ์—ฐ์‚ฐ์ž ๋ผ์›Œ๋„ฃ๊ธฐ

์„ ๋‹ฌ 2023. 7. 6. 01:30
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/14888

 

14888๋ฒˆ: ์—ฐ์‚ฐ์ž ๋ผ์›Œ๋„ฃ๊ธฐ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(2 ≤ N ≤ 11)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 100) ์…‹์งธ ์ค„์—๋Š” ํ•ฉ์ด N-1์ธ 4๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, ์ฐจ๋ก€๋Œ€๋กœ ๋ง์…ˆ(+)์˜ ๊ฐœ์ˆ˜, ๋บ„์…ˆ(-)์˜ ๊ฐœ์ˆ˜, ๊ณฑ

www.acmicpc.net

 

๋ฌธ์ œ

N๊ฐœ์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. ๋˜, ์ˆ˜์™€ ์ˆ˜ ์‚ฌ์ด์— ๋ผ์›Œ๋„ฃ์„ ์ˆ˜ ์žˆ๋Š” N-1๊ฐœ์˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์—ฐ์‚ฐ์ž๋Š” ๋ง์…ˆ(+), ๋บ„์…ˆ(-), ๊ณฑ์…ˆ(×), ๋‚˜๋ˆ—์…ˆ(÷)์œผ๋กœ๋งŒ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ˆ˜์™€ ์ˆ˜ ์‚ฌ์ด์— ์—ฐ์‚ฐ์ž๋ฅผ ํ•˜๋‚˜์”ฉ ๋„ฃ์–ด์„œ, ์ˆ˜์‹์„ ํ•˜๋‚˜ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์ด๋•Œ, ์ฃผ์–ด์ง„ ์ˆ˜์˜ ์ˆœ์„œ๋ฅผ ๋ฐ”๊พธ๋ฉด ์•ˆ ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 6๊ฐœ์˜ ์ˆ˜๋กœ ์ด๋ฃจ์–ด์ง„ ์ˆ˜์—ด์ด 1, 2, 3, 4, 5, 6์ด๊ณ , ์ฃผ์–ด์ง„ ์—ฐ์‚ฐ์ž๊ฐ€ ๋ง์…ˆ(+) 2๊ฐœ, ๋บ„์…ˆ(-) 1๊ฐœ, ๊ณฑ์…ˆ(×) 1๊ฐœ, ๋‚˜๋ˆ—์…ˆ(÷) 1๊ฐœ์ธ ๊ฒฝ์šฐ์—๋Š” ์ด 60๊ฐ€์ง€์˜ ์‹์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ์‹์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  • 1+2+3-4×5÷6
  • 1÷2+3+4-5×6
  • 1+2÷3×4-5+6
  • 1÷2×3-4+5+6

์‹์˜ ๊ณ„์‚ฐ์€ ์—ฐ์‚ฐ์ž ์šฐ์„  ์ˆœ์œ„๋ฅผ ๋ฌด์‹œํ•˜๊ณ  ์•ž์—์„œ๋ถ€ํ„ฐ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. ๋˜, ๋‚˜๋ˆ—์…ˆ์€ ์ •์ˆ˜ ๋‚˜๋ˆ—์…ˆ์œผ๋กœ ๋ชซ๋งŒ ์ทจํ•œ๋‹ค. ์Œ์ˆ˜๋ฅผ ์–‘์ˆ˜๋กœ ๋‚˜๋ˆŒ ๋•Œ๋Š” C++14์˜ ๊ธฐ์ค€์„ ๋”ฐ๋ฅธ๋‹ค. ์ฆ‰, ์–‘์ˆ˜๋กœ ๋ฐ”๊พผ ๋’ค ๋ชซ์„ ์ทจํ•˜๊ณ , ๊ทธ ๋ชซ์„ ์Œ์ˆ˜๋กœ ๋ฐ”๊พผ ๊ฒƒ๊ณผ ๊ฐ™๋‹ค. ์ด์— ๋”ฐ๋ผ์„œ, ์œ„์˜ ์‹ 4๊ฐœ์˜ ๊ฒฐ๊ณผ๋ฅผ ๊ณ„์‚ฐํ•ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • 1+2+3-4×5÷6 = 1
  • 1÷2+3+4-5×6 = 12
  • 1+2÷3×4-5+6 = 5
  • 1÷2×3-4+5+6 = 7

N๊ฐœ์˜ ์ˆ˜์™€ N-1๊ฐœ์˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์‹์˜ ๊ฒฐ๊ณผ๊ฐ€ ์ตœ๋Œ€์ธ ๊ฒƒ๊ณผ ์ตœ์†Œ์ธ ๊ฒƒ์„ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์ˆ˜์˜ ๊ฐœ์ˆ˜ N(2 ≤ N ≤ 11)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์—๋Š” A1, A2, ..., AN์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ Ai ≤ 100) ์…‹์งธ ์ค„์—๋Š” ํ•ฉ์ด N-1์ธ 4๊ฐœ์˜ ์ •์ˆ˜๊ฐ€ ์ฃผ์–ด์ง€๋Š”๋ฐ, ์ฐจ๋ก€๋Œ€๋กœ ๋ง์…ˆ(+)์˜ ๊ฐœ์ˆ˜, ๋บ„์…ˆ(-)์˜ ๊ฐœ์ˆ˜, ๊ณฑ์…ˆ(×)์˜ ๊ฐœ์ˆ˜, ๋‚˜๋ˆ—์…ˆ(÷)์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์‹์˜ ๊ฒฐ๊ณผ์˜ ์ตœ๋Œ“๊ฐ’์„, ๋‘˜์งธ ์ค„์—๋Š” ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ์—ฐ์‚ฐ์ž๋ฅผ ์–ด๋–ป๊ฒŒ ๋ผ์›Œ๋„ฃ์–ด๋„ ํ•ญ์ƒ -10์–ต๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10์–ต๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๋Š” ์ž…๋ ฅ๋งŒ ์ฃผ์–ด์ง„๋‹ค. ๋˜ํ•œ, ์•ž์—์„œ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ–ˆ์„ ๋•Œ, ์ค‘๊ฐ„์— ๊ณ„์‚ฐ๋˜๋Š” ์‹์˜ ๊ฒฐ๊ณผ๋„ ํ•ญ์ƒ -10์–ต๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 10์–ต๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

 

ํ’€์ด

#include <iostream>
#include <vector>

using namespace std;

int n;

vector<int> number;
vector<int> oper(4);

int mmax = -1000000001;
int mmin = 1000000001;

int calculate(int a, int b, int op) {
    if(op==0) return a+b;
    if(op==1) return a-b;
    if(op==2) return a*b;
    if(op==3) return a/b;
    return -1;
}

void bt(int cur, int idx) {
    if(idx == n) {
        mmax = max(mmax, cur);
        mmin = min(mmin, cur);
        return;
    }
    
    for(int op=0; op<4; op++) {
        if(oper[op]<=0)
            continue;
        int next = calculate(cur, number[idx], op);
        oper[op]--;
        bt(next, idx+1);
        oper[op]++;
    }
}

int main() {
    // ์ž…๋ ฅ
    cin >> n;
    number.assign(n,-1);
    for(int i=0; i<n; i++) {
        cin >> number[i];
    }
    for(int i=0; i<4; i++) {
        cin >> oper[i];
    }
    
    // ์—ฐ์‚ฐ
    bt(number[0], 1);
    
    // ์ถœ๋ ฅ
    cout << mmax << "\n" << mmin;
    
    return 0;
}
๋ฐ˜์‘ํ˜•