알고리즘/프로그래머스

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

lheunoia 2022. 2. 18. 19:48

 

 

 

https://programmers.co.kr/learn/courses/30/lessons/12981

 

코딩테스트 연습 - 영어 끝말잇기

3 ["tank", "kick", "know", "wheel", "land", "dream", "mother", "robot", "tank"] [3,3] 5 ["hello", "observe", "effect", "take", "either", "recognize", "encourage", "ensure", "establish", "hang", "gather", "refer", "reference", "estimate", "executive"] [0,0]

programmers.co.kr

 

 

 

이번 문제는 구현 문제였습니다.

 

단어의 중복을 피하기 위해 map 자료구조를 사용하면 더 쉬웠을 거 같아요!

 

 

 

 

 

《문제 풀이》

 

1. 끝말잇기를 할 때 이전에 등장했던 단어인지 체크하기 위해 appear 벡터 생성

2. 현재 단어의 첫 번째 문자가 이전 단어의 마지막 문자와 같지 않거나 현재 단어가 이전에 등장했던 단어이면 
     ☛ 사람의 번호, 차례 반환

3. 탈락자가 없다면 

     ☛ 0, 0 반환

 

 

 

 

 

《C++ 코드》

 

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

using namespace std;

vector<int> solution(int n, vector<string> words) {
    int label = 1;
    int cnt = 1;
    
    vector<string> appear;
    appear.push_back(words[0]); // 첫 번째 단어 추가
    
    for (int i=1; i<words.size(); i++) {
        // 끝말잇기를 n번 수행했다면
        if (label == n) {
            label = 1; // 1번 사람부터 다시 시작
            cnt++; // 다음 차례
        } else label++;
        
        // 규칙에 맞지 않게 끝말잇기를 했다면             
        if (words[i].front() != words[i-1].back() || find(appear.begin(), appear.end(), words[i]) != appear.end()) {
            return { label, cnt };
        }
        appear.push_back(words[i]);
    }
    
    return { 0, 0 };
}

 

 

 

 

 

프로그래머스 - 정답 화면

 

 

 

 

반응형