프로그래머스/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;
}