[프로그래머스] 영어 끝말잇기
Programmers - [Summer/Winter Coding(~2018)] 영어 끝말잇기
사용 언어 - C++
소요 시간 - 약 56분
문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/12981
문제 요약
- n명의 사람이 영어 끝말잇기
- 이어지지 않는 경우 탈락
- 이미 나왔던 단어일 경우 탈락
- 탈락한 경우, 탈락한 단어의 배열 위치를 return
- 탈락자가 없는 경우, [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;
}
트러블 슈팅
- 갑자기 find를 하지 못하는 경우 어떤 값을 반환하는지를 까먹어 시간을 좀 오래 잡아먹었다.
- segmentation fault → words[i].front() != words[i - 1].back()를 i > 0보다 먼저 체크해서 발생
- 코드 실행 단계에서는 전부 맞았지만, 제출 단계에서 대부분 오답으로 나옴 → bCheck가 true일 때, answer를 저장한 후에 for문을 빠져나와야 하는데, break 구문이 없어 빠져나오지 못해 오답이 발생
풀이 절차
- answer는 기본적으로 [0, 0]
- 전 단어의 끝과, 현재 단어의 처음을 비교
- 같은 단어가 있었던 경우를 찾아 1,2번 모두 answer를 해당 위치로 저장
- for문을 빠져나가지 않았다면 checkEqual에 해당 단어 추가
문제 풀이 후 소감
- 조건을 살펴보면서 어떻게 코드를 구성해야할지 조금 더 생각해봐야겠다. 이번에는 어쩌다 찾았지만, 5분만 늦게 찾았어도 생각한 시간 내에 풀지 못했을 것 같다.
- 자주 쓰이는 함수라면, 어떤 역할인지, 어떤 경우에 어떤 값을 반환하는지는 정확하게 알고 있어야 할 것 같다.