프로그래머스 | 타겟넘버

Algorithm 2019. 8. 27. 13:43
반응형

https://itholic.github.io/kata-target-number/

 

[kata][python] 프로그래머스 - 타겟 넘버

타겟 넘버 출처: 프로그래머스 - 타겟 넘버 문제 n개의 음이 아닌 정수가 있습니다. 이 수를 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다. -1+1+1+1+1 = 3 +1-1+1+1+1 = 3 +1+1-1+1+1 = 3 +1+1+1-1+1 = 3 +1+1+1+1-1 = 3 사용할 수 있는 숫자가 담긴 배열 numbers,타겟 넘버 target이 매개변수

itholic.github.io

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
using System;
using System.Collections.Generic;
 
namespace Application
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Console.WriteLine("타겟넘버 깊이/너비 우선 탐색 (DFS/BFS)");
            var sol = new Solution();
            //int[] numbers = { 1,1,1,1,1 };
            int[] numbers = { 123 };
            int target = 6;
            var result = sol.solution(numbers, target);
            Console.WriteLine(result);
        }
    }
 
    public class Solution
    {
        private int target;
        private int count;
        private int[] numbers;
 
        public int solution(int[] numbers, int target)
        {
            this.numbers = numbers;
            this.target = target;
            //return DFS(numbers, 0, 0);
            DFS2(0);
            return count;
        }
 
        private int DFS(int[] numbers, int idx, int num)
        {
            if (idx == numbers.Length)
            {
                return num == this.target ? 1 : 0;
            }
            else
            {
                //return DFS(numbers, idx + 1, count + numbers[idx]) + DFS(numbers, idx + 1, count - numbers[idx]);
 
                var left = DFS(numbers, idx + 1, num + numbers[idx]);
                var right = DFS(numbers, idx + 1, num - numbers[idx]);
                return left + right;
            }
        }
 
        private void DFS2(int idx) { 
            if(idx < numbers.Length) {
                numbers[idx] *= 1;
                DFS2(idx + 1);
 
                numbers[idx] *= -1;
                DFS2(idx + 1);
 
            }
            else {
                int sum = 0;
                foreach(var n in numbers) {
                    sum += n;
                }
                if(sum == this.target) {
                    count++;
                }
            }
        }
    }
}
 
 
 
반응형
: