프로그래머스 - 영어 끝말잇기

2022. 9. 13. 21:20코딩 공부 연습

반응형

영어 끝말잇기다. 끝나는 조건으로 틀린 단어를 댄 경우, 이미 한 경우를 댄 경우만 신경 써주면 된다.

map 에 지금까지 사용한 단어들을 다 저장하면서 새로 받을 때마다 find 에서 걸리는지 체크했다. 

두 종료조건 중 어느 하나에 걸려도 그때의 인덱스를 갖고 종료한다. 

 

이제 몇번째 단어에서 끝났는지를 통해 누가 걸린거고, 몇번 턴만에 걸렸는지를 구해야했는데, 여기서 멍청한 탓에 매우 멍청하게 풀었다.

ㅜㅜ 남들은 굉장히 쉽게했더라ㅋㅋ

 

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

using namespace std;

vector<int> solution(int n, vector<string> words) {
    vector<int> answer;
    set <string> wordlist;    
    // 처음부터 시작해서 그냥 계속 읽어가면서 다 map 에 넣는다. 
    //map find에서 발견이된 순간 그 친구가 탈락이고, 그 때 n으로 나눠주고, 몇번쨰 사람인지 구하는건 수학!
    int end_flag = 0;  // 전부 다 돌았는데도 endflag 가 0이면 {0,0} 리턴.
    int end_spot = 0;
    wordlist.insert(words[0]);
    for(int i = 1; i < words.size(); i++)
    {
        int prev_wordlen = words[i-1].size();
        if (words[i][0] != words[i-1][prev_wordlen-1]) //이어지는 말로 안함.
        {
            end_spot = i;
            end_flag = 1;
            break;
        }
        if(wordlist.find(words[i]) != wordlist.end()) //    사전내에 있을 떄,
        {
            end_flag = 1;
            end_spot = i;
            break;
        }
        else
            wordlist.insert(words[i]);
    }
    end_spot++;
    if(end_flag == 0)
    {
        answer.push_back(0); answer.push_back(0);
        return answer;
    }
    int outman = end_spot%n;
    if(outman == 0) outman = n;
    int outcount = (end_spot) / n;
    if(end_spot % n >= outman)
        outcount++;
    answer.push_back(outman); answer.push_back(outcount);
    return answer;
}