1부터
n
까지 번호가 붙어 있는 n명의 사람이 영어 끝말잇기를 하고 있습니다. 영어 끝말잇기는 다음과 같은 규칙으로 진행됩니다.
1. 1번부터 번호 순서대로 한 사람씩 차례대로 단어를 말합니다.
2. 마지막 사람이 단어를 말한 다음에는 다시 1번부터 시작합니다.
3. 앞사람이 말한 단어의 마지막 문자로 시작하는 단어를 말해야 합니다.
4. 이전에 등장했던 단어는 사용할 수 없습니다.
5. 한 글자인 단어는 인정되지 않습니다.
다음은 3명이 끝말잇기를 하는 상황을 나타냅니다.
tank → kick → know → wheel → land → dream → mother → robot → tank
위 끝말잇기는 다음과 같이 진행됩니다.
- 1번 사람이 자신의 첫 번째 차례에 tank를 말합니다.
- 2번 사람이 자신의 첫 번째 차례에 kick을 말합니다.
- 3번 사람이 자신의 첫 번째 차례에 know를 말합니다.
- 1번 사람이 자신의 두 번째 차례에 wheel을 말합니다.
- (계속 진행)
끝말잇기를 계속 진행해 나가다 보면, 3번 사람이 자신의 세 번째 차례에 말한 tank 라는 단어는 이전에 등장했던 단어이므로 탈락하게 됩니다.
사람의 수
n
과 사람들이 순서대로 말한 단어words
가 매개 변수로 주어질 때, 가장 먼저 탈락하는 사람의 번호와 그 사람이 자신의 몇 번째 차례에 탈락하는지를 구해서 return 하도록 solution 함수를 완성해 주세요.
- 끝말잇기에 참여하는 사람의 수 n은 2 이상 10 이하의 자연수입니다.
words
는 끝말잇기에 사용한 단어들이 순서대로 들어 있는 배열이며, 길이는n
이상 100 이하입니다.- 단어의 길이는 2 이상 50 이하입니다.
- 모든 단어는 알파벳 소문자로만 이루어져 있습니다.
- 끝말잇기에 사용되는 단어의 뜻(의미)은 신경 쓰지 않으셔도 됩니다.
- 정답은 [ 번호, 차례 ] 형태로 return 해 주세요.
- 만약 주어진 단어들로 탈락자가 생기지 않는다면, [0, 0]을 return 해주세요.
n | words | result |
---|---|---|
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] |
2 | ["hello", "one", "even", "never", "now", "world", "draw"] | [1,3] |
import java.util.HashMap;
import java.util.Map;
class Solution {
public int[] solution(int n, String[] words) {
int []answer = new int[2];
int []user = new int[n];
int index = 0;
Map<String, Integer> cmpWord = new HashMap<>();
for(int i=0; i< words.length; i++)
cmpWord.put(words[i], 0 );
for(int i=0; i< words.length; i++){
user[index]++;
if(cmpWord.get(words[i]) == 1
||(i>0 && !words[i-1].substring(words[i-1].length()-1).equals(words[i].substring(0,1)))){
answer[0] = index+1;
answer[1] = user[index];
break;
}
index = (index+1)%n;
cmpWord.replace(words[i], cmpWord.get(words[i])+1);
}
return answer;
}
}
🧩 String 타입의 key와 Integer 타입의 value를 저장할 수 있는 Map을 하나 만들어 주었다 key는
words
배열에 있는 단어들이며, value는 해당 key가 나온 빈도수로, 일단 0으로 다 초기화 시켜 둔다
🧩 배열
words
를 차례대로 돌면서 끝말잇기를 진행하게 된다 배열user
는 유저의 차례를 나타내기 위해 만든 배열이며 유저의 차례가 오면 값을 1씩 증가시켜 준다 유저의 차례에 나온 단어가 Map에서 value가 1이거나 즉, 이전에 어떤 유저에 의해 한 번 언급된 적 있는 단어이거나 이전 단어의 알파벳과 유저 차례에 나온 단어의 알파벳이 일치하지 않을 경우 배열answer
에 유저 번호와 몇 번째 차례인지 저장을 하고 바로 반복문을 탈출해 주도록 하였다
🧩 위의 조건문에 걸리지 않았다면 다음 유저로 넘어가게 해 준다
index
가 유저를 나타내는 변수이며 다음 유저를 나타내기 위해 원형 큐 형식으로index
값을 증가시켜 준다 그리고 유저 차례에 나온 단어의 빈도수를 1 증가한다
종강 후 처음 푸는 문제입니다... 이번 방학은 준비할 팀플이 많지만 그래도 꾸준히 풀어 보는 걸로... 😭