컴굥일지

[Programmers/프로그래머스 lv2][C++] 영어 끝말잇기 본문

알고리즘/코테 문제

[Programmers/프로그래머스 lv2][C++] 영어 끝말잇기

gyong 2023. 7. 1. 23:06
반응형

문제

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

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

 

문제 내용

n명의 사람이 번갈아가며 끝말잇기를 한다. 

우리가 구해야 하는 것은 가장 먼저 탈락한 사람의 번호몇 번째 차례에 탈락했는지이다. (몇 번째 라운드였는지)

만약 탈락자가 없다면 [0,0]을 반환하면 되고, 탈락의 기준은 아래와 같다.

1. 앞 사람이 말한 단어의 마지막 글자로 시작하지 않는 경우
2. 이미 앞에 나온 단어를 말한 경우

 

문제 풀이

단순히 반복문을 돌며 탈락 조건에 해당하는지 파악하면 되는 구현 문제이다.

반복문이 끝날 때까지 탈락 조건에 걸리는 경우가 없으면, 탈락자가 없다는 뜻이므로 [0,0]을 반환하면 된다.

탈락 조건 중 2번(이미 앞에 나온 단어를 말한 경우)을 판단하기 위해 set을 사용하여 체크한다.

 

코드

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

using namespace std;

vector<int> solution(int n, vector<string> words) {
    vector<int> answer(2, 0);
    set<string> usedWords;

    string lastWord = words[0];
    usedWords.insert(lastWord);

    for (int i = 1; i < words.size(); i++) {
        // 이전 글자의 마지막으로 시작하지 않거나 이미 사용된 글자인 경우 탈락
        if (lastWord[lastWord.size() - 1] != words[i][0] || usedWords.count(words[i]) != 0) {
            answer[0] = i % n + 1; // 사람 번호
            answer[1] = i / n + 1; // 몇회차에 탈락하는지
            return answer;
        }
        lastWord = words[i];
        usedWords.insert(lastWord);
    }

    return answer;
}

 

문제 코드 설명

문제를 풀다가 인덱스 때문에 자꾸 답이 이상하게 나왔어서 표로 정리해보았다.

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

n=3 일 때, i%3 했을 때와 i/3 했을 때의 값이 위와 같다.

사람의 번호는 1번부터 시작하기 때문에, i%n+1 이어야 한다.

회차 또한 0회부터 시작하는 것이 아니라 1회부터 이어야 하므로 i/n+1 로 적어주어야 한다.

반응형
Comments