2302-g5 성공
This commit is contained in:
49
workbook_7319/gold/2302-g5.py
Normal file
49
workbook_7319/gold/2302-g5.py
Normal file
@@ -0,0 +1,49 @@
|
||||
# 극장 좌석
|
||||
|
||||
import sys
|
||||
|
||||
input = sys.stdin.readline
|
||||
|
||||
def solution():
|
||||
n = int(input().rstrip())
|
||||
|
||||
m = int(input().rstrip())
|
||||
|
||||
vip = [0] * (n+1)
|
||||
for _ in range(m):
|
||||
vip[int(input().rstrip())] = 1
|
||||
|
||||
dp = [0] * (n+1)
|
||||
dp[0] = 1
|
||||
dp[1] = 1
|
||||
for i in range(2, n+1):
|
||||
if vip[i] or vip[i-1]:
|
||||
dp[i] = dp[i-1]
|
||||
else:
|
||||
dp[i] = dp[i-1] + dp[i-2]
|
||||
|
||||
print(dp[n])
|
||||
|
||||
return
|
||||
|
||||
|
||||
solution()
|
||||
|
||||
"""
|
||||
걸린 시간: 16분
|
||||
|
||||
시간 복잡도: n개의 dp 테이블을 채우면 되기 때문에 O(n)이다.
|
||||
|
||||
해설: dp[i]를 i번 좌석까지 왔을 때 경우의 수라고 하자.
|
||||
i에 같은 번호가 잘 앉거나, 옆으로 이동하거나 2가지의 경우가 있다.
|
||||
i가 잘 앉은 경우에는 이전에서 변동이 없기 때문에 dp[i-1]을 하면된다.
|
||||
i가 옆으로 이동한 경우에는 왼쪽과 오른쪽 이동이 있는데, dp 테이블을 오른쪽으로 채워가기 때문에 오른쪽으로 이동하는 것은 지금 세지말자.
|
||||
그러면 i는 i-1자리로 이동할 수 있다. 그럼 i-1에 있는 애는 어디로 갈까? 반드시 i와 스왑을 해야한다.
|
||||
왜 why? 한쪽으로 계속 미는 방식으로 앉으면 마지막 사람은 앉을 곳이 없기 때문에 이 문제는 무조건 스왑이다.
|
||||
그렇기 때문에 오른쪽 이동은 dp[i+1]에서 왼쪽으로 스왑할때 책임져 줄 것이다.
|
||||
아무튼 i, i-1 자리가 바뀌었기 때문에 dp[i-2] 상황에서 새로운 경우가 발생한 것이다.
|
||||
따라서 dp[i] = dp[i-1] + dp[i-2]이다.
|
||||
이때 주의할 점은 vip인데, vip는 이동할 수 없고 무조건 본인 자리에 앉아야 하기 때문에 dp[i] = dp[i-1]이 된다.
|
||||
또한 우리는 왼쪽으로의 이동만 보기로 했기 때문에 vip의 오른쪽에 있는 사람도 왼쪽으로 이동을 할 수 없다.
|
||||
따라서 그 사람도 dp[i] = dp[i-1]이다.
|
||||
"""
|
||||
Reference in New Issue
Block a user