본문 바로가기
알고리즘/백준 문제

1138 - 한 줄로 서기

by HDobby 2023. 7. 19.

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

 

1138번: 한 줄로 서기

첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다. 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명이 있었는지 주어진다. i번째 수는 0보다

www.acmicpc.net

과정

  1. 만약 앞에 최소 2명의 큰 사람이 있다면 인덱스를 0부터 시작할 필요가 없다.
  2. 큰 사람의 수에서 인덱스를 시작하자
  3. 하나씩 넣어가며 dfs를 돌리고 조건을 만족하면 종료하자

코드

#include<iostream>

using namespace std;

int N;
int jul[11];
int arr[11];

void input(){
    cin>>N;
    for(int i=0;i<N;++i){
        cin>>arr[i];
    }
}

bool dfs(int now){
    if(now == N){
        for(int i=0;i<N;++i){
            int cnt = 0;
            int node = i+1;

            for(int j=0;jul[j]!=node;++j)
                if(jul[j] > node)
                    ++cnt;

            if(cnt != arr[node-1])
                return false;
        }

        return true;
    }
        
    for(int i=arr[now];i<N;++i){
        if(jul[i]==0){
            jul[i] = now+1;
            if(dfs(now+1))
                return true;
            jul[i] = 0;
        }
    }


    return false;
}

void solution(){
    dfs(0);
    
    for(int i=0;i<N;++i)
        cout<<jul[i]<<" ";
}

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

    input();
    solution();

    return 0;
}

728x90

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

2075 - N번째 큰 수  (0) 2023.07.21
14658 - 하늘에서 별똥별이 빗발친다  (0) 2023.07.20
24042 - 횡단보도  (0) 2023.07.19
1522 - 문자열 교환  (0) 2023.07.18
1911 - 흙길 보수하기  (0) 2023.07.18

댓글