N

(프로그래머스 c++)영어 끝말잇기 본문

프로그래머스 알고리즘/2단계

(프로그래머스 c++)영어 끝말잇기

naeunchan 2020. 5. 29. 10:31
728x90
반응형

우선 처음에 answer에는 [0, 0]을 넣어주도록 하자.

만약 모든 단어가 규칙에 맞게 끝말잇기를 했다면 [0, 0]을 바로 리턴하기 위함이다.

그리고 첫 단어는 check에 넣어주었다.

 

이제 1번째 인덱스의 단어부터 끝까지 단어를 탐색하도록 한다.

turn과 count 는 선언 시 1로 초기화 하였기 때문에,

순서에 맞게 +1 씩 해주면 된다.

 

for문 설명)

우선 turn++을 하여 차례를 세도록 한다.

그리고 words[i]의 첫 번째 글자와 words[i - 1]의 마지막 글자가 일치하는지 검사한다.

일치하지 않으면 바로 break를 하여 빠져나오고,

일치한다면 check 벡터에 단어가 있는지 검사한다.

만약 check 벡터에 단어가 없으면 check에 넣어주도록 한다.

단, 마지막 단어일 때는 바로 answer을 리턴하여 종료하도록 한다.

왜냐하면 끝말잇기 규칙에 맞게 끝까지 순회하였기에 [0, 0]을 바로 리턴하도록 하면 되기 때문이다.

 

만약 check 벡터에 중복되는 단어가 있다면 break을 걸어 빠져나오도록 한다.

for문을 빠져나오면 answer[0] = turn, answer[1] = count를 넣어주면 된다..!

 

for문 마지막에는 turn을 검사하도록 한다.

turn == n이면 다음 순서는 다시 처음으로 돌아와야 하기 때문에 turn = 0으로 바꿔주고,

횟수를 나타내는 count는 +1을 해주면 된다..!

 

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

using namespace std;

vector<int> solution(int n, vector<string> words) {
    vector<int> answer;
    int turn = 1, count = 1;
    vector<string> check;
    
    answer.push_back(0);
    answer.push_back(0);
    check.push_back(words[0]);
    
    for(int i = 1; i < words.size(); i++)
    {
        turn++;
        
        if(words[i].front() == words[i - 1].back())
        {
            if(find(check.begin(), check.end(), words[i]) == check.end())
            {
                if(i == words.size() - 1)
                    return answer;
                check.push_back(words[i]);
            }
            else
                break;
        }
        else
            break;
        
        if(turn == n)
        {
            count++;
            turn = 0;
        }
    }
    
    answer[0] = turn;
    answer[1] = count;
    return answer;
}
728x90
반응형