2026. 5. 22. 09:55ㆍProgrammers
문제
재료가 순서대로 쌓이고, 아래서부터 빵(1) - 야채(2) - 고기(3) - 빵(1) 순서로 쌓인 햄버거만 포장한다.
포장한 햄버거의 개수를 return하는 문제이다.
햄버거를 포장하면 해당 재료들을 제거하고, 남은 재료 위에 계속 쌓인다.
예시
| ingredient | result |
| [2, 1, 1, 2, 3, 1, 2, 3, 1] | 2 |
| [1, 3, 2, 1, 2, 1, 3, 1, 2] | 0 |
문제 흐름 파악
재료를 순서대로 쌓고, 완성 패턴인 [1, 2, 3, 1]이 맨 위에 만들어지면 제거하는 구조이다.
이 문제 해결 방식으로는 스택의 원리를 이용했다. Vector를 스택처럼 사용해서 맨 위에 완성 패턴이 쌓이게 되면, pop_back()을 이용해서 후입선출(LIFO)의 원리를 이용했다.
문제 풀이
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> ingredient) {
int answer = 0;
vector<int> stk;
for(int i = 0; i < ingredient.size(); ++i)
{
stk.push_back(ingredient[i]);
int n = stk.size();
if(n >= 4 &&
stk[n-4] == 1 &&
stk[n-3] == 2 &&
stk[n-2] == 3 &&
stk[n-1] == 1)
{
++answer;
stk.pop_back();
stk.pop_back();
stk.pop_back();
stk.pop_back();
}
}
return answer;
}
코드 흐름
1. 재료 쌓기
stk.push_back(ingredient[i]);
int n = stk.size();
재료를 하나씩 새로 만든 vector인 stk에 push한다.
2. 햄버거 완성 체크
if(n >= 4 &&
stk[n-4] == 1 &&
stk[n-3] == 2 &&
stk[n-2] == 3 &&
stk[n-1] == 1)
반복문 안에 조건문을 넣어 벡터에 하나씩 추가될 때 마다 맨 위 4개가 완성 패턴[1, 2, 3, 1]인지 확인한다.
n>=4 조건을 확인해서 범위에 맞는지도 같이 확인해서 안전하게 작성했다.
3. 햄버거 제거
++answer;
stk.pop_back();
stk.pop_back();
stk.pop_back();
stk.pop_back();
패턴이 완성되면 출력할 답인 answer를 하나 증가시키고, 그 완성 패턴을 pop_back으로 제거한다.
제거 후엔 그 다음의 재료를 계속 추가한다.
예시 흐름
push(2) → [2] 패스
push(1) → [2, 1] 패스
push(1) → [2, 1, 1] 패스
push(2) → [2, 1, 1, 2] stk[0]=2 패스
push(3) → [2, 1, 1, 2, 3] stk[2]=1 패스
push(1) → [2, 1, 1, 2, 3, 1]
stk[2]=1 stk[3]=2 stk[4]=3 stk[5]=1
→ answer=1, pop 4번 → [2, 1]
예시 문제를 이 코드에 대입해서 넣어보면 이런 흐름이 이루어진다.
핵심 포인트
1. vector를 스택처럼 사용해 후입선출의 원리를 이용한다.
2. push_back 이후 n = stk.size()를 계산해야 방금 push한 원소가 stk[n-1]이 된다.
3. 햄버거를 제거하면 남은 재료가 자연스럽게 이어지므로 연쇄적으로 자동으로 처리된다.
'Programmers' 카테고리의 다른 글
| <프로그래머스 C++> 바탕화면 정리 풀이 (0) | 2026.05.29 |
|---|---|
| <프로그래머스 C++> 성격 유형 검사하기 풀이 (0) | 2026.05.26 |
| <프로그래머스 C++> 둘만의 암호 풀이 (1) | 2026.05.21 |
| <프로그래머스 C++> 휴대폰 자판 풀이 (0) | 2026.05.20 |
| <프로그래머스 C++> 문자열 나누기 풀이 (0) | 2026.05.19 |