코딩테스트

Codewars - Isograms

블루티카 2022. 2. 13. 09:30

문제

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.

Isogram은 연속적이든 비연속적이든 반복되는 문자가 없는 단어이다. 문자만 포함하는 문자열이 isogram인지 판단하는 함수를 구현한다. 빈문자열이 isogram이라고 가정하고, 대소문자를 무시한다.

예시

"Dermatoglyphics" --> true
"aba" --> false
"moOse" --> false (ignore letter case)

풀이

if(str.equals("")) {
  return true;
}

String [] splitStr = str.toLowerCase().split("");

for(int arrIndex = 0; arrIndex < splitStr.length -1; arrIndex++) {
  int count = 0;
  for(int arrIndex2 = arrIndex +1; arrIndex2 < splitStr.length; arrIndex2++) {
    if(splitStr[arrIndex].equals(splitStr[arrIndex2])) {
      count++;
      if(count == 1) {
        return false;
      }
    }
  }
}
return true;
  1. 먼저 빈문자열이면 true를 반환 => 아래에 수행하는 split 메서드의 excption 방지.
  2. 문자열을 소문자로 변환 후 한개씩 나누어 배열에 담고, 이중 for문을 사용하여 중복을 검사한다. => 대문자, 소문자 통일
  3. 기준이 되는 문자열과 배열속 문자열 중 같은 값이 있으면 count값을 증가한다.
  4. count값이 1이 되면 중복되는 문자가 있다는 뜻이기 때문에 false를 반환하고 for문이 종료되면 중복되지 않기 때문에 true를 반환한다.

 

Clever Code

return str.length() == str.toLowerCase().chars().distinct().count();
  1. 문자열을 소문자로 변환
  2. 문자를 char형으로 변환 (ex. a -> 97)
  3. 중복값 제거
  4. 문자열 count
  5. 기존에 주어진 문자열의 길이와 1 ~ 3의 전처리를 한 후 문자열의 개수가 같으면 true, 틀리면 false를 반환한다.

위 코드는 자바8 이상 버전에 있는 Stream 기능을 사용해서 문제를 해결하였다.