#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 |