3042. Count Prefix and Suffix Pairs I
https://leetcode.com/problems/count-prefix-and-suffix-pairs-i/
이번 문제도 문자열을 비교하는 문제이다.
접두사 및 접미사의 쌍 계산 이라고 번역이 되는데 문제를 보자.
당신에게 0으로 시작하는 문자열 배열 words가 주어졌습니다.
두 문자열 str1과 str2를 인수로 받는 isPrefixAndSuffix라는 부울 함수를 정의해봅시다:
isPrefixAndSuffix(str1, str2) 함수는 str1이 str2의 접두사이면서 동시에 접미사인 경우 true를 반환하고,
그렇지 않은 경우 false를 반환합니다.
예를 들어, isPrefixAndSuffix("aba", "ababa")는 aba가 ababa의 접두사이자 접미사이기 때문에 true를 반환하지만,
isPrefixAndSuffix("abc", "abcd")는 false를 반환합니다.
이제 주어진 words 배열에서 i < j를 만족하는 인덱스 쌍 (i, j)의 수를 반환하세요. 이때, isPrefixAndSuffix(words[i], words[j])가 true인 경우만 포함됩니다.
그리고 예제를 보면
예제 1.
Input: words = ["a","aba","ababa","aa"]
Output: 4
Explanation: In this example, the counted index pairs are:
i = 0 and j = 1 because isPrefixAndSuffix("a", "aba") is true.
i = 0 and j = 2 because isPrefixAndSuffix("a", "ababa") is true.
i = 0 and j = 3 because isPrefixAndSuffix("a", "aa") is true.
i = 1 and j = 2 because isPrefixAndSuffix("aba", "ababa") is true.
Therefore, the answer is 4.
예제 2.
Input: words = ["pa","papa","ma","mama"]
Output: 2
Explanation: In this example, the counted index pairs are:
i = 0 and j = 1 because isPrefixAndSuffix("pa", "papa") is true.
i = 2 and j = 3 because isPrefixAndSuffix("ma", "mama") is true.
Therefore, the answer is 2.
딱 이 예제까지만 봤을때는 아 이 문제는 0번째 배열의 값부터 시작해서 마지막 값까지 비교해서
같은 문자열이 앞 뒤에 존재하는지 확인하는 문제구나! 라고 생각했다
그래서 그대로 코드를 짜 봤는데...
class Solution {
public int countPrefixSuffixPairs(String[] words) {
int count = 0;
for(int i = 0; i < words.length; i++){
for(int j = 0; j < words.length; j++){
// 동일한 문자인지 체크
if(!words[i].equals(words[j])){
// 접두사와 접미사가 동일한지 비교
if(words[i].startsWith(words[j]) && words[i].endsWith(words[j])){
count++;
}
}
}
}
return count;
}
}
여기서 포인트는 startsWith() 함수와 endsWith() 함수다.
각각 문자열 앞자리와 뒷자리 부분이 동일한지 비교하여 boolean 값으로 반환하는 함수이다.
그래서 결과는 1,2 예제는 통과 했는데 마지막 예제를 통과하지 못했다.
예제 3.
Input: words = ["abab","ab"]
Output: 0
Explanation:
이 예에서 유일한 유효한 인덱스 쌍은 i = 0 및 j = 1이고
isPrefixAndSuffix("abab", "ab")는 false입니다. 그러므로 답은 0이다.
내 코드대로 계산한다면 "abab"에는 앞 뒤로 "ab", "ab"가 들어가기에 ture, 즉 1을 반환했는데 답은 false, 0 이였다.
이것때문에 어디서부터 잘못된건지 내가 뭘 잘못 이해하고 있는지 고민하다가 결국 문제 하단에 있는 토목록에서 힌트를 얻었다.
바로 문제에 하단에 나와있는 i < j 를 확인하란 것이였다.
그말은 즉슨 i 번 부터 j까지 확인하라, i의 값이 j에 접두사 및 접미사가 되느냐? 를 물어보는 문제였다.
고로 "abab" 가 i 이고, "ab"는 j 이기 때문에 "abab"가 "ab"의 접두사나 접미사가 될순 없기 때문에 틀린것이였다.
그래서 이를 참고해 코드를 수정했다.
class Solution {
public int countPrefixSuffixPairs(String[] words) {
int count = 0;
for(int i = 0; i < words.length; i++){
for(int j = i+1; j < words.length; j++){
if(words[j].startsWith(words[i]) && words[j].endsWith(words[i])){
count++;
}
}
}
return count;
}
}
더 간결해졌고 정답도 맞췄다.
항상 문제를 잘 읽고 먼저 이해한 다음에 코드를 작성해보자.
또 필요한 함수가 있는지 한번 더 체크해보고 작성해야겠다.