(C++) 프로그래머 나그(2)

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

설명하다

옹알이 벡터에 단어가 들어갈 때 “아야”, “예”, “우”, “마”를 조합하여 단어를 만들 수 있느냐는 질문이다.

그러나 한 단어를 연속적으로 말할 수는 없습니다.

들어오는 단어 하나하나를 판단하는 코드를 작성하는 것이 너무 복잡해 보였기 때문에 4개의 단어 중 길이가 30 이하인 모든 단어를 만들기로 했습니다.

모든 단어를 생성한 후에는 해당 단어가 해시에 나타나는지 확인하기만 하면 알 수 있습니다.

registString은 재귀 함수를 사용하여 가능한 모든 단어를 생성합니다.

이때 prev 변수는 이전에 사용한 단어의 연속 사용을 방지하기 위해 사용됩니다.

재귀를 사용하고 있기 때문에 시간이 꽤 걸립니다.

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

using namespace std;

vector<string> v({"aya", "ye", "woo", "ma"});
unordered_map<string, int> hash;

void registString(string str, string prev) 
{
    if (str.size() > 0 && str.size() <= 30) {
        ::hash(str) = 1;
       
        if (prev !
= "aya") registString(str+"aya", "aya"); if (prev !
= "ye") registString(str+"ye", "ye"); if (prev !
= "woo") registString(str+"woo", "woo"); if (prev !
= "ma") registString(str+"ma", "ma"); } } int solution(vector<string> babbling) { int answer = 0; registString("aya", "aya"); registString("ye", "ye"); registString("woo", "woo"); registString("ma", "ma"); for (auto i : babbling) { if (::hash(i)) answer++; } return answer; }


다른 솔루션

다른 사람이 구현한 작업 솔루션은 다음과 같습니다.

temp1에 문자를 하나씩 추가하고 옹알이 단어와 일치하면 temp1을 초기화합니다.

이때 temp2 변수를 이용하여 마지막 옹알이 단어를 저장하고, 같은 단어가 계속 나오는지 판단합니다.

모든 문자를 확인한 후 temp1이 비어 있으면 절대 소멸되지 않고 답변에 추가됩니다.

#include <string>
#include <vector>

using namespace std;

int solution(vector<string> babbling) {
    int answer = 0;

    for(int i;i<babbling.size();i++)
    {
        string temp1="";
        string temp2="";
        for(char c:babbling(i))
        {
            temp1+=c;
            if(temp1 == "aya"||temp1 == "ye"||temp1 == "woo"||temp1 == "ma")
            {
                if(temp2 == temp1) break;
                temp2=temp1;
                temp1="";
            }
        }
        if(temp1.size()==0) answer++;
    }
    return answer;
}