Isograms, CodeWars Kata 자바 솔루션
Isograms, CodeWars Kata
언어를 잘 안다는 이야기는 해당 언어의 문법만 안다는 이야기가 아니라 효율적으로 코드 작성이 가능한 API들도 많이 알고 적재적소에 활용할 수 있음을 의미합니다. 새로운 언어를 습득한다는 것은 문법과 API들에 익숙해진다는 걸 의미하지요. Java8 이후의 Java는 람다 함수와 함께 대표적으로 Stream과 같이 코드 길이를 줄일 수 있는 API들을 대거 함유하고 있어서 새롭게 언어를 배우는 것처럼 API들을 익혀야 하네요.
Isograms
www.codewars.com/kata/54ba84be607a92aa900000f1
Details
An isogram is a word that has no repeating letters, consecutive or non-consecutive. Implement a function that determines whether a string that contains only letters is an isogram. Assume the empty string is an isogram. Ignore letter case.
isIsogram "Dermatoglyphics" == true isIsogram "aba" == false isIsogram "moOse" == false -- ignore letter case
Isogram은 단어 내 반복되는 글자가 없는 것을 의미합니다. 예문에서 aba
는 a가 두 번 들어가기 때문에 Isogram이 아닙니다. 이 문제에서는 대소문자 관계없이 중복되는 글자가 있는지 없는지를 판별합니다.
My Solution
중복되는 단어가 있는지 확인하기 위해서 일단 for로 루프를 돌면서 한글자씩 꺼냅니다. 그다음 전체 단어에서 해당 자리를 지운 다음 여전히 그 글자가 있는지 확인하기 위해서 deleteCharAt(i)와
indexOf()를
활용했습니다. 이전 솔루션들에 비해서 굉장히 코드 길이가 짧아졌죠.
package com.codewars;
import java.util.Arrays;
import java.util.stream.IntStream;
public class isogram {
public static boolean isIsogram(String str) {
// ...
for (int i = 0; i < str.length(); i++)
if (new StringBuilder(str.toLowerCase()).deleteCharAt(i)
.indexOf(String.valueOf(str.toLowerCase().charAt(i))) > -1)
return false;
return true;
}
}
Best Practice
BP는 API하나로 이 문제를 풀어냈습니다. 바로 distinct()
API입니다.
BP솔루션에서는 주어진 문자열을 대소문자 관계없이 처리하기 위해서 toLowerCase()
한 다음 chars()
를 통해서 IntStream으로 변환합니다. char 타입은 문자이지만 근본적으로 숫자이기 때문에 스트림화하면 IntStream이 반환됩니다. 그런 다음 Stream의 distinct()
를 통해서 중복되는 Element를 제거하고 카운팅 했네요.
만약 제가 이 API를 알고 있었다면 훨씬 빠르게 문제를 풀어낼 수 있었겠죠.
public static boolean bp(String str) {
return str.length() == str.toLowerCase().chars().distinct().count();
}