From fbbd5d3809d8c4b2191ca7da83def4fea2902acb Mon Sep 17 00:00:00 2001 From: nkey Date: Wed, 1 Apr 2026 15:47:11 +0900 Subject: [PATCH] =?UTF-8?q?2302-g5=20=EC=84=B1=EA=B3=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- workbook_7319/gold/2302-g5.py | 49 +++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 workbook_7319/gold/2302-g5.py diff --git a/workbook_7319/gold/2302-g5.py b/workbook_7319/gold/2302-g5.py new file mode 100644 index 0000000..6fa636b --- /dev/null +++ b/workbook_7319/gold/2302-g5.py @@ -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]이다. +""" \ No newline at end of file