Counting Duplicates, CodeWars Kata

Count the number of Duplicates

Write a function that will return the count of distinct case-insensitive alphabetic characters and numeric digits that occur more than once in the input string. The input string can be assumed to contain only alphabets (both uppercase and lowercase) and numeric digits.

Example

"abcde" -> 0 `# no characters repeats more than once`
"aabbcde" -> 2 `# 'a' and 'b'`
"aabBcde" -> 2 `# 'a' occurs twice and 'b' twice (`b` and `B`)`
"indivisibility" -> 1 `# 'i' occurs six times`
"Indivisibilities" -> 2 `# 'i' occurs seven times and 's' occurs twice`
"aA11" -> 2 `# 'a' and '1'`
"ABBA" -> 2 `# 'A' and 'B' each occur twice`

주어진 문자열에서 대소문자 구분 없이 한 글자가 두 번 이상 나오는 글자의 수를 구하는 문제입니다. aA11aA 가 중복이고 11이 중복이기 때문에 답은 2가 됩니다.

 

My Solution

저는 HashMap을 이용해서 문제를 풀었습니다. 우선 주어진 문자열을 대소문자 구분 없이 처리하기 위해 toLowerCase()로 처리했고요. 한 글자씩 잘라 글자를 키로 사용했습니다. 이후 출현하는 빈도를 계산해 빈도가 1을 초과하는 케이스만 카운팅 했습니다.

솔루션 코드

테스트 코드

package com.codewars;

import java.util.HashMap;

public class CountingDuplicates {
    public static int duplicateCount(String text) {
        HashMap<Character, Integer> map = new HashMap<Character, Integer>();
        for (int i = 0; i < text.length(); i++) {
            map.put(text.toLowerCase().charAt(i), map.getOrDefault(text.toLowerCase().charAt(i), 0).intValue() + 1);
        }

        return (int) map.entrySet().stream().filter(p -> p.getValue().intValue() > 1).count();
    }
}

 

Best Practice

BP는 텍스트를 한 글자씩 잘라서 남은 문자열 중에 해당 글자가 또 들어있는지 체크합니다. 그런 후에 남은 문자열에서 비교한 문자열을 모두 삭제하고 다시 한글자씩 잘라 비교하는 식의 반복문을 작성했습니다.

public class CountingDuplicates {
  public static int duplicateCount(String text) {
    int ans = 0;
    text = text.toLowerCase();
    while (text.length() > 0) {
      String firstLetter = text.substring(0,1);
      text = text.substring(1);
      if (text.contains(firstLetter)) ans ++;
      text = text.replace(firstLetter, "");
    }
    return ans;
  }
}

 

728x90
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기