반응형
https://www.acmicpc.net/problem/11328
11328번: Strfry
C 언어 프로그래밍에서 문자열(string)은 native한 자료형이 아니다. 사실, 문자열은 그저, 문자열의 끝을 표시하기 위한 말단의 NULL이 사용된, 문자들로 이루어진 문자열일 뿐이다. 하지만 프로그래
www.acmicpc.net
풀이
소문자 알파벳의 개수는 26개임을 이용하여 크기가 26인 배열을 만들고
첫 번째 문자열을 구성하는 문자들의 횟수를 배열에 저장할 수 있도록하고, 마찬가지로 두 번째 문자열을 구성하는 문자들의 횟수를 배열에 저장할 수 있도록 하여
비교하는 방식을 사용하였습니다.
풀면서도 더 효율적인 방법이 있을 것 같다는 생각을 하였는데 역시 존재했습니다.
내 코드
#include <bits/stdc++.h>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, l;
string a, b;
cin >> N;
for (int i = 0; i < N; i++) {
int al[26] = {}, al2[26] = {};
cin >> a >> b;
for (int j = 0; j < a.size(); j++)
al[a[j] - 'a']++;
for (int k = 0; k < b.size(); k++)
al2[b[k] - 'a']++;
for (l = 0; l < 26; l++)
if (al[l] != al2[l])
{
cout << "Impossible" << '\n';
break;
}
if (l == 26)
cout << "Possible" << '\n';
}}
모범 답안
배열 하나를 덜 사용할 수 있습니다.
배열을 이용하여 같은 것을 찾는 경우 '뺀다'라는 선택지가 있음을 깨달음
#include <bits/stdc++.h>
using namespace std;
// Authored by : OceanShape
// Co-authored by : BaaaaaaaaaaarkingDog
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N, l;
string a, b;
cin >> N;
for (int i = 0; i < N; i++) {
int al[26] = {};
cin >> a >> b;
for (auto c : a) al[c - 'a']++;
for (auto c : b) al[c - 'b']--;
bool isPossible = true;
for (int i : al) {
if (i != 0) isPossible = false;
}
if (isPossible) cout << "Possible\n";
else cout << "Impossible\n";
}
}
반응형