자료구조&알고리즘/코딩 문제

[코딩 문제] Anagram

Joo.v7 2024. 8. 23. 15:42

Anagram

단어나 문장을 구성하고 있는 문자의 순서를 바꾸어 다른 단어나 문장을 만드는 것.

 

문제

 입력받은 두 문장이 Anagram인지 알려주는 코드를 작성하시오.

/* 
1. 문자열을 char[]로 변경한다 -> toCharArray(String value)
2. char[]에서 공백을 제거한다 -> removeWhiteSpace(char[])
3. char[]의 모든 문자를 소(대)문자로 바꾼다 -> toLowerCase(char[])
4. 내림차순(오름차순)으로 정렬한다 -> sort(char[])
5. 비교 후 같으면 true 아니면 false -> isAnagram(char[], char[])
*/

import java.util.Arrays;

public class Anagram {
    public static char[] toCharArray(String value) {
        char[] result = new char[value.length()];
        for (int i=0; i<result.length; i++) {
            result[i] = value.charAt(i);
        }
        return result;
    }

    public static char[] removeWhiteSpace(char[] array) {
        int count = 0;
        for(char c:array) {
            if(c != ' ') { 
                count++;
            }
        }

        char[] result = new char[count];
        int index = 0;
        for(char c:array) {
            if(c != ' ') {
                result[index++] = c;
            }
        }
        return result;
    }

    public static char[] toLowerCase(char[] array) {
        char[] result = new char[array.length];
        int index = 0;
        for(char c:array) {
            if(((int)c) < 97) {
                result[index++] = (char)(c+32);
            }
            else {
                result[index++] = c;
            }
        }
        return result;
    }

    public static void sort(char[] array) {
        for (int i=0; i<array.length; i++) {
            for(int j=0; j<array.length-1-i; j++) {
                if(array[j] > array[j+1]) {
                    char temp = array[j];
                    array[j] = array[j+1];
                    array[j+1] = temp;
                }
            }
        }
    }

    public static boolean isEqual(char[] array1, char[] array2) {
        if(array1.length != array2.length) {
            return false;
        }

        for (int i=0; i<array1.length; i++) {
            if (array1[i] != array2[i]) { // return 만나면 해당 메소드에서 탈출하게됨
                return false;
            }
        }
        return true;
    }

    public static boolean isAnagram(String value1, String value2) {
        char[] array1 = toLowerCase(removeWhiteSpace(toCharArray(value1)));
        char[] array2 = toLowerCase(removeWhiteSpace(toCharArray(value2)));

        sort(array1);
        sort(array2);

        return isEqual(array1, array2) ? true:false;
    }

    public static void main(String[] args) {
        String s = "I am Lord Voldemort";
        String s2 = "Tom Marvolo Riddle";

        char[] c = toCharArray(s);
        System.out.println(Arrays.toString(c)); // toCharArray 확인
        char[] c2 = removeWhiteSpace(c);
        System.out.println(Arrays.toString(c2)); // removeWhiteSpace 확인
        char[] c3 = toLowerCase(c2);
        System.out.println(Arrays.toString(c3)); // toLowerCase 확인
        sort(c3);
        System.out.println(Arrays.toString(c3)); // sort 확인

        System.out.println(isAnagram(s,s2));
    }
}

 

실행 결과

[I,  , a, m,  , L, o, r, d,  , V, o, l, d, e, m, o, r, t]
[I, a, m, L, o, r, d, V, o, l, d, e, m, o, r, t]
[i, a, m, l, o, r, d, v, o, l, d, e, m, o, r, t]
[a, d, d, e, i, l, l, m, m, o, o, o, r, r, t, v]
true

 

 

+ 추가) String 클래스의 문자열을 조작할 수 있는 메소드들을 사용한 코드.

import java.util.Arrays;

public class Anagram {
    private static char[] prepareString(String s) {
        char[] result = s.trim().replace(" ", "").toLowerCase().toCharArray();
        Arrays.sort(result);
        return result;
    }
    public static boolean isAnagram(String s1, String s2) {
        return Arrays.equals(prepareString(s1), prepareString(s2)) ? true : false;
    }
}

// 이렇게 prepareString() 이런 메소드 사용자가 알 필요가 없다. 이게 캡슐화다. 
// 캡슐화는 내가 어떤 코드를 변경해도 클라이언트 코드는 한 줄도 뜯지 않아도 되는것.
class Test {
    public static void main(String[] args) {
        String s1 = "I am Lord Voldemort";
        String s2 = "Tom Marvolo Riddle";
        System.out.println(Anagram.isAnagram(s1, s2));
    }
}

 


 

 

2024.08.23 - [코딩 문제] - [코딩 문제] Palindrom

 

[코딩 문제] Palindrom

Palindrom거꾸로 읽어도 제대로 읽는 것과 같은 문장이나 낱말, 숫자, 문자열 등이다. 보통 낱말 사이에 있는 띄어쓰기나 문장 부호는 무시한다. 문제) 입력받은 숫자가 palindrom인지 알려주는 코드

lightningtech.tistory.com