ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 프로그래머스 영어 끝말잇기 C++
    프로그래머스(Programmers) 2022. 4. 21. 22:03
    반응형

    문제설명

     

    제한 사항

    • 끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.
    • words는 끝말잇기에 사용한 단어들이 순서대로 들어있는 배열이며, 길이는 n 이상 100 이하입니다.
    • 단어의 길이는 2 이상 50 이하입니다.
    • 모든 단어는 알파벳 소문자로만 이루어져 있습니다.
    • 끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.
    • 정답은 [ 번호, 차례 ] 형태로 return 해주세요.
    • 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.

    입출력 예

    nwordsresult

    3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3,3]
    5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0,0]
    2 ["hello", "one", "even", "never", "now", "world", "draw"] [1,3]

    입출력 예 설명

    입출력 예 #1
    3명의 사람이 끝말잇기에 참여하고 있습니다.

    • 1번 사람 : tank, wheel, mother
    • 2번 사람 : kick, land, robot
    • 3번 사람 : know, dream, tank

    와 같은 순서로 말을 하게 되며, 3번 사람이 자신의 세 번째 차례에 말한 tank라는 단어가 1번 사람이 자신의 첫 번째 차례에 말한 tank와 같으므로 3번 사람이 자신의 세 번째 차례로 말을 할 때 처음 탈락자가 나오게 됩니다.

    입출력 예 #2
    5명의 사람이 끝말잇기에 참여하고 있습니다.

    • 1번 사람 : hello, recognize, gather
    • 2번 사람 : observe, encourage, refer
    • 3번 사람 : effect, ensure, reference
    • 4번 사람 : take, establish, estimate
    • 5번 사람 : either, hang, executive

    와 같은 순서로 말을 하게 되며, 이 경우는 주어진 단어로만으로는 탈락자가 발생하지 않습니다. 따라서 [0, 0]을 return 하면 됩니다.

    입출력 예 #3
    2명의 사람이 끝말잇기에 참여하고 있습니다.

    • 1번 사람 : hello, even, now, draw
    • 2번 사람 : one, never, world

    와 같은 순서로 말을 하게 되며, 1번 사람이 자신의 세 번째 차례에 'r'로 시작하는 단어 대신, n으로 시작하는 now를 말했기 때문에 이때 처음 탈락자가 나오게 됩니다.

     

     

     

    => 주어진 조건대로 차례대로 조건을 걸어주며 해결하는 문제입니다. 

    • 현재 문자의 첫번째 글자와 이전 문자의 마지막 글자가 일치하여야 합니다. (첫 번째 for문을 위한 예외처리가 필요합니다.)
    • 글자의 수가 2자이상이어야합니다. 
    • set자료형을 이용하여 두번 이상 나온 단어일 경우 for문을 멈추며 현재 해당하는 사람과 해당하는 회전수를 구합니다. 
    • 모든 경우의 수에 해당하지 않아 탈락자가 나오지 않을 경우  (0,0)을 반환하여야 합니다. 

    => 위의 알고리즘대로 천천히 코드를 구현하면 되는문제였습니다. 

    => 주석을 달은 코드입니다. 

     

    #include <string>
    #include <vector>
    #include <iostream>
    #include <set>
    #include <iostream>
    
    using namespace std;
    
    vector<int> solution(int n, vector<string> words) {
        vector<int> answer;
        int Pson =1;
        int turn=1;
        char prevCh = words[0].front();
        set<string> s;
        bool flag = false;
        
        
        for(auto word : words)
        {
            if(word.front() != prevCh) // 이전어의 맨끝과 현재 단어의 맨앞이 다를 경우 
            {
                flag = true;
                break;
            }
            
            if(word.size() == 1) // 해당단어의 크기가 1 이면 
            {
                flag = true;
                break;
            }
            if(s.empty())
            {
                s.insert(word);
                prevCh = word.back();
                Pson++;
                if(Pson > n)//1회전완료
                {
                    Pson = 1;
                    turn ++;
                }
            }
            else{
                 auto iter = s.find(word);
                 if(iter == s.end())//해당 단어가 없는경우 
                 {
                    s.insert(word);
                    prevCh = word.back();
                    Pson++;
                    if(Pson > n)//1회전완료
                    {
                            Pson = 1;
                            turn ++;
                    }
                }
                else //해당 단어가 나온
                {
                        flag = true;
                        break; 
                }
            }
        }
      
        if(flag)
        {
            answer.push_back(Pson);
            answer.push_back(turn);
        }
        else 
        {
            answer.push_back(0);
            answer.push_back(0);
        }
        return answer;
    }

     

     

     

    반응형

    댓글

Designed by Who.