본문 바로가기
알고리즘/알고리즘 문제풀이

[BOJ-1138] 한 줄로 서기

by E145 2021. 8. 21.
반응형

준 1138 한 줄로 서기

 

 

1138번: 한 줄로 서기

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

www.acmicpc.net

 

문제 설명

 

 - N명의 사람들은 매일 아침 한 줄로 선다.

 

 - 이 사람들은 오민식의 지시대로 선다.

 

 - 사람들은 자기보다 큰 사람이 왼쪽에 몇 명 있었는지만을 기억한다.

 

 - N명의 사람이 있고, 사람들의 키는 1부터 N까지 모두 다르다.

 

 - 각 사람들이 기억하는 정보가 주어질 때, 줄을 선 순서대로 출력하라.

 


 

입력 값

 

 - 첫째 줄에 사람의 수 N이 주어진다. N은 10보다 작거나 같은 자연수이다.

 

 - 둘째 줄에는 키가 1인 사람부터 차례대로 자기보다 키가 큰 사람이 왼쪽에 몇 명 있는지 주어진다.

 

 - i번째 수는 0보다 크거나 같고, N-i보다 작거나 같다.


 

 

예제

 


 

 

문제 분석

 

 - 이 문제에서 전체 사람의 수 N은 10보다 작거나 같은 자연수이다.

 

 - 최대 10명이 줄을 서는 경우의 수는 10! = 3628800 이다.

   360만은 제한 조건 안에 수행할 수 있기 때문에 모든 경우를 살펴볼 수 있다.

 

 - 즉, 모든 사람이 서는 경우의 수를 모두 살펴보고, 해당 순서가 맞는지 판단하면 된다.

 

 


 

 

소스 코드

#include <bits/stdc++.h>
#include<unordered_set>

using namespace std;

int leftHeights[11];


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

	int N,n;

	vector<int> arr;

	cin >> N;

	for (int i = 0; i < N; i++) {
		arr.push_back(i);
		cin >> n;
		leftHeights[i] = n;
	}

	do {
		bool isOrder = true;
		for (int i = 0; i < N&&isOrder; i++) {
			int sum = 0;
			for (int j = 0; j < i; j++) {
				if (arr[i] < arr[j]) {
					sum++;
				}
			}
			if (sum != leftHeights[arr[i]]) {
				isOrder = false;
			}
		}

		if (isOrder) {
			for (int i = 0; i < N; i++) {
				cout << arr[i] + 1 << " ";
			}
			cout << endl;
		}
	} while (next_permutation(arr.begin(), arr.end()));


	return 0;
}

 

 

반응형

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

[BOJ-11561] 징검다리  (0) 2021.08.30
[BOJ-11779] 최소비용 구하기 2  (0) 2021.08.25
[BOJ-1662] 압축  (0) 2021.08.16
[BOJ-2806] DNA 발견  (0) 2021.08.15
[BOJ-11437] LCA  (0) 2021.07.31

댓글