Isograms, CodeWars Kata

언어를 잘 안다는 이야기는 해당 언어의 문법만 안다는 이야기가 아니라 효율적으로 코드 작성이 가능한 API들도 많이 알고 적재적소에 활용할 수 있음을 의미합니다. 새로운 언어를 습득한다는 것은 문법과 API들에 익숙해진다는 걸 의미하지요. Java8 이후의 Java는 람다 함수와 함께 대표적으로 Stream과 같이 코드 길이를 줄일 수 있는 API들을 대거 함유하고 있어서 새롭게 언어를 배우는 것처럼 API들을 익혀야 하네요.

 

Isograms

사진: CodeWars

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();
}

 

 

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