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



Programmers - [Summer/Winter Coding(~2018)] 영어 끝말잇기




사용 언어 - C++

소요 시간 - 약 56분




문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12981




문제 요약

  1. n명의 사람이 영어 끝말잇기
  2. 이어지지 않는 경우 탈락
  3. 이미 나왔던 단어일 경우 탈락
  4. 탈락한 경우, 탈락한 단어의 배열 위치를 return
  5. 탈락자가 없는 경우, [0, 0] return




최종 코드

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

using namespace std;

vector<int> solution(int n, vector<string> words) {
    vector<int> answer;
    vector<string> checkEqual;
    
    answer = { 0, 0 };
    
    for(int i = 0; i < words.size(); i++)
    {
        bool bCheck = false;
        //끝말잇기가 되지 않는 경우
        bCheck |= (i > 0 && words[i].front() != words[i - 1].back());
        //같은 단어가 나오는 경우
        bCheck |= (find(checkEqual.begin(), checkEqual.end(), words[i]) != checkEqual.end());
        
        if(bCheck)
        {
            answer = { i % n + 1, i / n + 1 };
            break;
        }
        
        checkEqual.push_back(words[i]);
    }

    return answer;
}




트러블 슈팅

  1. 갑자기 find를 하지 못하는 경우 어떤 값을 반환하는지를 까먹어 시간을 좀 오래 잡아먹었다.
  2. segmentation fault → words[i].front() != words[i - 1].back()를 i > 0보다 먼저 체크해서 발생
  3. 코드 실행 단계에서는 전부 맞았지만, 제출 단계에서 대부분 오답으로 나옴 → bCheck가 true일 때, answer를 저장한 후에 for문을 빠져나와야 하는데, break 구문이 없어 빠져나오지 못해 오답이 발생




풀이 절차

  1. answer는 기본적으로 [0, 0]
  2. 전 단어의 끝과, 현재 단어의 처음을 비교
  3. 같은 단어가 있었던 경우를 찾아 1,2번 모두 answer를 해당 위치로 저장
  4. for문을 빠져나가지 않았다면 checkEqual에 해당 단어 추가




문제 풀이 후 소감

  • 조건을 살펴보면서 어떻게 코드를 구성해야할지 조금 더 생각해봐야겠다. 이번에는 어쩌다 찾았지만, 5분만 늦게 찾았어도 생각한 시간 내에 풀지 못했을 것 같다.
  • 자주 쓰이는 함수라면, 어떤 역할인지, 어떤 경우에 어떤 값을 반환하는지는 정확하게 알고 있어야 할 것 같다.