[백준 7490번] 0 만들기
2017. 8. 8. 22:12ㆍ알고리즘/백준
반응형
풀이
공백, +, - 를 재귀를 통해 다 넣어보고 부호가 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 |
[백준 1992번] 쿼드트리 (2) | 2017.08.01 |
[백준 9935번]문자열 폭발 (1) | 2017.07.28 |
[백준 2089번] -2진수 (0) | 2017.07.28 |