문제
풀이
public int[] solution(int n, String[] words) {
Set<String> called = new HashSet<>();
char prevLast = ' ';
for (int i = 0; i < words.length; i++) {
if ((i != 0 && !words[i].startsWith(String.valueOf(prevLast)))
|| called.contains(words[i]) || words[i].length() == 1) {
return new int[]{(i % n) + 1, (i / n) + 1};
} else {
called.add(words[i]);
prevLast = words[i].charAt(words[i].length() - 1);
}
}
return new int[]{0, 0};
}
- 문제의 조건 판별
- 불려진 단어인지 확인을 하기 위해 Set 에 불린 단어를 추가하고
contains(String s) 메서드를 통해 확인
- 이 때 ArrayList 의 contains() 는 시간복잡도가 O(n) 이고 Set의 contains() 는 O(1) 이라 Set 사용
- Map을 사용해도 될 것 같긴 하다. 다만 있는지 여부만 확인하면 되니까 Map의 value 가 의미가 없는 것 같아서 Set 을 사용했다.
- 각 단어가 정상적으로 불려졌을 경우 단어의 마지막 문자를 prevLast 에 저장해두고 매 단어마다 prevLast 로 시작하는지 여부를 확인
- 길이 1인지 아닌지 확인
- 문제의 조건에 따라 탈락하는 경우가 발생했을 때
- 탈락한 사람이 몇 번인지
- i 를 전체 사람 수 n 으로 나누었을 때의 나머지에 +1 (인덱스는 0부터 시작하니까 + 1)
- 탈락한 사람이 몇 번째 자기 차례에서 탈락한 건지
- i 를 n 으로 나눈 몫에서 + 1
- 몫을 바로 구하면 소수점 부분이 제거되기 때문에 + 1