ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 부등호
    백준알고리즘 2019. 7. 30. 01:31
    #include<iostream>
    #include<vector>
    #include<string>
    #include<algorithm>
    using namespace std;
    
    vector<string> ans;
    int n;
    char a[20];
    bool check[10];
    
    bool budu(char x, char y, char op) {
    	if (op == '<')
    		if (x > y) return false;
    	if (op == '>')
    		if (x < y) return false;
    	return true;
    }
    
    void go(int index, string num) {
    	if (index == n + 1) {
    	
    		ans.push_back(num);
    
    		return;
    	}
    	for (int i = 0; i <= 9; i++) {
    		if (check[i]) continue;
    		if (index == 0 || budu(num[index - 1], i + '0', a[index - 1])) {
    			check[i] = true;
    			go(index + 1, num + to_string(i));
    			check[i] = false;
    		}
    	}
    }
    
    int main() {
    	cin >> n;
    	for (int i = 0; i < n; i++) {
    		cin >> a[i];
    		
    	}
    	go(0, "");
    	auto p = minmax_element(ans.begin(), ans.end());
    	cout << *p.second << '\n';
    	cout << *p.first << "\n";
    	return 0;
    
    }

    백트래킹 연습문제.. 백트래킹은 할때마다 아이디어를 어떻게 짜야할지가 정말난감하다

     

    재귀 종료조건 -> index = n+1 인 상황*(n은 자릿수 조건)에서 종료하고

    -> 일반재귀에서는, 종료시에 검사하지만, 백트래킹은 진행하면서 검사를하고 재귀를 이어나가서

    그냥 vector ans에 자료 저장 그리고 종료

     

    for문에서 -> i를썼는지, 안썼는지 확인하고, 썼으면 continue 로 넘어가기

    안썼으면 -> index = 0일 때,(시작조건) 또는 부등호를 만족할떄.. num string에서, index - 1번째와 i의 스트링으로 -> a[index-1]의 operator를 만족하면!

    check[i] 에서 i에 해당하는 값 true- > 다음 go -> 했던거 빼주기 위해 check[i] 는 다시 false로!해서하는방식이다.

    '백준알고리즘' 카테고리의 다른 글

    알파벳  (0) 2019.07.31
    N-Queen  (0) 2019.07.30
    미세먼지 안녕!  (0) 2019.07.28
    로또  (0) 2019.07.23
    일곱난쟁이  (0) 2019.07.23

    댓글

Designed by Tistory.