본문 바로가기

코딩테스트/프로그래머스

[Level 2][C++] 영어 끝말잇기

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

using namespace std;

//해쉬 테이블에 문자열을 집어 넣는 함수
bool inputTable(string s, vector<vector<string>>& hashT) 
{
     //해시 키는 맨 앞에 있는 알파벳이다. 
     int key = s.front()-'a';  
     if(hashT[key].empty()) //비어있으면 집어넣고 끝.
     {
          hashT[key].push_back(s);
          return true;
     }
     else
     { 
          for(int i=0; i<hashT[key].size(); i++) //비어있지 않다면 같은게 있나 검사.
               if(hashT[key][i].compare(s)==0) //문자열 비교
                    return false; 

          hashT[key].push_back(s);  //없으면 저장.
          return true;
     }
}

vector<int> solution(int n, vector<string> words) {
    //맨 앞 알파벳에 따라 분류되도록 해시 테이블을 만들었다. 26은 알파벳 개수.
    vector<vector<string>> hashT(26); 

     if(words[0].length()<2)
          return {1, 1};
     else
          inputTable(words[0], hashT);  //첫번째 문자열 먼저 해시 테이블에 집어 넣는다.

     int idx = 1;  //다음 문자열로 넘어감.
     char end = words[0].back();  //첫번째 문자열의 맨 끝 문자 저장.
     for( ;idx<words.size(); idx++)
     {
          if(words[idx].length() < 2)   //한 글자만 있으면 틀린 거.
               break;

          char begin = words[idx].front(); //다음 문자열의 처음을 저장.
          if(begin != end) //첫번째와 두 번째 문자가 같지 않다면 틀린 거. 
               break;

         //해시 테이블에 집어넣는 역할 + 같은 게 있으면 틀린 거.
          if (!inputTable(words[idx], hashT)) 
               break;
          end = words[idx].back();  //다 넘어오면 두 번째 문자열의 맨 끝 문자 저장.
}

     if (idx == words.size())   //문자열 다 돌고서도 틀린 사람이 없으면 0, 0 반환.
          return { 0, 0 };

     int personN = (idx+1) % n;  //n으로 나눈 나머지로 몇 번째 사람인지 알 수 있다.
     int turnN = (idx+1) / n + 1;  //몇 회째인 지도..
     if (personN == 0)
     {
          personN = n;
          turnN = (idx+1) / n;
     }

     return { personN, turnN };
}

 

물론 첫번째부터 전체 문자열 조사하면서 같은 걸 찾는 방법도 있었지만
매번 문자열 전체를 조사한다는 건 너무 힘들 거 같아서
해시 테이블에 저장해가면서 맨 앞 알파벳 같은 애들끼리만 비교하는 걸로 짰다.

'코딩테스트 > 프로그래머스' 카테고리의 다른 글

[Level 2][C++] 소수 만들기  (0) 2024.10.01
[Level 2][C++] 점프와 순간 이동  (0) 2024.10.01
[Level 2][C++] 구명보트  (0) 2024.10.01
[Level 1][C++] N으로 표현  (0) 2024.10.01
[Level 1][C++] 체육복  (0) 2024.10.01