public class Solution {
// [3차] 자동완성 // 테스트 케이스 부족, 시간 초과
public static int strContainWordCnt(String[] words, String str) {
int cnt = 0;
for (String word : words) {
if (word.contains(str)) {
cnt++;
}
if (cnt > 1) return 2;
}
return cnt;
}
public static int solution(String[] words) {
int answer = 0;
String word = ""; // words 배열 속 원소
StringBuilder sb = new StringBuilder(); // 문자열 비교를 위한 StringBuilder
for (int i = 0; i < words.length; i++) { // words의 문자 하나씩 체크
word = words[i];
sb.setLength(0); // StringBuilder 초기화
for (int j = 0; j < word.length(); j++) {
sb.append(word.charAt(j));
// if (Arrays.asList(words).contains(sb.toString())) // 배열이 특정 문자열을 포함하는지 여부를 확인할 때 사용
//
// System.out.println(Collections.frequency(Arrays.asList(words), sb.toString())); // 이건 sb.toString()이 배열에 몇 개 들어있는지 체크네
//
// if (Collections.frequency(Arrays.asList(words), sb.toString()) == 1 || j == word.length() - 1) { // 특정 문자열을 포함하는 문자가 1개 남았거나, 2개 이상 남았어도 특정 문자열이 현재 i번째 word 자체인 경우
// answer += j + 1; // j는 0부터 시작했으므로 개수는 + 1
// break; // 안쪽 for문 탈출
// } else {
// continue;
// }
if (strContainWordCnt(words, sb.toString()) == 1 || j == word.length() - 1) { // 특정 문자열을 포함하는 문자가 1개 남았거나, 2개 이상 남았어도 특정 문자열이 현재 i번째 word 자체인 경우
answer += j + 1; // j는 0부터 시작했으므로 개수는 + 1
break; // 안쪽 for문 탈출
} else {
continue;
}
}
}
return answer;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
String[] words = {"worlll","warrior","war","word","world"}; // "abc","def","ghi","jklm" // 4 // a, d, g, j만 입력하면 자동완성 가능
System.out.println(solution(words)); // 21
// "worlll","warrior","war","word","world"
// "worll" ,"warr" ,"war","word","world" // 5 + 4 + 3 + 4 + 5
// "worlll","warrior","war","word","world" // false false false false false
// "w" 입력했을 때 후보 5개 (worlll길이보다 작아)
// "wo" 입력했을 때 후보 3개 (worlll길이보다 작아)
// "wor" 입력했을 때 후보 3개 (worlll길이보다 작아)
// "worl" 입력했을 때 후보 2개 (worlll길이보다 작아)
// "worll" 입력했을 때 후보 1개(5) (worlll길이보다 작아) // true false false false false
// "w" 입력했을 때 후보 5개 (warrior길이보다 작아)
// "wa" 입력했을 때 후보 2개 (warrior길이보다 작아)
// "war" 입력했을 때 후보 2개 (warrior길이보다 작아)
// "warr" 입력했을 때 후보 1개(4) (warrior길이보다 작아) // true true false false false
// "w" 입력했을 때 후보 5개 (war길이보다 작아)
// "wa" 입력했을 때 후보 2개 (war길이보다 작아)
// "war" 입력했을 때 후보 2개 but war길이와 같아(3) // true true true false false
// "w" 입력했을 때 후보 5개 (word길이보다 작아)
// "wo" 입력했을 때 후보 3개 (word길이보다 작아)
// "wor" 입력했을 때 후보 3개 (word길이보다 작아)
// "word" 입력했을 때 후보 1개 and word길이와 같아(4) // true true true true false
// "w" 입력했을 때 후보 5개 (world길이보다 작아)
// "wo" 입력했을 때 후보 3개 (world길이보다 작아)
// "wor" 입력했을 때 후보 3개 (world길이보다 작아)
// "worl" 입력했을 때 후보 2개 (world길이보다 작아)
// "world" 입력했을 때 후보 1개 and world길이와 같아(5) // true true true true true
// 첫 번째 단어부터 마지막 단어까지 체크
// 한 단어를 앞에서부터 차례로 자르면서 더하고 그 단어가 전체 단어 배열 중 몇 개의 단어와 일치할 수 있는지 판단
// 후보가 1개이거나 or 2개 이상 존재할지라도 마지막 글자까지 잘라서 더한 상태라면(현재 단어 그 자체라면) 현재까지 자른 글자 수 카운트해서 더하기
}
}
문자열 배열 {"AB", "ABC", "BC", "ZX"} 이 있을 때
문자열 "AB"를 포함하는 원소의 개수를 알고싶을 때
배열의 길이만큼 반복하며 체크하는 방법 외에
2를 바로 리턴받을 수 있는 방법이 있을까?
프로그래머스 자동완성 문제 풀이 Java 소스 코드
'Java > 프로그래머스' 카테고리의 다른 글
[Java] 프로그래머스 [Level-4] 도둑질 (0) | 2022.08.31 |
---|---|
[Java] 프로그래머스 [Level-4] [3차]파괴되지 않은 건물 (0) | 2022.08.31 |
[Java] 프로그래머스 [Level-2] 주차 요금 계산 (0) | 2022.08.31 |
[Java] 프로그래머스 [Level-2] 땅따먹기 (0) | 2022.08.31 |
[Java] 프로그래머스 [Level-1] 이상한 문자 만들기 (0) | 2022.08.31 |