티스토리 뷰



풀이


공백, +, - 를 재귀를 통해 다 넣어보고 부호가 n-1개 만큼 채워졌을 경우 0이 만들어지는지 연산해본다.


출력의 숫자는 항상 1부터 n까지 오름차순이므로 따로 저장하지 않는다. (char배열로 입력해두어도 되지만 나중에 공백을 처리하기가 어려워진다.)



소스코드


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
#include <iostream>
using namespace std;
 
int n;
char w[10];
 
int make(int x, int y) {
    int ret=x;
    for (int i = x+1; i <= y; i++) {
        ret = ret * 10 + i;
    }
    return ret;
}
 
void m(int idx) {
    if (idx == n - 1) {
        int fidx=0,start=1,tmp=1,num=1,result=0;
        //처음 숫자
        while (1) {
            if (w[fidx] != ' ')
                break;
            fidx++;
        }
        result = make(1, fidx + 1);
        start = fidx + 2;
        // 처음숫자가 123일 경우 플러스(마이너스)가 나오면 그다음 부호나올때까지 탐색후 덧셈(뺄셈)
        while (1) {
            if (fidx == n - 1)
                break;
            if (w[fidx] == '+') { // +를 찾았을 경우 
                int cur = fidx+1// 현재 지점 다음부터 탐색
                while (1) {
                    if (w[cur] == '+' || w[cur] == '-')  // 다음 부호가 나온경우
                        break;
                    if (cur == n - 1)  // 끝지점 까지 갔을경우
                        break;
                    cur++;
                }
                // cur -> 다음부호의 위치
                result += make(fidx + 2, cur + 1);
                fidx = cur; // 그다음 탐색값을 현재 위치부터로 바꿈
            }
            else if (w[fidx] == '-') { // -를 찾았을 경우 
                int cur = fidx + 1// 현재 지점 다음부터 탐색
                while (1) {
                    if (w[cur] == '+' || w[cur] == '-')  // 다음 부호가 나온경우
                        break;
                    if (cur == n - 1)
                        break;
                    cur++;
                }
                // cur -> 다음부호의 위치
                result -= make(fidx + 2, cur + 1);
                fidx = cur; // 그다음 탐색값을 현재 위치부터로 바꿈
            }
        }
 
        if (result == 0) {
            for (int i = 0; i < n-1; i++) {
                cout << i+1 << w[i];
            }
            cout << n << '\n';
        }
        return;
    }
 
    w[idx] = ' ';
    m(idx + 1);
    w[idx] = '+';
    m(idx + 1);
    w[idx] = '-';
    m(idx + 1);
}
 
int main() {
    int tc;
    cin >> tc;
    while (tc>0) {
        cin >> n;
        m(0);
        cout << '\n';
        tc--;
    }
    return 0;
}
cs


'알고리즘 > 백준' 카테고리의 다른 글

[백준 1057번] 토너먼트  (0) 2017.08.14
[백준 3055번] 탈출  (0) 2017.08.09
[백준 7490번] 0 만들기  (2) 2017.08.08
[백준 1992번] 쿼드트리  (2) 2017.08.01
[백준 9935번]문자열 폭발  (1) 2017.07.28
[백준 2089번] -2진수  (0) 2017.07.28
댓글
  • 프로필사진 비밀댓글입니다 2018.01.04 21:56
  • 프로필사진 광혁 어떻게 출력되시는지 알수있을까요?
    백준에서는 동일한 코드로 채점하고 통과하였습니다. 캡쳐본이 있으시다면 an2416@naver.com으로 남겨주시면 확인후 답변드리겠습니다.
    감사합니다 :)
    2018.01.05 15:39 신고
댓글쓰기 폼
공지사항
Total
12,203
Today
11
Yesterday
54
링크
TAG
more
«   2018/04   »
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