[백준 BOJ] 12789번 도키도키 간식드리미 (C++/cpp)

2022. 2. 20. 16:58PS (Program Solving)/BOJ (백준)

문제 설명

https://www.acmicpc.net/problem/12789

 

12789번: 도키도키 간식드리미

인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두

www.acmicpc.net

백준 BOJ 12789번 도키도키 간식드리미 문제 사진
백준 BOJ 12789번 도키도키 간식드리미 문제 사진2

 

접근 방법 - 스택을 이용한 연산 문제

백준의 12789번 문제는 스택을 이용하여 해결해야 하는 문제이다.

해당 문제는, 입력되는 값에 대하여, 1번부터 시작하여 순서대로 n번까지 배부할 수 있는지의 여부를 묻고 있는 문제이다.

필자는 num이라는 변수를 따로 선언하여 입력을 받는 대로 스택에 push해야 하는지 바로 배부되는지에 대한 여부를 정하게끔 하였다.

그리고 최종적으로, 스택이 비어있는지 아닌지에 따라서 알맞은 정답을 출력하게끔 하였다.

자세한 설명은 아래의 코드 설명에 추가적으로 작성하였다. 해결 방법에 대한 해설은 아래를 참고 바란다.

필자는 아래의 순서대로 코드를 작성하여 문제를 해결하였다.

 

코드의 실행 순서

1) 정수형 스택을 선언한다.

 

2) 사람의 수(n)를 입력받는다.

 

3) num을 1로 초기화하며 선언한다. (1부터 시작하여 간식을 배부해야 하기 때문이다.)

 

4) n에 따라서, 반복문을 실행하며 아래의 연산을 취한다.

- 간식의 번호(snack)를 하나씩 입력받는다.

- 입력받은 번호가 현재의 num과 같다면 스택에 push하지 않고 num에 1을 더하기만 한다.

(만일 입력받은 번호가 num과 같지 않다면 스택에 해당 숫자를 push하고 continue를 통해 다음 입력을 받는다.)

- top값이 num과 같다면 다른 반복문을 실행한다. 해당 조건을 만족한다면, pop연산을 하고 num에 1을 더한다. top값과 num이 동일하지 않을 때까지 이를 실행한다.

 

5) 최종적으로 스택이 비어있다면, 모든 간식이 원활하게 배부되었다는 뜻이다. 이 경우엔, "Nice"를 출력한다.

만일 스택이 비어있지 않다면, 간식이 원활하게 배부되지 못했다는 뜻이다. 이 경우엔, "Sad"를 출력한다.

 

6) 정답이 출력되었다면, 실행 종료한다.

반응형

 

성공한 코드

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <iostream>
#include <stack>
using namespace std;

//백준 12789번 코드
int main() {
	stack<int> s;
	int n;
	cin >> n;
	
	int snack;
	int num = 1;
	for (int i = 0; i < n; i++) {
		cin >> snack;
		if (snack == num) {	num++; }
		else { s.push(snack); continue; }

		while (!s.empty() && s.top() == num) {
			s.pop();
			num++;
		}
	}

	if (s.empty()) { cout << "Nice" << endl; }
	else { cout << "Sad" << endl; }
}

 

제출 결과

백준 BOJ 12789번 도키도키 간식드리미 문제 C++ 제출 결과

(2022.02.18 백준 12789번 문제 제출 결과)

반응형