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 |