[프로그래머스] 카드 뭉치 (Lv.1)
문제 링크
문제 설명
두 카드 묶음 cards1, cards2와 목표 배열 goal이 주어진다.
각 카드 묶음은 앞에서부터 순서대로만 사용할 수 있다.
goal 순서대로 카드를 모두 사용할 수 있으면 "Yes", 없으면 "No"를 반환하라.
예) cards1=["i","drink","water"], cards2=["want","to"], goal=["i","want","to","drink","water"] → "Yes"
내 풀이
cards1, cards2에 각각 별도 인덱스 idx1, idx2를 관리한다.
goal을 순서대로 순회하며 cards1 또는 cards2의 현재 앞 카드와 매치되면 해당 인덱스를 전진시킨다.
둘 다 매치되지 않으면 즉시 "No"를 반환하고, 모두 순회하면 "Yes"를 반환한다.
#include <string>
#include <vector>
using namespace std;
string solution(vector<string> cards1, vector<string> cards2, vector<string> goal) {
int idx1 = 0;
int idx2 = 0;
for(string temp : goal)
{
if(idx1 < cards1.size() && cards1[idx1] == temp)
idx1++;
else if(idx2 < cards2.size() && cards2[idx2] == temp)
idx2++;
else
return "No";
}
return "Yes";
}
시간복잡도 분석
goal을 한 번 순회하므로 O(n) (n = goal의 길이).
goal의 길이 ≤ 100이므로 충분히 통과 가능하다.
오답노트
처음에 cards1, cards2, goal을 같은 인덱스 idx로 접근했다. 각 카드 묶음은 독립적으로 앞에서부터 사용해야 하므로 별도 인덱스가 필요하다.
후기
queue<string> q1, q2;
for (string s : cards1) q1.push(s);
for (string s : cards2) q2.push(s);
for (string g : goal)
{
if (!q1.empty() && q1.front() == g) q1.pop();
else if (!q2.empty() && q2.front() == g) q2.pop();
else return "No";
}
return "Yes";
이런 식으로 큐로도 풀 수 있었다. 풀다가 긴가민가해서 포기했었는데.