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];
}
  • 몇일 손을 안댔더니… 이런 문제를 못 풀고 있었다.
  • 문제 해석은 주석으로 내가 달았다.
  • 이번 기회로 또 배워간다…