프로그래머스/Lv.1

[C++] 프로그래머스 햄버거 만들기 [벡터 or 문자열 활용]

MINU.SHINNNN 2023. 2. 28. 11:40

https://school.programmers.co.kr/learn/courses/30/lessons/133502

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문자열 풀이

재료의 순서가 1231인지 검사해서, 맞다면 햄버거를 하나 만들고 해당 재료를 없애줘야 하는 문제이다.

이때, 문자열을 사용하면 find함수를 사용해서 편하게 1231을 찾아낼 수 있다.]

또한, 

햄버거의 첫번째 재료가 빵(1)이기 때문에 햄버거를 만든 인덱스에서 세 칸 이상은 앞으로 갈 필요가 없다. 만약 세 칸 앞에서부터 햄버거가 만들어질 수 있다면 이미 앞에서 123이 나오고 지금 햄버거를 만든 곳의 첫번째 1까지로 햄버거를 만들 수 있었을 것이다([1,2,3,(1,2,3,1)] 이렇게 있다고 치면 이미 앞에서 햄버거가 만들어지므로 X, 만약 세 칸 앞의 값이 123이 아닌 경우에는 어차피 햄버거가 만들어지지 않으므로 거기서부터 검사할 필요가 없다!). 따라서 햄버거가 만들어진 인덱스보다 두 칸 앞에서부터 다시 검사를 시작하면 된다.

#include <string>
#include <vector>
#include <iostream>

using namespace std;
// 1231
int solution(vector<int> ingredient) {
    int answer = 0;
    string str="";
    for (auto& i:ingredient){
        str+=to_string(i);
    }
    int pos=0;
    while (str.find("1231", pos)!=string::npos){
        int idx = str.find("1231", pos);
        str.erase(idx, 4);
        // 햄버거 만들어진 위치부터 2칸 앞부터 재검사
        // 3칸이면 이미 앞에서 햄버거가 만들어졌음 [123(1234)]
        if (idx>1) pos=idx-2;
        answer++;
    }
    return answer;
}

벡터 풀이

#include <string>
#include <vector>
using namespace std;

int solution(vector<int> ingredient) {
    int answer = 0;
    vector<int> v = { -1 };
    for(int x : ingredient){
        if(v.back() == 1 && x == 2) v.back() = 12;
        else if(v.back() == 12 && x == 3) v.back() = 123;
        else if(v.back() == 123 && x == 1) answer++, v.pop_back();
        else v.push_back(x);
    }    

    return answer;
}