본문 바로가기
코테준비/하루한개도전~

softeer - 비밀메뉴

by 움바둠바 2024. 9. 3.
728x90

https://softeer.ai/practice/6269

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

 

투포인터로 풀려고 했는데, string -> contain(c++에서는find)를 이용하면 더 간단하게 풀이가 가능했다!

 

* 투포인터 주의할점

   반복문 안에서 처리할 때, 제일 마지막 인덱스는 처리가 안될 수 있다.

   => 반복문 밖에서 한번 더 확인해줄 필요가 있음!

 

[틀린답안]

#include<iostream>
#include <vector>


using namespace std;

int main(int argc, char** argv)
{

    int m, n, k;
    cin >> m >> n >> k;

    vector<int> secret_menu;
    for(int i = 0; i<m; i++){
        int temp;
        cin >> temp;
        secret_menu.push_back(temp);
    }

    vector<int> userinput;
    for(int i = 0; i<n; i++){
        int temp;
        cin >> temp;
        userinput.push_back(temp);
    }

    if(n < m){
        cout << "normal";
        return 0;
    }

    int j = 0;
    for(int i = 0; i<n; i++){
        if(j == m){
            cout << "secret";
            return 0;
        }
        if(userinput[i] == secret_menu[j]){
            j++;
        }else{
            j = 0;
            if(userinput[i] == secret_menu[0]){
                j = 1;
            }
        }
    }
    cout << "normal";
   return 0;
}

 

[수정된 답안] - 근데 틀림

#include<iostream>
#include <vector>


using namespace std;

int main(int argc, char** argv)
{

    int m, n, k;
    cin >> m >> n >> k;

    vector<int> secret_menu;
    for(int i = 0; i<m; i++){
        int temp;
        cin >> temp;
        secret_menu.push_back(temp);
    }

    vector<int> userinput;
    for(int i = 0; i<n; i++){
        int temp;
        cin >> temp;
        userinput.push_back(temp);
    }

    if(n < m){
        cout << "normal";
        return 0;
    }

    int j = 0;
    for(int i = 0; i<n; i++){
        if(j == m){
            cout << "secret";
            return 0;
        }
        if(userinput[i] == secret_menu[j]){
            j++;
        }else{
            j = 0;
            if(userinput[i] == secret_menu[0]){
                j = 1;
            }
        }
    }
    if(j == m){
        cout << "secret";
        return 0;
    }
    cout << "normal";
   return 0;
}

수정했지만, 33-3 테스트케이스를 통과하지 못한다.

 

9 6 9
234235
234234235

 

이런 테스트 케이스를 생각해 봤을 때, 

234[234235] 이부분에 비밀메뉴가 코드가 있으므로, secret이 출력되어야 한다.

하지만,, 내가 작성한 코드는 이부분을 처리해주지 못한다!

(23423까지 증가하다가. 4에서 다시 0으로 초기화됨)

그러니까 for 한개로 해결할게 아니라 for 두개를 사용해야 한다.

 

[수정된 코드] - 이중 for

#include<iostream>
#include <vector>


using namespace std;

int main(int argc, char** argv)
{

    int m, n, k;
    cin >> m >> n >> k;

    vector<int> secret_menu;
    for(int i = 0; i<m; i++){
        int temp;
        cin >> temp;
        secret_menu.push_back(temp);
    }

    vector<int> userinput;
    for(int i = 0; i<n; i++){
        int temp;
        cin >> temp;
        userinput.push_back(temp);
    }

    if(n < m){
        cout << "normal";
        return 0;
    }

    
    for(int i = 0; i<(n-m+1); i++){
        bool flag = true;
        for(int j = 0; j<m; j++){
            if(secret_menu[j] != userinput[i+j]){
                flag = false;
                break;
            }
        }
        if(flag){
            cout << "secret";
            return 0;
        }
    }
    cout << "normal";
   return 0;
}

가장 간단한 방법은, secret code와 userinput을 string으로 처리하는것이다

=> userinput에 secret code가 포함되어 있으면 secret이다.

c++ 에서는 find 함수의 인자로 string을 넣어주면 포함되는지 아닌지 알 수 있다.

    포함되면 포함되는 부분의 포인터

    포함되지 않으면, npos를 리턴

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


using namespace std;

int main(int argc, char** argv)
{

    int m, n, k;
    cin >> m >> n >> k;

    string secret_menu;
    for(int i = 0; i<m; i++){
        int temp;
        cin >> temp;
        secret_menu.push_back(temp);
    }

    string userinput;
    for(int i = 0; i<n; i++){
        int temp;
        cin >> temp;
        userinput.push_back(temp);
    }

    if(n < m){
        cout << "normal";
        return 0;
    }

    if(userinput.find(secret_menu)!=string::npos){
        cout << "secret";
    }else{
        cout << "normal";
    }
    
   return 0;
}
728x90