프로그래머스에서 연습중에 영어 끝말잇기라는 문제를 풀어보았습니다.
같은 LV2인 오픈채팅방의 경우 시간초과 뜨면서 맨붕이 왔었는데 이번 영어 끝말잇기 문제는 체감상 굉장히 쉬웠던 것 같습니다.(substring 기억안나서 검색해본건 비밀)
문제의 핵심은 아래와 같았습니다.
1. 이전 단어의 끝 글자와 현재 단어의 첫 글자가 일치하는지
2. 이전에 중복된 단어가 있었는지
3. 몇 번째 순번의 사람이 틀렸는지
4. 몇 번째 차례에서 틀렸는지
각각 아래와 같이 해결 하였고 전체 코드는 하단에 첨부하였습니다.
1. 이전 단어의 끝 글자와 현재 단어의 첫 글자가 일치하는지 -> substring 사용
2. 이전에 중복된 단어가 있었는지 -> HashSet 사용
3. 몇 번째 순번의 사람이 틀렸는지 -> 주어진 인원수를 이용하여 증가 및 초기화
4. 몇 번째 차례에서 틀렸는지 -> 나머지 계산 사용(%)
import java.util.*;
public class Solution {
public int[] solution(int n, String[] words) {
Set<String> dupCheckSet = new HashSet<>(); // 중복체크를 위한 HashSet
int count = 1; // 차례
int num = 1; // 번호
String prev = String.valueOf(words[0].charAt(0)); // 첫단어는 패스하도록 세팅
for (int i = 0; i < words.length; i++) {
String target = words[i];
boolean result = checkWordChain(prev, target, dupCheckSet);
if (result) {
if (words.length - 1 == i) { // 마지막 순번인데 통과라면 실패한 사람이 없다는 뜻
num = 0;
count = 0;
}
prev = target;
} else {
break;
}
if (words.length - 1 != i) {
if (num == n) { // 번호 계산
num = 1;
} else {
num++;
}
if ((i + 1) % n == 0) { // 차례 계산
count++;
}
}
}
return new int[]{num, count};
}
private static boolean checkWordChain(String prev, String now, Set<String> dupCheckSet) {
// 중복체크
if (dupCheckSet.contains(now)) {
return false;
} else {
dupCheckSet.add(now);
}
// 이전단어 마지막글자와 현단어 첫글자가 다르면 false
return prev.substring(prev.length() - 1).equals(now.substring(0, 1));
}
}
다 만들고 보니 번호와 차례 계산은 최종 i와 n을 나누고 몫과 나머지를 이용하는게 더 깔끔한 것 같습니다.