import java.util.*;
class Solution {
public int[] solution(int n, String[] words) {
int[] answer = new int[2];
int [] h= new int [n];
Stack st = new Stack();
List list = new ArrayList();
list.add(words[0]);
for(int i= 0; i<words.length;i++) {
if(i==0) {
h[i%n]++;
continue;
}
h[i%n]++;
st.push(words[i-1].charAt(words[i-1].length()-1));
char c= (char)st.peek();
if(words[i].charAt(0) == c) {
if(list.contains(words[i])) {
answer[0]= (i%n)+1;
answer[1]= h[i%n];
break;
}
list.add(words[i]);
st.pop();
if(i==words.length-1) {
answer[0]= 0;
answer[1] = 0;
}
} else {
answer[0]= (i%n)+1;
answer[1]= h[i%n];
break;
}
}
return answer;
}
}
(1) 비교하기위한 스택 객체 st 선언, 불렀던 단어인지 포함여부를 확인하기 위한 리스트 객체 선언
첫 번째는 무조건 불렸기 때문에 words[0] 단어는 먼저 리스트에 추가, 각 사람의 순번에 따른 횟수를 체크하기위한 h 배열 선언
(2) 첫 번째는 무조건 한 번 부르기 때문에 첫 번째 사람의 횟수 증가
(3) 각 자리의 마지막 알파벳 스택 객체에 추가하여 다음 알파벳에 첫 번째와 같은지 체크하여 해당 단어 포함여부 체크 후 각 자리 증가
import java.util.HashSet;
class Solution {
public int[] solution(int n, String[] words) {
int[] answer = { 0, 0 };
char chEnd = words[0].charAt(words[0].length() - 1);
char chStart;
System.out.print(chEnd + " ");
HashSet<String> log = new HashSet<>();
log.add(words[0]);
for (int i = 1; i < words.length; i++) {
chStart = words[i].charAt(0);
log.add(words[i]);
if (chEnd != chStart || log.size() != i + 1) {
System.out.print(i + 1 + "!");
answer[0] = (i % n)+1;
answer[1] = (i / n) + 1;
break;
}
chEnd = words[i].charAt(words[i].length() - 1);
System.out.print(chEnd + " ");
}
System.out.println();
System.out.println("(" + answer[0] + ", " + answer[1] + ")");
return answer;
}
}
(1) 중복 체크할 때 HashSet도 사용 가능하다는 걸 알아두자
스택을 사용해보니 비교하여 체크할 때 스택을 사용하는 것이 좋다고 느껴졌다. 근데 아직 스택 활용하는 알고리즘에 많이 익숙하지 않은 것 같다.. 시간이 들었는데 다른 사람이 스택을 활용하여 푼 건 거의 없는 것 같다. 시간복잡도, 효율성 측면에서 HashSet 쓰는 것이 더 효율적이니 다음엔 HashSet을 활용해서 풀어보자
코테 공부 파이팅입니다!!