입력받은 두개의 문자열을 크기가 26인 각각의 배열에 넣은 뒤에 일치하는지 여부 확인하며 문제를 해결하면 된다.
#include <bits/stdc++.h>
int arr1[26], arr2[26];
int main() {
int n;
char str1[1000], str2[1000];
scanf("%d", &n);
for(int i=0;i<n;i++)
{
bool res = true;
std::fill(arr1, arr1 + 26, 0);
std::fill(arr2, arr2 + 26, 0);
scanf("%s %s", &str1, &str2);
if (strlen(str1) != strlen(str2))
printf("Impossible\n");
else
{
for (int i = 0; i < strlen(str1) ; i++)
{
arr1[str1[i] - 97]++;
arr2[str2[i] - 97]++;
}
for (int i = 0; i < 26; i++) {
if (arr1[i] != arr2[i])
{
res = false;
break;
}
}
if (res)
printf("Possible\n");
else
printf("Impossible\n");
}
}
}
문제를 해결하는데 대략 한시간 정도 소모된거 같다.
시간이 많이 걸린 이유를 나름대로 생각해보니 몇가지가 있는거 같다.
일단 큰 틀은 잡고 문제를 풀어서 vs2019에서는 정답이 나왔으나 채점을 해보면 계속 틀렸다.
이는 다른 케이스는 해결못하였기 때문이다. 예를 들어 두 문자열의 크기가 다른 경우도 생각했어야 했다.
그리고 반복문을 돌면서 배열을 계속 초기화해줘야 한다는것은 생각하지 못하였다.
fill 함수라는것을 처음 알게 되었다.
또한 기존에는 조건문이 실행될때 보통 변수 cnt에 ++를 통해 값을 증가시키면서 정답을 유추하고는 했다.
이러한 방식이 틀린것은 아니지만 bool 형식을 통해서도 문제를 해결할 수 있다는 것을 알게되었다.
앞으로 아무리 쉬운 문제라도 의심하면서 여러가지 케이스를 생각해보고 문제를 푸는 습관을 들여야겠다.