[JAVA] 아이소그램(isogram) 알고리즘

2D3·2022년 8월 11일
0

매일 코딩

목록 보기
13/14

문제

문자열을 입력받아 아이소그램인지 여부를 리턴해야 합니다.
아이소그램(isogram)은 각 알파벳을 한번씩만 이용해서 만든 단어나 문구를 말합니다.


원래 하려고 했던 방법 1

str = str.toLowerCase();

String[] new_str = new String[str.length()];

for (int i = 0; i < str.length(); i++) {
    new_str [i] = str.toLowerCase();
    for (int j = i + 1; j < str.length(); j++) {
        if (new_str [i] == new_str[j]) {
            return false;
        }
    }
} return true;

문제점

charAt를 사용해 변환해주는 대신 new_str이라는 새로운 배열을 선언했다
str배열 자체를 가지고 비교하려고 했는데 정상적으로 돌아가는 것도 있었지만,
일부 단어들이 T/F가 제대로 나오지 않았다.


수정한 방법 1

str을 char형태로 받고, 이중 for문을 사용해 str의 i번째와 j번째가 같으면 false를 반환

수도코드

for (i는 0부터 str의 길이보다 작게)
    str을 소문자로 바꿈

    for (j는 i+1부터 str의 길이보다 작게)
    -> i와 j를 비교해줘야 되기 때문에 j는 i보다 1크게 시작한다
         if(str.charAt i와 j가 같다면)
             false를 반환

방법1 구현

public class Main {
    public static void main(String[] args) {
        System.out.print(isIsogram("isogram"));
    }
    public static boolean isIsogram(String str) {
    if (str.length() == 0) return true;

        str = str.toLowerCase();
        char[] arr = str.toCharArray();

        for (char ch : arr) {
            if (str.indexOf(ch) != str.lastIndexOf(ch)) {
                return false;
            }
        }
        return true;
    }
}

방법 2

향상된 for문을 사용해 str을 비교

수도코드

1. str을 소문자로 바꿔줌
2. char배열 arr에 str을 char형태로 변환한 걸 넣어줌
3. 향상된 for (ch에 arr 배열의 길이만큼 반복)
              if (str의 indexOf(ch)lastIndexOf(ch)와 다르다면)
                    false를 반환

방법2 구현

public class Main {
    public static void main(String[] args) {
        System.out.print(isIsogram("isogram"));
    }
    public static boolean isIsogram(String str) {

        if (str.length() == 0) return true;

        str = str.toLowerCase();
        char[] arr = str.toCharArray();

        for (char ch : arr) {
            if (str.indexOf(ch) != str.lastIndexOf(ch)) {
                return false;
            }
        }
        return true;
    }
}

사용한 메서드

>향상된 forfor (타입 변수이름 : 배열변수)
    배열의 길이만큼 반복하고자 하는 명령문;

>toCharArray(): 문자열을 char형 배열로 바꿔줌

>indexOf(): 앞에서부터 검색할 값을 찾음
lastIndexOf(): 끝에서부터 검색할 값을 찾음
profile
return Success;

0개의 댓글