문제
Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아 나그램이라고 합니다. 예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만 그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로 알파벳과 그 개수가 모두 일치합니다. 즉 어느 한 단어를 재 배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다. 길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세 요. 아나그램 판별시 대소문자가 구분됩니다.
💡 입력설명
첫 줄에 첫 번째 단어가 입력되고, 두 번째 줄에 두 번째 단어가 입력됩니다. 단어의 길이는 100을 넘지 않습니다.
💡 출력설명
두 단어가 아나그램이면 “YES"를 출력하고, 아니면 ”NO"를 출력합니다.
💡 입력예제
AbaAeCe
baeeACA
💡 출력예제
YES
코드
최종 풀이
#include <stdio.h>
int b[52];
int main() {
int i, j, sum1 = 0, sum2 = 0, digit, cnt = 0;
char a[100];
for(i = 0; i <= 1; i++) {
scanf("%s", &a);
for(j = 0; a[j] != '\0'; j++) {
if(a[j] >= 65 && a[j] <= 90) {
digit = a[j] - 65;
} else if(a[j] >= 97 && a[j] <= 122) {
digit = a[j] - 71;
}
b[digit]++;
}
}
for(i = 0; i <= 52; i++) {
if(b[i] % 2 != 0) {
cnt++;
break;
}
}
if(cnt > 0) {
printf("NO");
} else {
printf("YES");
}
return 0;
}
설명
사용자로부터 2번의 문자열을 받기위해 2번 반복하는 for문을 작성한다.
이후 각 문자를 순회하는 for문을 작성하고 각 문자가 65~90(대문자)일 경우 해당 아스키코드에서 65를 뺀 값을, 97~122(소문자)일 경우 71을 뺀 값을 index로 갖는 배열에 1씩 증가해나간다.(해싱기법)
입력받은 두 문자열을 가지고 counting이 완료된 이후 해당 값이 2로 나누었을 때 0이 아닌 경우 아나그램에 해당하지 않으므로 cnt + 1 증가하고 for문에서 빠져나온다.
이때 cnt값이 0이면 아나그램이므로 "YES"를 출력하고 0보다 큰 경우 아나그램이 아니므로 "NO"를 출력하도록 한다.
배운 점
1. exit(0): 프로그램 종료
2. 알파벳: 26개
해당 내용은 김태원님의 'it 취업을 위한 알고리즘 문제풀이' 강의를 듣고 작성한 글입니다.