영어 끝말잇기

NJW·2022년 4월 17일
0

코테

목록 보기
35/170

들어가는 말

끝말잇기가 벡터로 주어질 때 몇 번째 사람이 몇 번재 차례에서 탈락했는 지를 구하는 문제다. 끝말잇기의 규칙에서 벗어나는 순간을 찾는 건 어렵지 않았으나 몇 번째 차례와 사람인지를 찾는 것이 조금 까탈스러웠다. 이 부분에서 우왕좌왕한 덕분에 시간을 잡아먹은 듯하다.

코드 설명

제일 먼저 할 일은 answer에다가 0, 0을 넣어주는 일이다. 그래서 모든 단어가 규칙에 부합할 경우 0, 0을 리턴하게 한다. 그리고 앞의 단어의 마지막 문자와 뒤의 단어의 첫 번쩨 문자를 정의힌다. 나는 for를 1부터 돌릴 것이기 때문에 미리 제일 첫 단어의 마지막 문자를 넣어줬다. bool형인 b는 break를 통해서 나왔는지(즉, 규칙에 어긋났는지)를 확인해주는 변수다. turn과 idx는 나란히 몇 번째 차례와 몇 번쩨 순서인지를 알려준다.

for문에는 1부터 시작할 것이기 때문에 tmp_w에는 words[0]을 따로 넣어준다.

for문을 돌려주는 데 먼저 현재 단어의 첫 문자를 first에 넣어준다. 이는 앞의 문자의 마지막과 비교해 둘이 같은 문자인지를 확인하기 위함이다. tmp에는 현재 단어가 이미 말한 단어인지를 찾는 포인터를 넣어준다.
여기서 if가 중요하다. 만일 idx가 사람 수인 n과 같다면 이는 사람이 한 번씩은 단어를 말했다는 거다. 때문에 idx는 0으로 넣어주고(처음 넣었을 때는 1이었다. 왜냐하면 words[0]를 넣었기 때문이다) turn은 ++해준다. 여기서 idx를 1로 넣어줘서 값이 엇나갔다. 그래서 들어가는 말에 내가 아리송했다고 한 거다.
그리고 조건을 따라서 찾아주면 된다. 끝말잇기를 끝내는 조건은 first가 last와 다를 경우, 그리고 중복된 값을 말한 경우다. 이 둘에 해당돼 더이상 끝말잇기가 불가능하다면 idx를 더해주고 b를 false로 만든 다음에 break하면 된다.
만일 끝말잇기를 더 할 수 있다면 통과된 단어를 tmp_w에 넣어준다. 그리고 꼭! last를 갱신해줘야 한다. last는 현재 통과된 단어의 마지막 문자이다. 그래야지 새로운 단어의 첫 번째 문자와 비교를 할 수 있다. 그리고 idx를 ++해주면 된다.

break로 나왔을 경우에는 answer의 값을 0, 0에서 다른 값으로 바꿔줘야 한다. 때문에 b가 false일 경우 answer의 영 번째에는 idx를 첫 번째에는 turn을 넣어준다.

그리고 answer을 반환하면 된다.

코드

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

using namespace std;

vector<int> solution(int n, vector<string> words) {
    vector<int> answer{0, 0};
    vector<string> tmp_w;
    string last = words[0].substr(words[0].length()-1, words[0].length());
    string first = "";
    bool b = true;
    int turn = 1;
    int idx = 1;
    
    tmp_w.push_back(words[0]);
    
    for(int i=1; i<words.size(); i++){
        first = words[i].substr(0, 1);
        auto tmp = find(tmp_w.begin(), tmp_w.end(), words[i]);
        
        if(idx == n){
            idx = 0;
            turn++;
        }
        
        if(last != first){
            idx++;
            b = false;
            break;
        }else if(tmp != tmp_w.end()){
            idx++;
            b = false;
            break;
        }else{
            tmp_w.push_back(words[i]);
            last = words[i].substr(words[i].length()-1, words[i].length());
            idx++;
        }
    }

    if(b == false){
        answer[0] = idx;
        answer[1] = turn;
    }
    
    return answer;
}
profile
https://jiwonna52.tistory.com/

0개의 댓글