[문제 설명]
햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.
예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.
상수에게 전해지는 재료의 정보를 나타내는 정수 배열 ingredient가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.
제한사항
- 1 ≤ ingredient의 길이 ≤ 1,000,000
- ingredient의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.
입출력 예
ingredient | result |
[2, 1, 1, 2, 3, 1, 2, 3, 1] | 2 |
[1, 3, 2, 1, 2, 1, 3, 1, 2] | 0 |
입출력 예 설명
입출력 예 #1
- 문제 예시와 같습니다.
입출력 예 #2
- 상수가 포장할 수 있는 햄버거가 없습니다.
[문제 풀이]
문제에서 요구하는것은 햄버거를 정상적으로 몇개를 만들 수 있는지에 대해 물어보고있다.
문제에서 입력으로 들어오는 숫자 배열에서
1 - 햄버거 빵
2 - 야채
3 - 고기
위와 같이 의미한다..
입력으로 들어온 햄버거 재료들의 순서들은 바뀌지 않는다.
다만, 빵-야채-고기-빵 순으로 되어있다면 햄버거를 만들고 재료 리스트에서 빼줄수가 있다.
예를들어, 들어온 입력이 [1,2,1,2,3,1,3,1] 이라면
[빵-야채-빵-야채-고기-빵-고기-빵] 이다.
이때 다음과 같이 중간에 굵게 표시한 부분은 햄버거로 완성해서 빼줄수 있다.
빵-야채-[빵-야채-고기-빵]-고기-빵 -> [빵-야채-고기-빵], [빵-야채-고기-빵]
이후에 남은 재료를 봤을때 순서가 [빵-야채-고기-빵] 이므로 햄버거를 하나 또 만들수 있다.
따라서 위 예제로 봤을때 들어온 입력에 대해 2개의 햄버거를 만들수가 있다.
내가 문제를 푼 방법은
1. 햄버거를 만들수 있는 순서는 정확히 1231이여야만 하므로 이것을 string 변수에 저장한다. 이후 이 string과 들어온 입력을 비교 할 것이다.
2. 입력된 숫자의 사이즈만큼 반복문을 통해 한글자 씩 int 입력을 char형으로 변경하여 string에 추가한다.
3. 입력으로 들어온 string의 사이즈가 4보다 크거나 같아졌을때, std::string의 s.substr(s.size() - 4, 4)을 이용하여 4개의 문자열을 뽑아내고, 이것을 1번의 문자열과 비교한다.
4. 1번의 문자열과 같다면 std::string erase(s.size()-4, 4)를 이용하여 4개의 문자를 문자열에서 지워준다.
위의 과정을 코드로 작성하면 아래와 같다.
[코드]
[GitHub]
코드가 깨끗하고 명확하게 보일진 모르겠지만, 누군가에게 도움이 될 수도.. 있기에..
#include <string>
#include <vector>
using namespace std;
int solution(vector<int> ingredient) {
int answer = 0;
string order = "1231";
string s_ingredient = "";
for(int i = 0; i < ingredient.size(); i++)
{
s_ingredient += ingredient[i] + '0';
int sSize = s_ingredient.size();
if(sSize >= 4)
{
if(order == s_ingredient.substr(sSize-4,4))
{
answer++;
s_ingredient.erase(sSize-4,4);
}
}
}
return answer;
}
'Problem Solving > 프로그래머스' 카테고리의 다른 글
[프로그래머스] - JadenCase 문자열 만들기(C/C++) (0) | 2022.11.15 |
---|---|
[프로그래머스] - 최댓값과 최솟값(C/C++) (0) | 2022.11.14 |
[프로그래머스] - 네트워크(C/C++) (0) | 2022.10.07 |
[프로그래머스] - 배달(C/C++) (0) | 2022.10.02 |
[프로그래머스] - 섬 연결하기(C/C++) (0) | 2022.09.13 |