[BOJ] Q2302 극장 좌석

Question

Language: Python

Difficulty: Silver 1

해당 문제는 vip 자리는 고정으로 정해두고, 나머지 자리를 배치하는 경우만 제대로 파악하면 된다. 또한, vip를 중간에 벽으로 생각하고 나머지 부분에 대한 경우는 다 제각각으로 배치하는 것이므로, 독립사건이라고 볼 수 있다. 따라서, vip를 경계로 각각의 배치에 대한 곱으로 생각할 수 있다.

즉, 아래와 같은 예시가 있을때,

1 2 3 4 5 6 7 8 9

위의 자리 배치 경우는 1 2 3 배치하는 경우 * 5 6 배치하는 경우 * 8 9 배치하는 경우로 표현할 수 있다.

또한 vip가 아닌 사람에 대해 배치하는 경우는 아래와 같은 점화식을 가지는 것을 확일할 수 있다.

n=1 일때 1 n=2 일때 12,21 n=3 일때 123,213,132 n=4 일때 1234,1324,2134,1243,2143이다

n=3일때를 분석해보면 123 213 132

n=4인 경우는 1234 2134 1324 1243 2143

자세히 보면 di[i]=di[i-1]+di[i-2]임을 확인할 수 있다.

Solution

def solution():
    di=[0] * 41
    di[0]=1

    for i in range(1,41):
        di[i]=di[i-1]+di[i-2]

    start=1
    result=1
    for vip in vips:
        result*=di[vip-start]
        start=vip+1

    result*=di[n_seats-start+1]

    return result

if __name__ == "__main__":
    vips=[]
    n_seats=int(input())
    n_vips=int(input())
    for _ in range(n_vips):
        vips.append(int(input().strip()))
        
    print(solution())

댓글남기기