몽셀통통의 블로그
[BaekJoon] 2529 부등호 :: monton 본문
문제
https://www.acmicpc.net/problem/2529
풀이
이 문제는 모든 경우의 수를 완전 탐색 해야하므로 dfs를 사용!
visit 함수를 사용해서 0~9까지 각 수를 한번만 포함하는 K+1개의 숫자를 만들었다
min과 max를 배열로 지정한 이유는 min에서 맨앞의 자리수가 0일수도 있기 때문이다
지저분하게 짰는데 나중에 다시 보아야 겠다
코드
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 | #include <iostream> using namespace std; int K; char arr[11]; int Min[11], Max[11],visit[11],temp[11]; void copyarr(int arr[],int temp[]) { for (int i = 0; i < K + 1; i++) arr[i] = temp[i]; } void func(int num,int cnt,int n) { if (cnt == K) { //현재값이 min, max 값과 비교하여 적절히 바꿔주기 int flag = 0; for (int i = 0; i < K + 1; i++) { if (Max[i] > temp[i]) break; if (Max[i] == temp[i]) continue; copyarr(Max, temp); } for (int i = 0; i < K + 1; i++) { if (Min[i] < temp[i]) break; if (Min[i] == temp[i]) continue; copyarr(Min, temp); } return; } for (int i = 0; i < 10; i++) { if (!visit[i]) { visit[i] = 1; if (arr[n] == '<'&&num < i) temp[cnt+1]=i, func(i, cnt + 1, n + 1); if (arr[n] == '>'&&num > i) temp[cnt+1] = i, func(i, cnt + 1, n + 1); visit[i] = 0; } } } int main() { cin >> K; for (int i = 0; i < K; i++) cin >> arr[i]; for (int i = 0; i < K + 1; i++) Min[i] = 9, Max[i] = 0; for (int i = 0; i < 10; i++) temp[0] = i, visit[i] = 1, func(i, 0, 0), visit[i] = 0; for (int i = 0; i < K + 1; i++) cout <<Max[i]; puts(""); for (int i = 0; i < K + 1; i++) cout << Min[i]; } | cs |
'프로그래밍 > 백준 문제 풀기' 카테고리의 다른 글
[BaekJoon] 1941 소문난 칠공주 :: monton (0) | 2018.10.08 |
---|---|
[BaekJoon] 1261 알고스팟 :: monton (0) | 2018.08.30 |
[BaekJoon] 1759 암호 만들기 :: monton (0) | 2018.08.30 |
[BaekJoon] 2589 보물섬 :: monton (0) | 2018.08.30 |
[BaekJoon] 1261 알고스팟 :: monton (0) | 2018.08.29 |