문제
문제링크: https://www.noj.am/12789
12789번: 도키도키 간식드리미
인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두
www.acmicpc.net
문제 분석
잡설이 구구절절 길어서 그렇지 막상 읽어보면
입력 값들을 순서대로 나열할 수 있으면 Nice, 아니면 Sad를 출력하라는 간단한 내용이다.
이렇게 시험기간 격려 간식 이벤트에 학생들이 마구 줄을 선 상황.
T자형 공간을 활용해 배부받은 표의 숫자순으로 학생들을 보내야한다
심지어 그림도 아주 직관적이다
필요한 것 목록.
1. 순서를 알려주는 변수.
2. 아직 차례가 아닌 수들을 담았다가, 차례가 되면 뺄 수 있는 후입선출 자료구조 스택.
오늘도 C++ 라이브러리엔 스택이 준비되어있다.
간단하게 코드 앞부분에 #include <bits/stdc++.h> 한번 박아주거나, <stack> 쓰면 된다.
후입선출 LIFO 자료구조 stack이 오늘의 주인공이다.
stack에 대해 잘 모르면 이 링크(코딩젤리의 블로그)를 참고.
자세한 풀이
첫 입력으로 들어오는 N(학생 수)번의 반복문 내에서 끝낼 수 있다.
입력받은 숫자가 해당 순서와 일치하면 쿠키먹게 보내주고,
아니면 스택에서 기다리라고 하면 된다.
그리고 스택에 기다리는 애들도 자기 차례가 오면 나오게 해주면 된다.
와 즁말 간단하죠?

코드 (C++)
#include <bits/stdc++.h>
using namespace std;
stack<int> S;
int N, T, cnt=1;
int main(){
ios_base::sync_with_stdio(0);cin.tie(0);
cin >> N; // 학생들의 수.
while(N--){
cin >> T;
if(T==cnt) cnt++; // 현재 순번과 일치한다면 보내줘~
else S.push(T); // 아니면 스택에서 기다리도록.
while(!S.empty()&&S.top()==cnt){
S.pop(); // 스택 맨 위가 현재 순번과 일치한다면 보내줘~
cnt++;
}
}
if(S.empty()) cout << "Nice"; // 스택이 비었다면, 잘 해결된 것.
else cout << "Sad";
}
주석봐도 이해 안 되면 댓글 ㄱㄱ
'Algorithm > 문제 풀이' 카테고리의 다른 글
[백준] 4485번: 녹색 옷 입은 애가 젤다지? (C++) (3) | 2024.03.06 |
---|---|
[백준] 25945: 컨테이너 재배치 (C / C++) (1) | 2023.10.08 |
[백준] 1063번: 킹 (C++) (0) | 2023.09.24 |
[백준] 2630번: 색종이 만들기 (C++) (0) | 2023.08.16 |
[백준] 11478번: 서로 다른 부분 문자열의 개수 (C++) (0) | 2023.08.13 |