티스토리 뷰
극장좌석문제는 다이나믹 프로그래밍으로 풀이가 가능하다.
전제조건은 좌우 한칸으로는 이동이 가능하다.
좌석이 2개일 경우 아래의 두개의 경우가 가능
- 1, 2
- 2, 1
좌석이 3개일때는 좌석이 2개인 경우에서 끝자리가 2인 경우는 3과 교환이 가능하기 때문에 2가지 경우가 나오고, 1인경우는 3과 교환이 불가능 하여 끝에 3이 붙는 하나의 경우만 나온다.
끝이 2 인 경우: (1*2)/2 + 1 = 2
끝이 2 이 아닌 경우: (1*2)/2 = 1
좌석이 3개인 경우 3가지 종류가 가능
- 1, 2 -> 1, 2, 3
- 1, 3, 2
- 2, 1 -> 2, 1, 3
좌석이 4개일때는 좌석이 3개인 경우에서 끝자리가 3인 경우는 4와 교환이 가능하기 때문에 4가지 경우가 나오고, 2인 경우는 4와 교환이 불가능하이 끝에 4가 붙는 하나의 경우만 나온다.
- 1, 2, 3 -> 1, 2, 3, 4
- 1, 2, 4, 3
- 2, 1, 3 -> 2, 1, 3, 4
- 2, 1, 4, 3
- 1, 3, 2 -> 1, 3, 2, 4
끝이 3인 경우: (2*2)/2 + 1 = 3
끝이 3이 아닌 경우: (2*2)/2 = 2
좌석이 4개인 경우 5가지 종류가 가능
즉 앞좌석의 마지막 좌석번호를 이용하여 다음 좌석의 개수를 계산이 가능하다.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package sdk.algo.dynamic; | |
import java.util.Scanner; | |
/** | |
* 정올, 다이나믹 프로그래맹, 1848 | |
* | |
* @author whitebeard-k | |
* | |
*/ | |
public class Problem1848 { | |
// 메모이제이션을 위한 배열 | |
public static int[][] memo = new int[50][2]; | |
public static void main(String[] args) { | |
// int N = 40; | |
// int staticSeatNum = 2; | |
// int[] staticSeats = { 4, 7 }; | |
Scanner sc = new Scanner(System.in); | |
int N = sc.nextInt(); | |
int staticSeatNum = sc.nextInt(); | |
int[] staticSeats = new int[staticSeatNum]; | |
for (int i = 0; i < staticSeatNum; i++) { | |
staticSeats[i] = sc.nextInt(); | |
} | |
sc.close(); | |
if (staticSeatNum == 0) { // 고정 좌석의 개수가 0개 | |
System.out.println(calc(N)); | |
} else if (staticSeatNum == 1) { // 고정 좌석의 개수가 1개 | |
int first = (staticSeats[0] - 1 <= 1) ? 1 : calc(staticSeats[0] - 1); | |
int end = (staticSeats[staticSeatNum - 1] + 1 >= N) ? 1 : calc(N - staticSeats[staticSeatNum - 1]); | |
System.out.println(first * end); | |
} else { // 고정 좌석이 2개 이상 | |
int first = (staticSeats[0] - 1 <= 1) ? 1 : calc(staticSeats[0] - 1); | |
int end = (staticSeats[staticSeatNum - 1] + 1 >= N) ? 1 : calc(N - staticSeats[staticSeatNum - 1]); | |
int result = 1; | |
int prev = staticSeats[staticSeatNum - 1]; | |
for (int i = staticSeatNum - 2; i >= 0; i--) { | |
result *= calc(prev - staticSeats[i] - 1); | |
prev = staticSeats[i]; | |
} | |
System.out.println(first * result * end); | |
} | |
} | |
public static int calc(int n) { | |
if (n == 0) | |
return 1; | |
if (n == 1) { | |
memo[n][0] = 1; // 현재 번호로 끝나는 좌석 개수 | |
memo[n][1] = 0; // 현재 번호로 끝나지 않는 좌석 개수 | |
} else if (n == 2) { | |
memo[n][0] = 1; | |
memo[n][1] = 1; | |
} else if (memo[n][0] == 0) { | |
if (memo[n - 1][0] == 0) { | |
calc(n - 1); | |
} | |
memo[n][0] = (memo[n - 1][0] * 2) / 2 + memo[n - 1][1]; | |
memo[n][1] = (memo[n - 1][0] * 2) / 2; | |
} | |
return memo[n][0] + memo[n][1]; | |
} | |
} |
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=1121&sca=3050
반응형
'알고리즘 > 정올' 카테고리의 다른 글
[정올][다이나믹] 1407 숫자카드 (0) | 2017.04.13 |
---|---|
[정올][최단거리] 1108 페이지 전환 (0) | 2017.04.11 |
[정올][백트래킹] 1027 좋은 수열 (0) | 2016.10.09 |
[정올][그리디] 2499 저울 (0) | 2016.10.07 |
[정올][다이나믹] 2000 동전교환 (0) | 2016.10.04 |
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준
- airflow
- 하둡
- 오류
- SQL
- AWS
- mysql
- Hadoop
- error
- 다이나믹
- Linux
- SPARK
- ubuntu
- java
- HDFS
- 알고리즘
- build
- yarn
- S3
- hbase
- oozie
- 하이브
- nodejs
- emr
- bash
- Tez
- 정올
- HIVE
- 파이썬
- Python
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
글 보관함