📄문제
Anagram이란 두 문자열이 알파벳의 나열 순서를 다르지만 그 구성이 일치하면 두 단어는 아나그램이라고 합니다.
예를 들면 AbaAeCe 와 baeeACA 는 알파벳을 나열 순서는 다르지만 그 구성을 살펴보면 A(2), a(1), b(1), C(1), e(2)로 알파벳과 그 개수가 모두 일치합니다. 즉 어느 한 단어를 재배열하면 상대편 단어가 될 수 있는 것을 아나그램이라 합니다.
길이가 같은 두 개의 단어가 주어지면 두 단어가 아나그램인지 판별하는 프로그램을 작성하세요.
아나그램 판별시 대소문자가 구분됩니다.
⬇️ 입력
첫 줄에 첫 번째 단어가 입력되고, 두 번째 줄에 두 번째 단어가 입력됩니다.
단어의 길이는 100을 넘지 않습니다.
AbaAeCe baeeACA |
⬆️ 출력
두 단어가 아나그램이면 “YES"를 출력하고, 아니면 ”NO"를 출력합니다.
YES |
📝 풀이
#include <iostream>
void checkStr(char* str, bool isFirstStr);
static int upperChar[26]{ 0, };
static int lowerChar[26]{ 0, };
int main()
{
char str1[101], str2[101];
scanf_s("%s", str1, sizeof(str1));
scanf_s("%s", str2, sizeof(str2));
checkStr(str1, true);
checkStr(str2, false);
for (int i = 0; i < 26; ++i)
if (upperChar[i] != 0 || lowerChar[i] != 0)
{
printf("NO");
return 0;
}
printf("YES");
}
void checkStr(char* str, bool isFirstStr)
{
for (int i = 0; str[i] != '\0'; ++i)
if (str[i] >= 'a')
isFirstStr ? ++upperChar[str[i] - 'a'] : --upperChar[str[i] - 'a'];
else
isFirstStr ? ++upperChar[str[i] - 'a'] : --upperChar[str[i] - 'a'];
}
- 알파뱃에 해당하는 아스키 코드를 이용하여 대문자, 소문자 배열을 만듭니다.
- 첫번째 입력한 문자열은 아스키 코드로 이루어진 배열의 인덱스 번호에 해당하는 값을 1씩 증가시킵니다.
- 반대로, 두번째 입력한 문자열은 값을 1씩 감소시킵니다.
- 마지막으로, 두 배열의 모든 원소값이 0이면 아나그램 조건을 만족하고, 하나라도 0이 아닌경우 아나그램이 아닙니다.
'algorithms (C++)' 카테고리의 다른 글
[C++] 층간소음 (1) | 2023.10.13 |
---|---|
[C++] 선생님 퀴즈 (0) | 2023.10.13 |
[C++] 소수의 개수 (에라토스테네스의 체) (0) | 2023.10.13 |
[C++] 뒤집은 소수 (0) | 2023.10.13 |
[C++] 가장 많이 사용된 자릿수 (1) | 2023.10.13 |