본문 바로가기
IT/BOJ

백준(BOJ) 2629 부등호 *

by 빨강자몽 2018. 6. 1.

이 문제는 분류에 위상정렬로 되어있지만 위상정렬로 구현하기보다는
백트래킹을 이용하는 방법이 더 좋은 방법이라고 생각했다.

입력을 받는부분에서 실수를 해서 애를 좀 먹었다.
다른 분들의 블로그를 보았는데 깔끔하게 해결한 코드가 보이지는 않았다.


#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