Skip to content

Commit 89634d7

Browse files
committed
[Gold V] Title: 숌 사이 수열, Time: 36 ms, Memory: 2024 KB -BaekjoonHub
1 parent ae342db commit 89634d7

2 files changed

Lines changed: 90 additions & 0 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
# [Gold V] 숌 사이 수열 - 1469
2+
3+
[문제 링크](https://www.acmicpc.net/problem/1469)
4+
5+
### 성능 요약
6+
7+
메모리: 2024 KB, 시간: 36 ms
8+
9+
### 분류
10+
11+
백트래킹, 브루트포스 알고리즘
12+
13+
### 제출 일자
14+
15+
2025년 12월 20일 13:59:16
16+
17+
### 문제 설명
18+
19+
<p>숌은 N개의 다른 숫자로 구성되어 있는 집합 X를 만들었다. 그리고, 길이가 2N인 숌 사이 수열 (S)을 만들려고 한다.</p>
20+
21+
<p>숌 사이 수열이란 다음과 같다.</p>
22+
23+
<ol>
24+
<li>X에 들어있는 모든 수는 숌 사이 수열 S에 정확히 두 번 등장해야 한다.</li>
25+
<li>X에 등장하는 수가 i라면, S에서 두 번 등장하는 i사이에는 수가 i개 등장해야 한다.</li>
26+
</ol>
27+
28+
<p>예를 들어, 숌이 만든 집합 X가 {1,2,3}이고, 숌이 만든 숌 사이 수열이 {2 3 1 2 1 3}이라면, 일단 X에 속하는 모든 수가 S에 두 번 등장하므로 1번 조건을 만족한다. 그리고, 2와 2사이엔 수가 두 개, 1과 1사이엔 1개, 3과 3사이엔 3개가 등장하므로 조건을 만족시킨다.</p>
29+
30+
<p>집합 X가 주어졌을 때, 숌 사이 수열 S를 출력하는 프로그램을 작성하시오.</p>
31+
32+
### 입력
33+
34+
<p>첫째 줄에 X의 크기 N이 주어진다. 둘째 줄에 X에 들어가는 수가 빈칸을 사이에 두고 주어진다. X의 크기는 8보다 작거나 같은 자연수이다. X의 원소는 0보다 크거나 같고 16보다 작거나 같은 정수이다.</p>
35+
36+
### 출력
37+
38+
<p>첫째 줄에 숌 사이 수열을 출력한다. 만약 여러 개일 경우 사전 순으로 가장 빠른 것을 출력한다. 만약 없을 경우에는 -1을 출력한다.</p>
39+
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
#include<iostream>
2+
#include<vector>
3+
#include<algorithm>
4+
using namespace std;
5+
6+
int n;
7+
vector<int> path;
8+
vector<int> ap;
9+
bool flag;
10+
int cnt[17];
11+
12+
void bt(int level) {
13+
if (flag) return;
14+
if (level == n * 2) {
15+
for (int i : path) cout << i << " ";
16+
flag = true;
17+
return;
18+
}
19+
20+
for (int i : ap) {
21+
if (cnt[i] > 1) continue;
22+
else if (cnt[i] == 0) {
23+
++cnt[i];
24+
path.push_back(i);
25+
bt(level + 1);
26+
path.pop_back();
27+
--cnt[i];
28+
}
29+
else {
30+
int len = path.size();
31+
if (len - i - 1 >= 0 && path[len - i - 1] == i) {
32+
++cnt[i];
33+
path.push_back(i);
34+
bt(level + 1);
35+
path.pop_back();
36+
--cnt[i];
37+
}
38+
}
39+
}
40+
}
41+
42+
int main() {
43+
cin >> n;
44+
for (int i = 0; i < n; ++i) {
45+
int a; cin >> a;
46+
ap.push_back(a);
47+
}
48+
sort(ap.begin(), ap.end());
49+
bt(0);
50+
if (!flag) cout << -1;
51+
}

0 commit comments

Comments
 (0)