CodeWars 일백 열 번째 문제
Updated:
Did you mean …?
private final String[] words;
public Dictionary(String[] words) {
this.words = words;
}
public String findMostSimilar(String to) {
int minPosition = 0;
int maxCount = 0;
for (int i = 0; i < words.length; i++) {
// words 배열을 순회한다.
String s1 = words[i].length() < to.length() ? words[i] : to;
String s2 = words[i].length() < to.length() ? to : words[i];
//비교할 단어와 words의 배열에 있는 단어를 길이에 따라서 셋팅
for (int i1 = 0; i1 <= s2.length() - s1.length(); i1++) {
//긴 단어 길이 - 짧은 단어 길이 = 차이 길이만큼 순회한다.
//무슨 말이냐면 abcde와 abc가 있다면 5-3=2니까 3번 순회
//즉, abcde의 abc, bcd, cde 이렇게 3번을 abc와 비교한다는 뜻이다.
int count = 0;
// 단어 비교할 때 같은 문자(위치까지 같아야 함) count
for (int i2 = 0; i2 < s1.length(); i2++) {
// 단어 비교하면서 같은 문자가 있으면(위치까지 같아야 함) count한다.
if (s1.charAt(i2) == s2.charAt(i2 + i1)) {
count++;
}
}
if ((count - (words[i].length() - count)) >
(maxCount - (words[minPosition].length() - maxCount)) {
// 비교한 단어와 이전 비교한 단어와 비교해서 중복된 단어가 많은 단어를 따로 저장
// 이때 count에 단어의 길이에 count를 뺀 값을 다시 빼는 이유는 다음과 같다.
// 위에 예를 든 것 처럼 abcde와 abc를 비교한다고 하자.
// 처음 abc와 abc를 비교한다. count는 3이다. 그래서 3 - (5-3)이므로 1이다.
// 다음은 bcd와 abc를 비교한다. count는 2이다. 2 - (5-2)이므로 -1이다.
// 마지막 cde와 abc를 비교한다. count는 1이다. 1 - (5-1)이므로 -3이다.
// 그럼 abcde에서 값은 1이다.
// 다음 단어가 cdef라고 하자. 그러면 cde, def 두번 비교할 것이다.
// 처음 cde와 abc를 비교한다. count는 1이다. 1 - (5-1)이므로 -4이다.
// 마지막 def와 abc를 비교한다. count는 0이다. 0 - (5-0)이므로 -5이다.
// 따라서 abd와 비교했을 때 abcde, cdef 중에서는 abcde가 가장 가깝다.
maxCount = count;
minPosition = i;
}
}
}
return words[minPosition];
}
- 몇일 손을 안댔더니… 이런 문제를 못 풀고 있었다.
- 문제 해석은 주석으로 내가 달았다.
- 이번 기회로 또 배워간다…