티스토리 뷰

JAVA

데일리 코딩 16번 문제 해결

YJ_BackEnd 2022. 12. 8. 19:25

문제:

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

 

입출력 예시:

boolean output = isIsogram("aba");
System.out.println(output); // false

 

처음 작성한 코드

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;

 

주의사항에 대소문자는 구별하지 않는다. 라고 쓰여 있었는데 전에도 비슷한 문제를 풀 때 이런 경우에 입력 받은 문자열을 소문자나 대문자로 변환 해주고 풀었던 기억이 나서 일단 소문자로 변환..

 

문자열의 각 문자를 입력 받을 배열을 선언하고

이중 반복문으로 문자열을 반복하는데

첫 번째 반복문에서 입력 받은 문자와 두 번째 반복문에서 나머지 문자들을 비교해서 같은 것이 나오면 false 출력하고 

true면 계속 반복

 

하는 식으로 생각하고 해봤는데 결과에서 true 값이 나오는 경우는 전부 통과 했는데 false 값이 나와야 하는 경우는 모두 통과하지 못함... 

 

문제 해결 1

1. 그렇다면 일단 false 값으로 나와야 하는 경우가 모두 true로 잘못 나왔다는 얘기라서 어디가 잘못됐나 고민 하던중에

이런식으로 코드가 흘러가면 처음 반복문에서 i=0 일 경우에 앞에서 선언해준 빈 배열 0번째 요소에 입력받은 문자열이 통째로 들어가는 문제가 발생하는걸 알았다.

 

예를 들면 입력받은 문자열이 "abc" 라고 하면 내가 생각한건 첫 번째 반복문에서 i = 0 일 때 배열의 0번째 요소에 'a'가 들어가야 하는데 "abc" 가 여기서 통째로 0번째 요소에 들어가버린다.

 

**그래서 해결 방법으로 str.charAt()으로 쪼개기로 했다.

그리고 빈 배열을 만들기전에 앞서서 이미 소문자로 변환해줬기 때문에 반복문 안에서 소문자로 변환해주는 과정을 한 번 더 쓴건 삭제하기로 했다.

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

       str = str.toLowerCase();

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

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

이렇게 하고 테스트 돌렸는데 반복문 안에서 char 타입으로 형변환이 불가능하다? 대충 이런식의 에러가 떴다.

 

문제해결 2

너무 당연한 문제였다.. 배열을 String 타입으로 선언했는데 그 배열안에 char 타입을 넣으려 했으니 에러가 발생 했다.

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

       str = str.toLowerCase();

        Character[] arr = new Character[str.length()];

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

배열을 Character 타입으로 바꿔주고 기존의 배열명이 new_str 이었는데 타입을 바꿔주고 나니까 서로 안어울리는 것 같아서 배열명도 그냥 arr로 바꿔줌 ㅎ..

 

이렇게 하니까 문제 해결!

 

에러 사항

인텔리제이에서 한 번 돌려봤을때 toLowerCase 에서 빨간색 글씨가 뜨면서 오류가 뜨길래 뭐지 하고 봤더니 import 하라 그래서 했더니 String.valueOf가 입력되었는데 보면서도 이게 필요한가..? 싶었다. 

 

그러다가 코드를 수정하면서 반복문 안의 String.valueOf(toLowerCase) 구문을 삭제했더니 다시 오류가 떠서 빨간 느낌표를 눌렀더니 optimize imports를 제시 해줘서 눌렀더니 깰꼼히 해결되긴 했는데.. 그래서 뭐가 잘못됐었는지 궁금해서 optimize imports를 검색해봤다.

 

Optimize imports on the fly 옵션은 코드가 변경됨에 따라 자동으로 패키지 import문을 삽입/삭제해주는 옵션이다. 필요한 패키지는 자동으로 삽입하고 불필요한 패키지는 자동으로 삭제한다. 편리한 기능이므로 특별한 이유가 있는게 아니라면 체크하여 켜두는게 좋다.

 

요약:

이전에 필요에 의해 import 했던 코드를 변경하거나 삭제했을때 앞서 import했던게 불필요해지면 optimize imports를 사용했을때 import를 자동으로 삭제해주는 기능 같다.

 

'JAVA' 카테고리의 다른 글

(JAVA) -length / length() /size() 의 차이  (3) 2022.11.25
최근에 올라온 글
최근에 달린 댓글
TAG
more
Total
Today
Yesterday