티스토리 뷰

소요 시간 1시간

난이도 별하나

 

규칙을 찾기 보다 dfs로 만들고, 중복제거하고, 정렬(nlogn)하는 것이 맞는듯.

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

char arr[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
string new_arr = "";
set<int> answer;

void dfs(int length)
{
    if (new_arr.size() == length)
    {
        // 666이 가장 앞에 삽입될 경우
        string s;
        s = "666" + new_arr;
        answer.insert(stoi(s));

        // 666이 중간에 삽입될 경우
        for (int i = 1; i < length; i++)
        {
            s = new_arr.substr(0, i) + "666" + new_arr.substr(i, length);
            if (s[0] == '0')
                continue;
            answer.insert(stoi(s));
        }

        // 666이 가장 뒤에 삽입될 경우
        if (new_arr[0] != '0')
        {
            s = new_arr + "666";
            answer.insert(stoi(s));
        }

        return;
    }

    for (int i = 0; i < 10; i++)
    {
        new_arr.push_back(arr[i]);
        dfs(length);
        new_arr.pop_back();
    }
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);

    int N;
    scanf("%d", &N);

    answer.insert(666);
    int length = 1;
    while (1)
    {
        dfs(length);
        if (answer.size() >= N)
        {
            break;
        }
        length++;
    }

    vector<int> v;
    v.assign(answer.begin(), answer.end()); // 중복제거 중요 예) Dfs에서 66이 만들어졌을경우 앞 가운데 뒤 666을 삽입한 값은 모두 같다.
    sort(v.begin(), v.end());
    cout << v[N - 1];
}

'알고리즘 > [문제풀이] BOJ' 카테고리의 다른 글

[BOJ] 2992 - 쿼드트리  (0) 2022.03.09
[BOJ] 23290 - 마법사 상어와 복제  (0) 2022.03.06
[BOJ] 17825 - 주사위 윷놀이  (0) 2021.10.22
[BOJ] 20061 - 모노미노도미노 2  (0) 2021.10.22
[BOJ] 17142 - 연구소 3  (0) 2021.10.22
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/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
글 보관함