본문 바로가기
Programming/BOJ

[C/C++] 백준 #2607 비슷한 단어(구현)

by 작은별하나 2024. 4. 19.
반응형

이번 문제는 문제의 뜻을 잘 이해할 필요가 있습니다.

 

같은 구성이라는 것은 문자의 종류와 그 개수가 동일한 경우를 말합니다.  GOD와 DOG는 문자의 종류와 그 개수가 동일하기 때문에 같은 구성이 됩니다.  그런데 비슷한 단어는 문자를 하나 추가하거나 뺌으로써 같은 구성이 되는 단어를 뜻합니다.  순서와는 상관없다는 것이죠.  DOG와 GOOD는 비슷한 단어가 됩니다.  

 

similar

 

이것만 잘 이해하시면 문제를 푸는데 있어서 어려움은 없습니다.  난이도는 현재 실버 2등급 문제이지만, 문제만 잘 이해하셨다면 구현 난이도는 더 낮습니다.

 

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

 

2607번: 비슷한 단어

첫째 줄에는 단어의 개수가 주어지고 둘째 줄부터는 한 줄에 하나씩 단어가 주어진다. 모든 단어는 영문 알파벳 대문자로 이루어져 있다. 단어의 개수는 100개 이하이며, 각 단어의 길이는 10 이

www.acmicpc.net

 

저는 check()란 함수를 만들어서 여기서 영문자 26글자에 대한 빈도를 계산하도록 했습니다.  단어의 문자들을 차례대로 보면서 해당 영문자의 개수만 올리면 됩니다.

 

그런후에 기준 단어에서의 문자들별로 추가되어야할 문자가 있는 경우에는 plus를 증가시키고, 빼야할 문자가 있는 경우에는 minus를 증가시켜서 두 변수의 합이 1을 넘지 않도록 했습니다.

 

제가 작성한 소스입니다.

//------------------------------------------
//    baekjoon #2607
//        - by Aubrey Choi
//        - created at 2019-08-27
//------------------------------------------
#include <stdio.h>
#include <memory.h>

void check(char word[], int v[])
{
    memset(v, 0, sizeof(int)*26);
    for(int i = 0; word[i]; i++) v[word[i] - 'A']++;
}

int main()
{
    int n, v[26], f[26], ans=0;
    char word[12];
    scanf("%d%s", &n, word);
    check(word, v);
    while(--n)
    {
        scanf("%s", word);
        check(word, f);
        int plus = 0, minus = 0;
        for(int i = 0; i < 26; i++)
        {
            if(f[i] > v[i]) plus += f[i] - v[i];
            else if(f[i] < v[i]) minus += v[i] - f[i];
        }
        if(plus <= 1 && minus <= 1) ans++;
    }
    printf("%d\n", ans);
}
728x90

댓글