Skip to content

Commit 266a364

Browse files
committed
[Gold V] Title: 극장 좌석, Time: 4 ms, Memory: 69100 KB -BaekjoonHub
1 parent bd4d344 commit 266a364

2 files changed

Lines changed: 61 additions & 0 deletions

File tree

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# [Gold V] 극장 좌석 - 2302
2+
3+
[문제 링크](https://www.acmicpc.net/problem/2302)
4+
5+
### 성능 요약
6+
7+
메모리: 69100 KB, 시간: 4 ms
8+
9+
### 분류
10+
11+
다이나믹 프로그래밍
12+
13+
### 제출 일자
14+
15+
2025년 7월 18일 23:30:21
16+
17+
### 문제 설명
18+
19+
<p>어떤 극장의 좌석은 한 줄로 되어 있으며 왼쪽부터 차례대로 1번부터 N번까지 번호가 매겨져 있다. 공연을 보러 온 사람들은 자기의 입장권에 표시되어 있는 좌석에 앉아야 한다. 예를 들어서, 입장권에 5번이 쓰여 있으면 5번 좌석에 앉아야 한다. 단, 자기의 바로 왼쪽 좌석 또는 바로 오른쪽 좌석으로는 자리를 옮길 수 있다. 예를 들어서, 7번 입장권을 가진 사람은 7번 좌석은 물론이고, 6번 좌석이나 8번 좌석에도 앉을 수 있다. 그러나 5번 좌석이나 9번 좌석에는 앉을 수 없다.</p>
20+
21+
<p>그런데 이 극장에는 “VIP 회원”들이 있다. 이 사람들은 반드시 자기 좌석에만 앉아야 하며 옆 좌석으로 자리를 옮길 수 없다.</p>
22+
23+
<p>오늘 공연은 입장권이 매진되어 1번 좌석부터 N번 좌석까지 모든 좌석이 다 팔렸다. VIP 회원들의 좌석 번호들이 주어졌을 때, 사람들이 좌석에 앉는 서로 다른 방법의 가짓수를 구하는 프로그램을 작성하시오.</p>
24+
25+
<p>예를 들어서, 그림과 같이 좌석이 9개이고, 4번 좌석과 7번 좌석이 VIP석인 경우에 <123456789>는 물론 가능한 배치이다. 또한 <213465789> 와 <132465798> 도 가능한 배치이다. 그러나 <312456789> 와 <123546789> 는 허용되지 않는 배치 방법이다.</p>
26+
27+
<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/80caa675-30d4-44ec-8100-01f8eac2a3e3/-/preview/" style="width: 273px; height: 250px;"></p>
28+
29+
### 입력
30+
31+
<p>첫째 줄에는 좌석의 개수 N이 입력된다. N은 1 이상 40 이하이다. 둘째 줄에는 고정석의 개수 M이 입력된다. M은 0 이상 N 이하이다. 다음 M 개의 줄에는 고정석의 번호가 작은 수부터 큰 수의 순서로 한 줄에 하나씩 입력된다.</p>
32+
33+
### 출력
34+
35+
<p>주어진 조건을 만족하면서 사람들이 좌석에 앉을 수 있는 방법의 가짓수를 출력한다. 방법의 가짓수는 2,000,000,000을 넘지 않는다. (2,000,000,000 < 2<sup>31</sup>-1)</p>
36+
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
let n = Int(readLine()!)!
2+
let m = Int(readLine()!)!
3+
var isVIP = [Bool](repeating: false, count: n+1)
4+
var dp = [Int](repeating: 1, count: n+1)
5+
for _ in 0..<m {
6+
let i = Int(readLine()!)!
7+
isVIP[i] = true
8+
}
9+
var lastCount = 1
10+
for i in 1...n {
11+
if isVIP[i] {continue }
12+
dp[i] = dp[i-1]
13+
if i-2 >= 0, !isVIP[i-1] {
14+
dp[i] = dp[i] + dp[i - 2]
15+
}
16+
if i+1 < n+1, isVIP[i+1] {
17+
lastCount *= dp[i]
18+
continue
19+
}
20+
if i == n {
21+
lastCount *= dp[i]
22+
}
23+
}
24+
25+
print(lastCount)

0 commit comments

Comments
 (0)