문제
두 단어가 주어질 때, 애너그램(같은 문자로 구성)인지 판별하라.
입력
첫째 줄에 테스트 케이스 수 T, 이후 T줄에 두 단어가 공백으로 구분되어 주어진다.
출력
각 케이스마다 "X & Y are anagrams." 또는 "X & Y are NOT anagrams."를 출력한다.
예제
| 입력 | 출력 |
|---|---|
3 blather lathber clap slap race care | blather & lathber are anagrams. clap & slap are NOT anagrams. race & care are anagrams. |
풀이
두 문자열을 각각 문자 단위로 정렬한 뒤 비교하여 애너그램 여부를 판별한다.
- 각 문자열을
split("")으로 문자 배열로 분리한다 - 두 배열을 각각 사전순 정렬한다
- 정렬 결과가 같으면 애너그램, 다르면 아니다
핵심 아이디어: 애너그램은 같은 문자 구성이므로, 정렬하면 동일한 배열이 된다.
코드
package day749;
import java.io.*;
import java.util.*;
public class Day709BOJ6996애너그램 {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int inNum = Integer.parseInt(bf.readLine());
StringTokenizer st;
StringBuilder sb = new StringBuilder();
if (inNum < 100) {
for (int i = 1; i <= inNum; i++) {
st = new StringTokenizer(bf.readLine(), " ");
String a1 = st.nextToken();
String a2 = st.nextToken();
String[] a1Arr = a1.split("");
Arrays.sort(a1Arr);
String[] a2Arr = a2.split("");
Arrays.sort(a2Arr);
sb.append(a1 + " & " + a2);
sb.append(
(Arrays.toString(a1Arr).equals(Arrays.toString(a2Arr)))
? " are anagrams.\n"
: " are NOT anagrams.\n");
}
bw.write(String.valueOf(sb));
}
bw.flush();
bf.close();
bw.close();
}
}복잡도
- 시간: O(T * L log L) - L은 문자열 길이
- 공간: O(L)