Algorithm/BOJ

[BOJ] μ—°μ‚°μž λΌμ›Œλ„£κΈ°(14888)

vividswan 2022. 3. 6. 00:02

[λ°±μ€€(BOJ)] 폴짝폴짝(1326) C++

문제 : BOJ_14888번 μ—°μ‚°μž λΌμ›Œλ„£κΈ°

문제 μ„€λͺ…

완전탐색, dfs

1~NκΉŒμ§€ 수 사이사이에 νšŸμˆ˜κ°€ μ •ν•΄μ ΈμžˆλŠ” μ—°μ‚°μžλ₯Ό λΌμ›Œ 넣을 λ•Œ, μ΅œλŒ“κ°’κ³Ό μ΅œμ†Ÿκ°’μ„ 좜λ ₯ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.


Solution

이 λ¬Έμ œλŠ” μ΅œλŒ“κ°’κ³Ό μ΅œμ†Ÿκ°’μ„ λͺ¨λ‘ ꡬ해야 되기 λ•Œλ¬Έμ— μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” λͺ¨λ“  경우의 수λ₯Ό ν™•μΈν•˜λŠ” μ™„μ „ 탐색을 μ΄μš©ν•΄μ•Ό ν•˜λŠ”λ°,
μ‹œκ°„ λ³΅μž‘λ„κ°€ μ΄ˆκ³Όλ˜μ§€ μ•Šκ²Œ μ œν•œλœ κ°€μž₯ 큰 경우의 수λ₯Ό 생각해보아야 ν•©λ‹ˆλ‹€.

μ—°μ‚°μžμ˜ νšŸμˆ˜κ°€ μ•Œλ§žκ²Œ μ •ν•΄μ Έμžˆμ§€λ§Œ, κ°€μž₯ 큰 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ³ λ €ν•˜κΈ° μœ„ν•΄μ„œ μ—°μ‚°μžλ₯Ό μ œν•œ 없이 μ“Έ 수 μžˆλ‹€κ³  κ°€μ •ν•œλ‹€λ©΄,

수의 개수 N의 μ΅œλŒ€κ°€ 11μž„μœΌλ‘œ, μ—°μ‚°μžκ°€ λ“€μ–΄κ°ˆ 수 μžˆλŠ” μžλ¦¬κ°€ 10 자리이고, 10자 λ¦¬λ§ˆλ‹€ 4개의 μ—°μ‚°μžκ°€ λ“€μ–΄κ°ˆ 수 있기 λ•Œλ¬Έμ—,

κ°€μž₯ 큰 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό 생각해본닀고 해도, 4^10= 1,048,576 인 100만 μ •λ„μ˜ μˆ˜μž„μœΌλ‘œ μž¬κ·€ ν•¨μˆ˜λ₯Ό μ΄μš©ν•œ μ™„μ „ 탐색을 어렡지 μ•Šκ²Œ ν•΄λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.


Description

  1. 1~NκΉŒμ§€μ˜ 수 μ‚¬μ΄μ‚¬μ΄λ§ˆλ‹€ λͺ¨λ“  경우의 수λ₯Ό ν™•μΈν•˜λŠ” μž¬κ·€ ν•¨μˆ˜ μ†ŒμŠ€λ₯Ό λ§Œλ“œλŠ” 게 이 문제의 해결법
  2. void dfs(int res, int conut) ν˜•μ‹μœΌλ‘œ λ§Œλ“€μ–΄ μž¬κ·€λ‘œ ν•¨μˆ˜κ°€ λ“€μ–΄κ°ˆ λ•Œ λ§ˆλ‹€ κ²°κ³Όκ°’κ³Ό μΉ΄μš΄νŠΈκ°’μ„ 체크
  3. λ¬Έμ œμ—μ„œ 주어진 μ΅œλŒ“κ°’μ„ min_res둜 μ΄ˆκΈ°ν™”, μ΅œμ†Ÿκ°’μ„ max_res둜 μ΄ˆκΈ°ν™”ν•˜κ³  μ‹œμž‘
#include <iostream>
using namespace std;
int roof, arr[12], sub[5];
void dfs(int res, int count);
int max_res = -1000000000, min_res= 1000000000; // λ¬Έμ œμ—μ„œ μ€€ κ°€μž₯ 큰 수λ₯Ό min_res에, κ°€μž₯ μž‘μ€ 수λ₯Ό max_res에 미리 μ„ μ–Έ
int main(void) {
    cin >> roof;
    for (int i = 0; i < roof; i++) {
        cin >> arr[i];
    }
    for (int i = 0; i < 4; i++) {
        cin >> sub[i]; // sub배열은 1번 λ°°μ—΄ μˆœμ„œλΆ€ν„° 주어진 μ—°μ‚°μžμ˜ 갯수λ₯Ό λ„£μ–΄μ€€λ‹€.
    }
    dfs(arr[0], 0);
    printf("%d\n%d", max_res, min_res);
    return 0;
}
void dfs(int res, int count) {
    if (count == roof - 1) { // 1~NκΉŒμ§€μ˜ 수 라면, μ—°μ‚°μžμ˜ μˆ˜λŠ” N-1μž„μœΌλ‘œ roof-1
        if (res < min_res) min_res = res;
        if (res > max_res) max_res = res;
        return;
    }
    // μ—¬κΈ°μ„œλΆ€ν„° λ„€ κ°€μ§€μ˜ μ—°μ‚°μžμ— λŒ€ν•œ λͺ¨λ“  μž¬κ·€ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•œλ‹€.
    if (sub[0] > 0) { // sub[i] > 0 은 μ—°μ‚°μžλ₯Ό μ‚¬μš©ν•  수 μžˆλŠ” 쑰건
        sub[0]--;
        dfs(res + arr[count + 1], count + 1);
        sub[0]++;
    }
    if (sub[1] > 0) {
        sub[1]--;
        dfs(res - arr[count + 1], count + 1);
        sub[1]++;
    }
    if (sub[2] > 0) {
        sub[2]--;
        dfs(res * arr[count + 1], count + 1);
        sub[2]++;
    }
    if (sub[3] > 0) {
        sub[3]--;
        dfs(res / arr[count + 1], count + 1);
        sub[3]++;
    }
}