프로그래머스 133502 - 햄버거 만들기 Lv.1
프로그래머스 133502 - 햄버거 만들기 Lv.1
출처: https://school.programmers.co.kr/learn/courses/30/lessons/133502
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// 프로그래머스 133502 - 햄버거 만들기 Lv.1
// https://school.programmers.co.kr/learn/courses/30/lessons/133502
// 문제 설명
// 재료(1=빵, 2=야채, 3=고기)가 아래서부터 위로 쌓인다.
// 아래->위로 빵-야채-고기-빵 (1,2,3,1) 순서가 만들어지면 그 4개를 포장한다.
// 포장으로 4개가 빠지면 그 위아래 재료가 새로 맞닿아 또 햄버거가 될 수 있다.
// 포장한 햄버거의 총 개수를 구한다.
// 예) [2,1,1,2,3,1,2,3,1] -> 2
// 제약 조건
// 1 <= ingredient 길이 <= 1,000,000 (원소는 1,2,3)
// 접근
// 스택으로 재료를 쌓되, 새 재료를 push할 때마다 위 4개를 확인한다.
// 핵심은 "4개를 빼면 그 자리에서 다시 위아래가 붙는다"는 점인데,
// 스택이라면 pop 후 새로 들어오는 값이 자연스럽게 이전 재료 위에 이어져
// 별도 재배치 없이 연쇄 포장이 처리된다.
// 매 원소를 한 번 push, 조건 성립 시 한 번 제거하므로 시간 O(n).
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> ingredient)
{
int answer = 0;
vector<int> st; // 쌓이는 재료 스택
for (int x : ingredient)
{
st.push_back(x);
int n = st.size();
// 위 4개가 아래->위로 빵(1)-야채(2)-고기(3)-빵(1)인지 확인
if (n >= 4 &&
st[n - 1] == 1 && st[n - 2] == 3 &&
st[n - 3] == 2 && st[n - 4] == 1)
{
st.resize(n - 4); // 완성된 4개 제거
answer++;
}
}
return answer;
}
정리
- 스택 top 4개만 보면 되므로 매번 전체를 훑을 필요가 없다.
vector를 스택처럼 쓰면resize(n-4)로 4개를 한 번에 빼고, 다음push_back이 그 위에 이어져 연쇄 포장이 공짜로 해결된다.- 인덱스로 위에서부터
[n-1], [n-2], [n-3], [n-4]를 비교하면 순서가 한눈에 들어온다. - 길이가 최대 100만이라 O(n) 한 번 순회로 충분하다.
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.