티스토리 뷰

PS

[백준] 2529번 부등호 C++

Eastplanet 2022. 6. 24. 15:59

문제 출처: https://www.acmicpc.net/problem/2529

 

2529번: 부등호

여러분은 제시된 부등호 관계를 만족하는 k+1 자리의 최대, 최소 정수를 첫째 줄과 둘째 줄에 각각 출력해야 한다. 단 아래 예(1)과 같이 첫 자리가 0인 경우도 정수에 포함되어야 한다. 모든 입력

www.acmicpc.net

백트래킹을 통해 모든 경우의 수를 확인해보며 만족할 경우 max와 min을 갱신하여 해결.

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include <string>

using namespace std;


string arr;
int N;
long long minV = 12345678911;
long long maxV  = 0;

long long change(string a) {
    long long sum = 0;
    for (int i = 0; i < a.size(); i++) {
        sum *= 10;
        sum = sum + (a[i] - '0');
    }
    return sum;
}

string revChange(long long a) {
    string temp;

    temp = to_string(a);
    
    if (temp.size() == N) {
        string temp2;
        temp2 += "0";
        temp2 += temp;
        return temp2;
    }
    else {
        return temp;
    }
}

void sub(string a) {
    if (a.size() == N + 1) {
        long long val = change(a);
        if (val > maxV)
            maxV = val;

        if (val < minV)minV = val;
        return;
    }
    
    if (a.size() == 0) {
        for (int i = 0; i < 10; i++) {
            string temp = a;
            temp += (i + '0');
            sub(temp);
        }
    }
    else {
        int visited[10] = {};
        for (int i = 0; i < a.size(); i++) {
            visited[(a[i] - '0')] = 1;
        }

        for (int i = 0; i < 10; i++) {
            if (visited[i] == 1)continue;

            int idx = a.size() - 1;
            if (idx == -1)idx = 0;
            int prev = (a[idx] - '0');
            char cmp = arr[idx];

            if (cmp == '>') {
                if (prev > i) {
                    visited[i] = 1;
                    string temp = a;
                    temp += (i + '0');
                    sub(temp);
                    visited[i] = 0;
                }
            }
            else {
                if (prev < i) {
                    visited[i] = 1;
                    string temp = a;
                    temp += (i + '0');
                    sub(temp);
                    visited[i] = 0;
                }
            }

        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> N;
    for (int i = 0; i < N; i++) {
        char temp;
        cin >> temp;
        arr += temp;
    }

    string temp = "";

    sub(temp);

    cout << revChange(maxV) << '\n';
    cout << revChange(minV) << '\n';


}

'PS' 카테고리의 다른 글

[백준] 17484번 진우의 달 여행 (Small)  (0) 2022.06.24
[백준] 1535번 안녕 C++  (0) 2022.06.24
[백준] 1240번 노드사이의 거리 C++  (0) 2022.06.24
[백준] 2294번 동전2 C++  (0) 2022.06.23
[백준] 14606번 피자(small)  (0) 2022.06.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
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
글 보관함