티스토리 뷰


[BOJ 2529(S2) 리뷰]

오랜만에 백트래킹 카테고리에서 문제를 풀었다. 실버문제라 그런지 쉽게 구현을 떠올릴 수 있었다.

전형적인 백트래킹 방법을 통해서 부등호 조건에 맞지 않는 경우 가지치기를 하면 된다.

다만 출력할때 021 이런식으로 맨 앞자리에 0이 오는경우가 있으므로 문자열로 출력해야 한다.

이때 어떻게 할까 고민을하다 그냥 string객체에 max,min함수를 써봤는데 잘 동작했다.

 


#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
using namespace std;

char ans[10];
string ansmin("987654321");
string ansmax("0");
vector <char> sign;
bool isUsed[10];
int k;

void go(int n)
{
	if (n > 1)
	{
		char s = sign[n-2];
		if (s == '>')
		{
			if (ans[n - 2] < ans[n-1])
				return;
		}
		else if (s == '<')
		{
			if (ans[n - 2] > ans[n-1])
				return;
		}
	}
	if (n == k + 1)
	{
		ans[k + 1] = '\0';
		string s(ans);
		ansmax=max(s, ansmax);
		ansmin=min(s, ansmin);
		return;
	}


	for (char c = '0'; c <= '9'; c++)
	{
		if (isUsed[c - '0']) continue;
		ans[n] = c;
		isUsed[c - '0'] = 1;
		go(n + 1);
		isUsed[c - '0'] = 0;
	}

}


int main()
{
	cin.tie(0);
	ios::sync_with_stdio(0);
	
	cin >> k;
	for (int i=0;i<k;i++)
	{
		char c;
		cin >> c;
		sign.push_back(c);
	}
	
	go(0);

	cout << ansmax << '\n' << ansmin;
	
}

 

'알고리즘 풀이 > 백트래킹' 카테고리의 다른 글

BOJ : 13908 비밀번호  (0) 2021.02.08
BOJ : 1062 가르침  (0) 2021.01.11
BOJ : 14502 연구소  (0) 2020.08.21
BOJ : 15683 감시  (0) 2020.08.18
BOJ : 15686 치킨 배달  (0) 2020.08.18
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함