728x90
문제 설명
n명의 사람이 영어 끝말잇기를 진행하고 있습니다. 규칙은 다음과 같습니다:
- 1번부터 순서대로 단어를 말합니다. 마지막 사람이 단어를 말하면 다시 1번으로 돌아옵니다.
- 앞 사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
- 이미 말한 단어는 사용할 수 없습니다.
- 한 글자 단어는 사용할 수 없습니다.
탈락 조건:
- 앞사람이 말한 단어의 마지막 문자로 시작하지 않는 단어를 말한 경우.
- 이전에 사용된 단어를 다시 말한 경우.
탈락자가 생긴다면, 해당 사람의 번호와 몇 번째 차례에 탈락했는지를 [번호, 차례] 형태로 반환합니다. 탈락자가 없다면 [0, 0]을 반환합니다.
제한 조건
- n: 2 ≤ n ≤ 10
- words.length: n ≤ words.length ≤ 100
- 각 단어의 길이: 2 ≤ 단어의 길이 ≤ 50
- 모든 단어는 알파벳 소문자로 이루어져 있습니다.
해결 방법
알고리즘: 해시셋(Hash Set)
- 중복 단어 관리
- 사용된 단어를 빠르게 확인하기 위해 Set 자료구조를 사용합니다.
- 단어가 이미 Set에 존재하면 규칙을 위반한 것으로 간주합니다.
- 끝말잇기 규칙 확인
- 현재 단어의 첫 글자가 이전 단어의 마지막 글자와 다른 경우 규칙 위반입니다.
- 순서와 차례 계산
- 탈락한 사람의 번호는 i % n + 1, 차례는 Math.floor(i / n) + 1로 계산합니다.
- 탈락 조건
- Set에 단어가 이미 존재하거나, 끝말잇기 규칙을 위반한 경우 탈락자를 반환합니다.
- 탈락자가 없을 경우
- 모든 단어를 순회한 후에도 규칙 위반이 없으면 [0, 0]을 반환합니다.
시간 복잡도
- Set 연산
- Set.has 및 Set.add는 평균적으로 O(1)입니다.
- words.length 만큼 순회하므로 O(n)입니다.
- 총 시간 복잡도
- O(n)
구현 코드
function solution(n, words) {
const set = new Set();
let lastWord = words[0][0];
for (let i = 0; i < words.length; ++i) {
const currentWord = words[i];
if (currentWord[0] !== lastWord || set.has(currentWord)) {
return [(i % n) + 1, Math.floor(i / n) + 1];
}
set.add(words[i]);
lastWord = currentWord[currentWord.length - 1];
}
return [0, 0];
}
'알고리즘' 카테고리의 다른 글
[Typescript] 백준 27535번 제주 초콜릿 지키기 (0) | 2025.01.05 |
---|---|
[Javascript] 프로그래머스 - 예산 (0) | 2025.01.04 |
[Javascript] 프로그래머스 - 점프와 순간 이동 (0) | 2025.01.04 |
[Javascript] 프로그래머스 - 피보나치 수 (0) | 2025.01.04 |
[Javascript] 프로그래머스 - 최댓값과 최솟값 (0) | 2025.01.04 |