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
'코딩 문제' 카테고리의 다른 글
[코딩 문제] 문자열 반전 (0) | 2024.08.30 |
---|---|
[코딩 문제] Palindrom (0) | 2024.08.23 |
[코딩 문제] 연도 일자를 월/일로 계산하기 (0) | 2024.08.23 |
[코딩 문제] 미로 탐색 (0) | 2024.08.23 |
[코딩 문제] TicTacToe 게임 (0) | 2024.08.23 |