프로그래머스 - 영어 끝말잇기
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
class Solution {
public int[] solution(int n, String[] words) {
HashMap<Integer, List<String>> map = new HashMap<>();
int[] result = new int[2];
for (int i = 0; i < words.length; i++) {
int person = i % n;
map.putIfAbsent(person, new ArrayList<>());
String word = words[i];
map.get(person).add(word);
if (i != 0) {
String before = words[i - 1];
if (word.charAt(0) != before.charAt(before.length() - 1) || isBeforeSaying(words, i, word)) {
result[0] = person + 1;
result[1] = map.get(person).indexOf(word) + 1;
break;
}
}
}
return result;
}
private boolean isBeforeSaying(String[] words, int end, String word) {
for(int i=0; i<end; i++) {
if(words[i].equals(word)) {
return true;
}
}
return false;
}
}
- 사람의 수 만큼 말한 단어를 저장, 번갈아 가면서 말해야 하니 n으로 나눈 나머지로 사람 구분
- 3명 -> 0 ~ 2번 사람으로 하기 위해 n으로 나눈 나머지로 사람 구분
- 저장하고, 이전 단어의 끝 알파벳과 말한 단어의 첫 글자 비교해서 같지 않으면 해당 사람이 진 것
- 또는 이미 이전에 말했는지 검사해보고, 말 했었으면 해당 사람이 진 것
- contains 메소드를 사용해서 처음에 했으나, 20번 케이스 실패
- "sqwes", "sqwe" 의 경우 contains 했을 때 다 인식해버림
- 반례 : 2, ["qwe", "sqwes", "sqwe"]
- 따라서 isBeforeSaying 메서드를 생성하여 이전에 동일한 단어 있는지 검사
- 출처