[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] N ์œผ๋กœ ํ‘œํ˜„

2021. 7. 17. 18:14ใ†ETC/Algorithm

๐Ÿ‘Š๐Ÿป ๋ฌธ์ œ

์•„๋ž˜์™€ ๊ฐ™์ด 5์™€ ์‚ฌ์น™์—ฐ์‚ฐ๋งŒ์œผ๋กœ 12๋ฅผ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

12 = 5 + 5 + (5 / 5) + (5 / 5)
12 = 55 / 5 + 5 / 5
12 = (55 + 5) / 5

5๋ฅผ ์‚ฌ์šฉํ•œ ํšŸ์ˆ˜๋Š” ๊ฐ๊ฐ 6,5,4 ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด์ค‘ ๊ฐ€์žฅ ์ž‘์€ ๊ฒฝ์šฐ๋Š” 4์ž…๋‹ˆ๋‹ค.
์ด์ฒ˜๋Ÿผ ์ˆซ์ž N๊ณผ number๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ, N๊ณผ ์‚ฌ์น™์—ฐ์‚ฐ๋งŒ ์‚ฌ์šฉํ•ด์„œ ํ‘œํ˜„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ์ค‘ N ์‚ฌ์šฉํšŸ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์„ธ์š”.

 

์ œํ•œ์‚ฌํ•ญ

  • N์€ 1 ์ด์ƒ 9 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • number๋Š” 1 ์ด์ƒ 32,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ์ˆ˜์‹์—๋Š” ๊ด„ํ˜ธ์™€ ์‚ฌ์น™์—ฐ์‚ฐ๋งŒ ๊ฐ€๋Šฅํ•˜๋ฉฐ ๋‚˜๋ˆ„๊ธฐ ์—ฐ์‚ฐ์—์„œ ๋‚˜๋จธ์ง€๋Š” ๋ฌด์‹œํ•ฉ๋‹ˆ๋‹ค.
  • ์ตœ์†Ÿ๊ฐ’์ด 8๋ณด๋‹ค ํฌ๋ฉด -1์„ return ํ•ฉ๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

N number return
5 12 4
2 11 3

 

๐ŸŽƒ ๋ฌธ์ œ ํ•ด๊ฒฐ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• - DP

โœ”๏ธ ํ•œ ๊ฐœ๋ถ€ํ„ฐ ์—ฌ๋Ÿ ๊ฐœ๊นŒ์ง€ N์„ ์‚ฌ์šฉํ•œ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜(๋ณ€์ˆ˜ i)๋ฅผ ์‚ฌ์šฉํ•œ ๊ฐœ์ˆ˜์˜ ์ธ๋ฑ์Šค์— ๋ฐฐ์—ด๋กœ ์ €์žฅํ•œ๋‹ค.

       ex) N:5์ผ ๋•Œ, 2๊ฐœ๋ฅผ ์‚ฌ์šฉํ–ˆ๋‹ค๋ฉด possible[2] = {55, 10, 0, 25, 1} (์ˆœ์„œ๋Œ€๋กœ : ์‚ฌ์น™์—ฐ์‚ฐ X, 5+5, 5-5, 5*5, 5/5 ์ธ ๊ฒฝ์šฐ๋ฅผ ์ €์žฅ)

โœ”๏ธ N์„ ์‚ฌ์šฉํ•œ ๊ฐœ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ์—๋Š”, ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๋‚˜๋ˆ„์–ด ์ด๋ฏธ ๊ณ„์‚ฐํ•œ ๊ฐ’๋“ค์„ ๋ถˆ๋Ÿฌ์™€ ๊ณ„์‚ฐํ•œ๋‹ค.

      ex) N:5์ด๊ณ  4๊ฐœ๋ฅผ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” (0, 4)(1, 3)(2, 2)(3, 1) -> ์ฝ”๋“œ์—์„œ (left, right) ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.

            -> ํ•œ ๊ฐœ, ๋‘ ๊ฐœ, ์„ธ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•œ ๊ฒฝ์šฐ๋Š” pos[] ์— ์ €์žฅ๋˜์–ด์žˆ์œผ๋‹ˆ ํ™œ์šฉ

โœ”๏ธ number๊ฐ€ ๋‚˜์˜ค๋ฉด answer์— ์ €์žฅ ํ›„ ์กฐ๊ฑด์ ˆ๋กœ break ๊ฑธ์–ด๋‘๊ธฐ

โœ”๏ธ ์ฃผ์˜! ๋‚˜๋ˆ„๊ธฐํ•  ๋•Œ์—๋Š” 0 ๊ฑธ๋Ÿฌ์ฃผ๊ธฐ

์ฝ”๋“œ

#include <string>
#include <vector>
#include <unordered_set>

using namespace std;

int solution(int N, int number) {
    int answer = -1;
    vector<unordered_set<int>> pos(9);
    
    for (int i=1; i<=8;i++) {             // ์กฐ๊ฑด : N์€ ์ตœ๋Œ€ 8๊ฐœ๊นŒ์ง€ ์‚ฌ์šฉ
        string s(i, N + '0');             // ์‚ฌ์น™์—ฐ์‚ฐ ์•ˆ์“ธ ๋•Œ
        pos[i].insert(stoi(s));
        if (stoi(s) == number) answer = i;
        if (answer > 0) break;            // ์ •๋‹ต๋‚˜์˜ค๋ฉด ํƒˆ์ถœ
        for (int l=1; l<i; l++) {         // N ์‚ฌ์šฉ ๊ฐœ์ˆ˜์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ : left
            for (int a : pos[l]) {
                for (int b : pos[i-l]) {  // N ์‚ฌ์šฉ ๊ฐœ์ˆ˜์˜ ๋‚˜๋จธ์ง€ ๊ฒฝ์šฐ์˜ ์ˆ˜ : right
                    if (a+b == number || a-b == number || a*b == number || (b!=0 && a/b == number))
                        answer = i;
                    pos[i].insert(a+b);
                    pos[i].insert(a-b);
                    pos[i].insert(a*b);
                    if (b != 0) pos[i].insert(a/b);
                }
            }
        }
    }
    
    return answer;
}