문제 풀이
미 문제는 주어진 두 단어가 애너그램인지 아닌지를 확인하는 문제였다.
애너그램이란?
두 단어에 포함된 알파벳들이 동일하고, 순서만 다르면 성립하는 개념이었다.
1. 알파벳 빈도 계산: 두 단어가 애너그램인지 확인하기 위해서는 각 단어의 알파벳 빈도를 비교해야 했다.
2. 문자열 정렬 후 비교: 두 단어를 정렬한 후, 같은지 비교하면 더 직관적으로 풀 수 있었다.
3. 시간 복잡도 고려: 최대 길이가 100인 문자열 2개를 정렬하는 데 걸리는 시간은 O(n log n) 이므로 충분히 효율적이었다.
import java.util.Arrays;
import java.util.Scanner;
public class AnagramChecker {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 테스트 케이스 개수
int testCaseCount = sc.nextInt();
sc.nextLine(); // 개행 문자 처리
// 테스트 케이스 처리
for (int t = 0; t < testCaseCount; t++) {
String input = sc.nextLine();
String[] words = input.split(" ");
String A = words[0];
String B = words[1];
// 애너그램 검사
if (isAnagram(A, B)) {
System.out.println("YES");
} else {
System.out.println("NO");
}
}
}
// 두 단어가 애너그램인지 확인하는 함수
private static boolean isAnagram(String A, String B) {
// 길이가 다르면 애너그램일 수 없으므로 바로 false 반환
if (A.length() != B.length()) {
return false;
}
// 두 단어를 문자 배열로 만들어 정렬
char[] arrA = A.toCharArray();
char[] arrB = B.toCharArray();
Arrays.sort(arrA);
Arrays.sort(arrB);
// 정렬된 배열이 같으면 애너그램
return Arrays.equals(arrA, arrB);
}
}
풀이 방식
- 입력 받기: 테스트 케이스 개수를 먼저 입력받고, 그 다음에 각 테스트 케이스에서 두 단어를 입력받았다.
- 애너그램 여부 체크: 두 단어를 정렬한 후, 동일한지 확인했다. 정렬 후 같다면 애너그램이니까 "YES", 다르면 "NO"를 출력했다.
이 문제를 풀면서 알게 된 점은, 애너그램을 확인하는 데 가장 간단하고 효율적인 방법은 정렬을 활용하는 방법이었다.
다만 정렬 후 비교하는 방식이기 때문에 O(n log n) 의 시간이 걸리긴 했지만, 문제에서 주어진 범위에서는 충분히 효율적이었다.
댓글
댓글 작성은 로그인 후에 가능합니다.