풀이방법
사용된 것:
ArrayList
2022.01.21
두 단어의 글자 수가 같은지 확인한다. 단어 수가 다르면 애너그램이 아닌 것으로 판단한다.
문자들의 아스키코드의 합이 같은지 확인한다. 이 값이 다르면 애너그램이 아닌 것으로 판단한다.
글자 수도 같고 아스키코드의 합도 같다면 다음의 방법으로 애너그램 여부를 판단한다.
- 0) int 타입 변수 check의 초기값은 0이다.
- 1) 첫번째 문자열의 문자들을 ArrayList<Character>list1에 저장한다.
- 2) list1의 첫번째 글자(인덱스 0)가 두번째 문자열에 포함되어 있으면 check의 값을 1 증가시킨다. 그리고 한 단어에 여러 번 등장하는 글자로 인한 오류를 없애기 위해 list1의 첫번째 글자를 remove한다.
- 3) 2번의 과정을 문자열의 길이만큼 반복한 뒤에 check의 값이 문자열의 길이와 동일하다면 애너그램이 맞다.
코드
Java(2022.01.21)
import java.util.ArrayList;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc= new Scanner(System.in);
int cnt = sc.nextInt();
String str1, str2;
int n1, n2; //아스키코드값 비교에 사용
int check; //애너그램 여부 확인에 사용
for(int i = 0; i<cnt; i++) {
str1 = sc.next();
str2 = sc.next();
n1 = 0; n2 = 0;
//글자 수가 다르면 두 문자열이 애너그램일 수 없으므로 NOT 문장 출력 후 다음 케이스로.
if(str1.length() != str2.length()) {
System.out.println(str1 + " & " + str2 + " are NOT anagrams."); continue;
}
//각 문자열에 속한 문자들의 아스키코드의 합 구하기
for(int j = 0; j<str1.length(); j++) {
n1 += (int)str1.charAt(j);
n2 += (int)str2.charAt(j);
}
//아스키코드값의 합이 다르면 두 문자열이 애너그램일 수 없으므로 NOT 문장 출력 후 다음 케이스로.
if(n1 != n2) {
System.out.println(str1 + " & " + str2 + " are NOT anagrams."); continue;
}
//글자수와 아스키코드값의 합이 모두 같은 경우
ArrayList<Character> list1 = new ArrayList<Character>();
for(int j = 0; j<str1.length(); j++) {
list1.add(str1.charAt(j));
}
check = 0;
for(int j = 0; j<str1.length(); j++) {
for(int k = 0; k<str2.length();k++) {
if(list1.get(0) == str2.charAt(k)) {
list1.remove(0); check++; break;
}
}
}
if(check == str1.length()) System.out.println(str1 + " & " + str2 + " are anagrams.");
else System.out.println(str1 + " & " + str2 + " are NOT anagrams.");
}
sc.close();
}
}
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
#1764 : 듣보잡 (0) | 2022.01.21 |
---|---|
#11091 : 알파벳 전부 쓰기 (0) | 2022.01.21 |
#4583 : 거울상 (0) | 2022.01.19 |
#15904 : UCPC는 무엇의 약자일까? (0) | 2022.01.19 |
#1026 : 보물 (0) | 2022.01.14 |