본문 바로가기
삼성 코팅테스트 준비/모의 역량 테스트 문제

4008 숫자만들기

by tryotto 2020. 1. 16.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include <stdio.h>
#include <queue>
#include <utility>
#include <tuple>
 
using namespace std;
 
int num[14= { 0 };
int maxR = -100000000;
int minR = 100000000;
 
typedef struct Tmp {
    int cur;
    int score;
    int plus;
    int minus;
    int mul;
    int div;
}tmp;
 
void bfs(int len, int plusN, int minusN, int mulN, int divN) {
    queue<tmp> q;
    int cur = 1;
    int sum;
 
    q.push({1, num[1], plusN, minusN, mulN, divN});
        
    while (!q.empty()) {
        cur = q.front().cur;
        sum = q.front().score;
        int plus = q.front().plus;
        int minus = q.front().minus;
        int mul = q.front().mul;
        int div = q.front().div;
        
        q.pop();
 
        if (cur > len) {
            if (maxR < sum)
                maxR = sum;
            if (minR > sum)
                minR = sum;
 
            continue;
        }
 
        //plus
        if (plus > 0) {
            int tmpS = sum;
            tmpS += num[cur + 1];
            q.push({ cur + 1, tmpS, plus - 1, minus, mul, div });
        }
        //minus
        if (minus > 0) {
            int tmpS = sum;
            tmpS -= num[cur + 1];
            q.push({ cur + 1, tmpS, plus, minus-1, mul, div });
        }
        //mul
        if (mul > 0) {
            int tmpS = sum;
            tmpS *= num[cur + 1];
            q.push({ cur + 1, tmpS, plus, minus, mul-1, div });
        }
        //div
        if (div > 0) {
            int tmpS = sum;
            tmpS /=num[cur + 1];
            q.push({ cur + 1, tmpS, plus, minus, mul, div - 1 });    
        }
    }
}
 
int main() {
    int t;
    scanf("%d"&t);
 
    int tIdx = 1;
    while (t--) {
        maxR = -100000000;
        minR = 100000000;
 
        int n;
        scanf("%d"&n);
 
        int plus, minus, mul, div;
        scanf("%d %d %d %d"&plus, &minus, &mul, &div);
 
        for (int i = 1; i <= n; i++)
            scanf("%d"&num[i]);
        
        bfs(n - 1, plus, minus, mul, div);
                
        printf("#%d %d\n", tIdx, maxR- minR);
        tIdx++;
    }
}
cs


계속 BFS 방식으로만 문제를 해결하고 있다.
이것도 잘 해결되긴 했는데, 큐에 들어갈만한 적절한 자료형이 없어서 구조체를 선언해서 문제를 해결했다.

항상 느끼지만, 디버깅이 제일 어려운 것 같다


'삼성 코팅테스트 준비 > 모의 역량 테스트 문제' 카테고리의 다른 글

5658 보물상자 비밀번호  (0) 2020.03.02
5656 벽돌깨기  (0) 2020.03.02
5644 무선충전  (0) 2020.03.02
1952 수영장  (0) 2020.01.16
4013 특이한 자석  (0) 2020.01.15