주차 칸 배정
문제
한 주차장에는 1번부터 N번까지 번호가 붙은 주차 칸이 한 줄로 늘어서 있다. 오늘 이 주차장에는 1번부터 N번까지 번호가 붙은 차 N대가 들어오며, 한 칸에는 차 한 대만 들어간다. 따라서 모든 칸이 꼭 한 대씩 채워진다.
차는 자기 번호와 같은 칸에 들어가는 것이 원칙이지만 바로 옆 칸이라면 들어가도 된다. 즉 K번 차는 K-1번 칸, K번 칸, K+1번 칸 가운데 하나를 쓸 수 있다. 1번 차는 왼쪽에 칸이 없으므로 1번 칸과 2번 칸만 쓸 수 있고, N번 차도 같은 이유로 N-1번 칸과 N번 칸만 쓸 수 있다.
그런데 M개의 칸에는 충전기가 달려 있다. 충전기가 달린 칸은 그 칸의 번호와 같은 번호의 차만 쓸 수 있다. 예를 들어 4번 칸에 충전기가 달려 있다면 4번 차는 반드시 4번 칸에 들어가야 하고, 다른 차는 4번 칸을 쓸 수 없다.
N대의 차를 모두 주차하는 방법이 몇 가지인지 계산하는 프로그램을 작성하여라.
예를 들어 N=9이고, 충전기가 달린 칸이 4번 칸과 7번 칸이라고 해보자. 칸의 상태를 표로 적으면 다음과 같다.
| 칸 번호 | 1번 | 2번 | 3번 | 4번 | 5번 | 6번 | 7번 | 8번 | 9번 |
|---|---|---|---|---|---|---|---|---|---|
| 충전기 | 없음 | 없음 | 없음 | 있음 | 없음 | 없음 | 있음 | 없음 | 없음 |
4번 차와 7번 차의 자리가 먼저 정해지므로, 남은 칸은 충전 칸을 경계로 세 묶음으로 끊어진다. 각 묶음에 속한 차들은 그 묶음을 벗어날 수 없다. 묶음마다 가능한 방법의 수를 세어 정리하면 다음과 같다.
| 묶음 | 1번부터 3번 칸 | 5번부터 6번 칸 | 8번부터 9번 칸 |
|---|---|---|---|
| 칸의 수 | 3 | 2 | 2 |
| 방법의 수 | 3 | 2 | 2 |
세 칸이 이어진 묶음에서는 세 대가 모두 자기 칸에 들어가는 방법, 앞의 두 대가 자리를 맞바꾸는 방법, 뒤의 두 대가 자리를 맞바꾸는 방법으로 3가지가 나온다. 두 칸이 이어진 묶음에서는 그대로 들어가는 방법과 맞바꾸는 방법으로 2가지가 나온다.
세 묶음은 서로 영향을 주지 않으므로 전체 방법의 수는 각 묶음의 방법의 수를 모두 곱한 값이다. 따라서 현재 예시에서의 정답은 3 × 2 × 2 = 12다.
충전기가 달린 칸이 하나도 없는 경우도 있다. 이때는 칸이 끊어지지 않고 1번부터 N번까지 한 묶음으로 이어진다. 반대로 충전 칸이 1번 칸이나 N번 칸인 경우도 있다. 이때는 그 바깥쪽에 칸이 없으므로 묶음이 하나 줄어든다.
입출력 예시
예시 1
입력
9 2 4 7
출력
12
예시 2
입력
9 3 2 4 7
출력
4
예시 3
입력
40 0
출력
165580141
입력 조건
가장 먼저 첫째 줄에 주차 칸의 수 N이 주어진다. N은 1 이상 40 이하의 자연수다. 들어오는 차의 수도 N과 같다.
이어서 둘째 줄에 충전기가 달린 칸의 수 M이 주어진다. M은 0 이상 20 이하의 정수이며, N보다 크지 않다.
이어서 M개의 줄에 걸쳐 충전기가 달린 칸의 번호가 한 줄에 하나씩 주어진다. 각 번호는 1 이상 N 이하의 자연수이고, 서로 다르며, 작은 번호부터 오름차순으로 주어진다. M이 0이면 이 줄은 하나도 주어지지 않는다.
출력 조건
N대의 차를 모두 주차하는 방법의 수를 한 줄에 출력한다. 모든 차가 자기 번호와 같은 칸에 들어가는 방법은 늘 조건을 만족하므로, 방법의 수는 항상 1 이상이다. 방법이 한 가지뿐인 경우에도 그 수인 1을 출력한다.
요구사항
- 모든 칸은 꼭 한 대씩 채워집니다. 비는 칸이 있어서는 안 됩니다
- K번 차는 K-1번, K번, K+1번 칸만 쓸 수 있습니다
- 충전기가 달린 칸은 같은 번호의 차만 씁니다
- 충전 칸의 번호는 오름차순으로 주어집니다
- 표준 입력으로 읽고 표준 출력으로 내보내는 프로그램을 짜야 합니다
- 쓸 수 있는 말은 파이썬, 자바스크립트입니다
- 메모리 제한은 256MB입니다. 브라우저에서는 재지 않고 적기만 합니다
- 시간 제한은 출제자의 정답 코드를 같은 런타임에서 재서 정합니다
- 이 문제는 프롬프트가 아니라 코드를 냅니다. 그 코드는 이 기기의 브라우저에서 돌고, 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다. 실행 시간은 각자 기기가 적어 보내는 값이라, 코드와 기기 정보를 순위표에 같이 내걸어 둡니다.
- 출력이 글자 하나까지 기대값과 같아야 합니다. 줄 안의 빈칸은 다른 글자와 똑같이 봅니다.
- 케이스는 16개이고, 그 가운데 3개는 입력과 기대 출력을 함께 보여 줍니다. 나머지는 제출할 때만 쓰이고 화면에는 보여 주지 않습니다.
- 케이스 16개를 전부 통과해야 해결입니다.
예시
공개 케이스 3개입니다. 채점에는 숨은 케이스가 함께 쓰입니다. 케이스 16개를 전부 통과해야 해결입니다.
9 3 2 4 7
4
40 0
165580141
9 2 4 7
12
풀이
코드는 이 기기에서돕니다. 서버로는 나온 출력의 지문과 걸린 시간만 갑니다. 맞았는지는 서버가 정합니다.
제출은 로그인 하셔야 됩니다. 공개 케이스로 돌려보는 것은 로그인 없이도 됩니다.
공개 케이스 3개로 돌려보기가 됩니다. 제출하면 숨은 케이스까지 돕니다.
이 문제를 푼 사람
아직 없습니다. 첫 번째가 되실 수 있습니다.