코딩테스트/MySQL

[ 백준 BOJ ] 1138번 - 한 줄로 서기 (C++)

최-코드 2025. 5. 7. 13:58

https://www.acmicpc.net/problem/1138

 

생각 흐름

  • N의 최댓값은 10으로 완전 탐색을 돌려도 충분히 시간 안에 풀릴 거 같았다.
  • 이 때 시간을 줄여보고자 dfs 돌 때마다 조건에 만족하는지 체크해줬다.
#include <iostream>
#include <vector>

using namespace std;

int N;
vector<int> v;
bool checked[10];
vector<int> answer;
bool isEnd;

void dfs(vector<int> order, int depth){
    if(isEnd){
        return;
    }
    for(int i = 0; i<order.size(); i++){
        int sum = 0;
        for(int j = 0; j<i; j++){
            if(order[j]>order[i]){
                sum++;
            }
        }
        if(sum!=v[order[i]]) return;
    }
    
    if(depth==N){
        answer = order;
        isEnd=true;
        
        return;
    }
    
    for(int i = 0; i<N; i++){
        if(checked[i]) continue;
        if(isEnd) return;
        
        checked[i] = true;
        order.push_back(i);
        dfs(order, depth+1);
        checked[i] = false;
        order.pop_back();
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    
    cin>>N;
    for(int i = 0; i<N; i++){
        int tmp;
        cin>>tmp;
        
        v.push_back(tmp);
    }
    
    dfs(answer, 0);
    
    for(int i = 0; i<N; i++){
        cout<<answer[i]+1<<" ";
    }
    cout<<endl;

    return 0;
}