Algorithm/baekjoon
[BOJ 12789] 도키도키 간식드리미
식빵민
2022. 7. 25. 21:33
https://www.acmicpc.net/problem/12789
12789번: 도키도키 간식드리미
인하대학교 학생회에서는 중간, 기말고사 때마다 시험 공부에 지친 학우들을 위해 간식을 나눠주는 간식 드리미 행사를 실시한다. 승환이는 시험 기간이 될 때마다 간식을 받을 생각에 두근두
www.acmicpc.net
문제 분석
- 시간 제한 : 1초 Big-O계산 약 1억
- 대기줄 : <queue>이용, 사용 가능한 공간 : <stack>이용
(queue와 stack을 이용할 예정이므로 시간제한에 대한 걱정을 덜해도 괜찮겠구만)
풀이 방식
- 대기줄이 빌때 까지 반복
- 대기줄 queue이나 공간 stack의 맨앞에 다음 순서가 있는지 확인
- 없으면 stack에 queue 맨앞에 있는 값 넣어주기
- 대기줄 비면 공간 빌때 까지 반복
- 공간 stack의 맨앞에 다음 순서가 있는지 확인
- 없으면 stop
- 대기줄과 공간이 둘다 비었으면 NICE!, 아니면 SAD
int order = 1;
int n;
bool isNice = true;
stack<int> space;
queue<int> waiting;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cin >> n;
for (int j = 0; j < n; j++) {
int x;
cin >> x;
waiting.push(x);
}
while (!waiting.empty()) {
if (order == waiting.front()) {//이번 순서가 대기줄 queue에 있으면
waiting.pop();
order++;
} else {
//비어있는 stack에 top접근하면 오류남
if (!space.empty() && order == space.top()) {//이번 순서가 공간stack에 있으면
space.pop();
order++;
} else {//이번 차례 없으면
space.push(waiting.front());
waiting.pop();
}
}
}
while (!space.empty()) {//공간이 빌때 까지
if (order == space.top()) {//이번 순서가 공간stack에 있으면
space.pop();
order++;
} else {//없으면
isNice = false;
break;//승환이는 슬퍼ㅠ
}
}
if (isNice) cout << "Nice";
else cout << "Sad";
return 0;
}
22번째줄 코드, stack의 top에 접근하는 과정에서 비어있는 경우에 대한 예외처리를 안해주어 애를 좀 먹었다.
나머지 논리는 금방 생각하여 시간이 오래걸리지는 않았다.
느낀 점
- <stack>,<queue> 등등에 stl을 사용할 때 비어있는 위치에 접근을 하는 건 아닌지에 대한 예외처리를 확실히 해주어야 겠다는 생각 이 들었다.
- 처음에 문제를 보고 사용가능한 공간에서 다시 대기줄로 이동할 수 있는 줄 알고 문제를 어떻게 풀어야 하나 막막했다.
- 보다 보니까 이렇게는 언제나 가능 할 거 같아 문제 이해 방식을 바꿨고 풀이 방식에 대한 논리는 바로 생각해냈다.
시간 복잡도
- queue,stack에서 front,top에 대한 접근, 삭제 -> O(1)
- queue가 빌때 까지 반복 -> O(n)
- stack이 빌때 까지 반복 -> O(n)
➣ O(n)