16번 문제
내가 풀이한 답
두 문자열에 해당하는 알파벳의 개수만 확인하면 되므로 하나의 배열에서 첫 번째 문자열은 +로 두 번째 문자열은 -로 0이 되지 않은 인덱스가 있으면 NO, 없으면 YES로 해결하려고 했었는데 순서가 문제였다. 그래서 방법을 바꾸어 생각해 정렬을 생각해보았다. 하지만, 정렬이 어떤식으로 나오는지 몰랐기 때문에 출력을 해봤더니 대문자가 먼저 나왔다. 예) AACabee
이 점을 이용해서 순서대로 비교를해서 하나라도 다르면 NO, 모두 일치하면 YES를 출력하였다.
#include <stdio.h>
#include <algorithm>
#include <cstring>
using namespace std;
char a[100];
char b[100];
int main(int argc, char** argv) {
//freopen("input.txt", "rt", stdin);
int i;
bool flag = true;
scanf("%s", &a);
scanf("%s", &b);
sort(a, a + strlen(a));
sort(b, b + strlen(b));
for(i=0; i<strlen(a); i++){
if(a[i] != b[i]) {
flag = false;
break;
}
}
if(flag) printf("%s\n", "YES");
else printf("%s\n", "NO");
return 0;
}
결과는 잘 통과하였다.
사이트의 답안
#include<stdio.h>
#include<algorithm>
int a[60], b[60];
int main(){
freopen("input.txt", "rt", stdin);
int n, i;
char str[100];
scanf("%s", &str);
for(i=0; str[i]!='\0'; i++){
if(str[i]>=65 && str[i]<=90)
a[str[i]-64]++;
else a[str[i]-70]++;
}
scanf("%s", &str);
for(i=0; str[i]!='\0'; i++){
if(str[i]>=65 && str[i]<=90)
b[str[i]-64]++;
else b[str[i]-70]++;
}
for(i=1; i<=52; i++){
if(a[i]!=b[i]){
printf("NO\n");
exit(0);
}
}
printf("YES\n");
return 0;
}
여기서는 아스키 코드를 적극적으로 활용하였다. A~Z 까지는 65번~90번이고 a~z 까지는 97번~121번인 것을 말이다. (이제와서 생각해보니 맨 위 코드에서 정렬을 할 때 왜 대문자부터 나왔는지 이제 이해가 간다.) 그래서 대문자는 64를 빼고 소문자는 70을 빼서 1부터 52까지의 인덱스를 활용한 것이다.
'알고리즘 & 자료구조 > 기초 다잡기' 카테고리의 다른 글
18. 층간소음 (0) | 2020.09.07 |
---|---|
17. 선생님 퀴즈 (0) | 2020.09.06 |
15. 소수의 개수 (0) | 2020.09.06 |
14. 가장 많이 사용된 자릿수 (0) | 2020.09.06 |
13. 가장 많이 사용된 자릿수 (0) | 2020.09.03 |