이 문제는 분류에 위상정렬로 되어있지만 위상정렬로 구현하기보다는
백트래킹을 이용하는 방법이 더 좋은 방법이라고 생각했다.
입력을 받는부분에서 실수를 해서 애를 좀 먹었다.
다른 분들의 블로그를 보았는데 깔끔하게 해결한 코드가 보이지는 않았다.
#include <iostream> #include <algorithm> #include <vector> #include <string.h> #include <math.h> #include <queue> #include <utility> #include <functional> #define MAX 40005 #define MOD 1000000007 #pragma warning(disable:4996) using namespace std; int n,cnt=0,mx[15],mi[15]; vector<char> op; void backtrack(int cur,int arr[]) { if (cur == 0) return; if (op[cur-1] == '>' && arr[cur - 1] > arr[cur]) return; if (op[cur-1] == '<' && arr[cur - 1] < arr[cur]) return; // 부등호가 성립하면 종료시킨다. swap(arr[cur - 1], arr[cur]); // 부등호가 성립하지 않는다면 이전의 위치와 바꿔준다 backtrack(cur - 1, arr); // 재귀를 이용하여 이전의 위치로 이동한다. } int main() { scanf("%d", &n); while (cnt!=n) { char tmp; scanf("%c", &tmp); if (tmp == '<' || tmp == '>') { cnt++; op.push_back(tmp); } } // op 벡터에 부등호를 입력받아온다. mx[0]=9; mi[0]=0; for (int i = 1; i <= n; i++) { mx[i] = 9 - i; backtrack(i,mx); mi[i] = i; backtrack(i,mi); } // 최대 값에는 내림차순으로, 최소 값에는 오름차순으로 배열에 추가한다. // 이후 백트래킹을 이용하여 해결한다. for (int i = 0; i < n+1; i++) printf("%d", mx[i]); printf("\n"); for (int i = 0; i < n+1; i++) printf("%d", mi[i]); return 0; }
'IT > BOJ' 카테고리의 다른 글
백준(BOJ) 1931 로프 * (0) | 2018.06.01 |
---|---|
백준(BOJ) 1946 신입사원 * (0) | 2018.06.01 |
백준(BOJ) 1759 암호만들기 * (0) | 2018.06.01 |
백준(BOJ) 1720번 타일 코드 *** (0) | 2018.06.01 |
백준(BOJ) 14501 퇴사 * (0) | 2018.06.01 |