알고리즘/문제 풀이

11328번: Strfry

Themion 2022. 1. 5. 15:05

https://www.acmicpc.net/problem/11328

 

11328번: Strfry

C 언어 프로그래밍에서 문자열(string)은 native한 자료형이 아니다. 사실, 문자열은 그저, 문자열의 끝을 표시하기 위한 말단의 NULL이 사용된, 문자들로 이루어진 문자열일 뿐이다. 하지만 프로그래

www.acmicpc.net

첫 번쨰 문자열을 strfry를 이용해 두 번째 문자열로 만들기 위해선, 두 문자열에 나온 각 문자의 개수가 모두 같아야 한다. 따라서 두 문자열에서 각 문자가 나온 횟수의 차를 구한 뒤, 어떤 문자에서 차가 0이 아닌 경우는 Impossible을, 그렇지 않다면 Possible를 출력한다.

#include <iostream>

using namespace std;

#define LEN 1000

void count(int cnt[], int add) {
    // 문자열을 입력받을 공간
    char str[LEN + 1];
    // 문자열을 입력받은 뒤
    cin >> str;
    // 각 문자가 나온 만큼 str에 add를 더한다
    for (int i = 0; str[i]; i++) cnt[str[i] - 'a'] += add;
}

bool test_case() {
    // cnt[i]: 두 문자열에서 알파벳 i + 'a'가 나온 횟수의 차
    int cnt[26] = { 0, };
    
    // 첫 번째 문자열에 나온 각 문자의 개수를 세어 cnt에 더한 뒤
    count(cnt, 1);
    // 두 번째 문자열에 나온 각 문자의 개수를 세어 cnt에 빼 각 개수의 차를 계산
    count(cnt, -1);

    // 각 문자가 나온 횟수의 차가 0이 아닌 경우 false를 반환
    for (int i = 0; i < 26; i++) if (cnt[i]) return false;

    // 그렇지 않은 경우 두 번째 문자열을 strfry를 이용해 얻을 수 있으므로 true를 반환
    return true;
}

int main() {
    // 입출력 속도 향상
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int N;
    // 테스트 케이스의 수를 입력받고 각 테스트 케이스를 실행
    for (cin >> N, cin.get(); N--; )
        cout << (test_case() ? "Possible" : "Impossible") << '\n';
    return 0;
}

'알고리즘 > 문제 풀이' 카테고리의 다른 글

11399번: ATM  (0) 2022.01.05
11365번: !밀비 급일  (0) 2022.01.05
11286번: 절댓값 힙  (0) 2022.01.05
11279번: 최대 힙  (0) 2022.01.05
11066번: 파일 합치기  (0) 2022.01.04