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