교재 : C로 배우는 쉬운 자료구조
문제 : Chapter 05 - 응용예제 05 - 핀볼 구슬 게임의 점수는?
구분 : 스택(stack)
<문제풀이>
/*보안자료구조
응용예제 05, 핀볼 구슬 게임의 점수는?
<입력예제>
0 0 0 0 0 0 0 2 0 4 2 0 5 3 1
30 20 40 10 20
5 1, 3 5, 3 2, 2 3, 4 2, 3 4, 5 4, 5 3, 2 1, 1 3
*/
#include<stdio.h>
#define MAX_STACK_SIZE 20
int stack[MAX_STACK_SIZE][5]; //20행 5열 테이블 생성
int top[5] = { -1,-1,-1,-1,-1 }; //각 열에 대한 스택의 top pointer
int IsEmpty(int col) { //해당하는 열(col)이 비어있는지 확인.
if (top[col] < 0)
return 1;
else
return 0;
}
int IsFull(int col) { //해당하는 열(col)이 꽉 차있는지 확인.
if (top[col] >= MAX_STACK_SIZE - 1)
return 1;
else
return 0;
}
// 해당하는 열의 스택 pop
int pop(int col) {
if (IsEmpty(col) == 1)
return 0;
else
return stack[top[col]--][col];
}
// 해당하는 열의 스택 push (조건 검사)
void push(int value, int col) {
if (IsFull(col) == 1)
return;
else {
if (value == stack[top[col]][col]) pop(col); //데이터 push전에 push할 열에 있는 top 데이터의 값이 같다면 top의 구슬 pop
else stack[++top[col]][col] = value; //데이터 push 진행
}
}
int main() {
int pinball_init[15]; // input : 핀볼의 초기 값 배열
int col_score[5]; // input : 각 세로열 점수
int col[10]; // input : 세로열
int bead_cnt[10]; // input : 구슬 개수
int col_sum[5] = { 0,0,0,0,0 }; //열 별로 구슬의 합계
// 반복문을 통한 입력
for (int i = 0; i < 15; i++) scanf_s("%d", &pinball_init[i]);
for (int i = 0; i < 5; i++) scanf_s("%d", &col_score[i]);
for (int i = 0; i < 10; i++) scanf_s("%d %d,", &bead_cnt[i], &col[i]);
// 핀볼의 초기값 push
int col_index = 4;
for (int i = 14; i >= 0; i--) {
if (col_index < 0) col_index = 4;
if (pinball_init[i] == 0) {
col_index--;
continue;
}
push(pinball_init[i], col_index--);
}
// 입력받은 10개의 핀볼쏘기
for (int i = 0; i < 10; i++) push(bead_cnt[i], col[i] - 1);
// 각 열에 대한 남은 구슬의 합
for (int i = 0; i < 5; i++) {
for (int j = top[i]; j >= 0; j--)
col_sum[i] += stack[j][i];
}
// 결과 출력
printf("\n(");
for (int i = 0; i < 5; i++) {
if (i == 4) printf("%d점", col_sum[i] * col_score[i]);
else printf("%d점, ", col_sum[i] * col_score[i]);
}
printf(")\n---------------------------------");
}