[백준(BOJ)] 비슷한 단어(2607번)_C++

2024. 4. 30. 21:12Problem Solving/Greedy & 구현

728x90
반응형
SMALL

오랜만에 화가 살짝(?) 나려고 하는 문제였다.

자꾸 맞왜틀?

 

이 문제를 풀 때는 두 문자열의 다른 문자의 개수가 아닌

두 문자열의 같은 문자의 개수에 집중해야 한다.

 

만일 다른 문자의 개수에 집중한다면 같은 문자는 몇개가 다른지

특정 문자는 어느 문자열에서 더 많이 나타나는지 등을 고려해야 한다.

 

같은 문자의 개수에 집중한다면 간단하게 풀 수 있다.

우선 두 문자열의 길이를 기준으로 바라보자.

두 문자열의 길이가 같다면 비슷할 수 있고, 길이 차이가 1이어도 비슷할 수 있다.

다만 길이 차이가 2이상이라면 어떤 수를 써도 비슷해질 수 없다.

 

길이가 같을 경우 같은 문자의 개수가 첫번째 문자열의 개수와 같거나 그보다 하나 작으면 비슷해질 수 있다.

 

길이가 1차이나는 경우는 첫번째 문자열의 길이가 더 긴지 짧은지에 따라 다르다.

첫번째 문자열의 길이가 더 길 경우 같은 문자의 개수가 첫번째 문자열의 길이보다 1작으면 된다.

두번째 문자열의 길이가 더 짧을 경우 같은 문자열의 개수가 첫번째 문자열의 길이와 같으면 된다.

 

너무 어렵게 풀려고 하지말고 편한 방법이 있다면 그것을 따라보도록 하자.

 


정답 코드

#include <iostream>

using namespace std;

int n, c[100][26], answer;
string s[100];

int main(){
    cin.tie(NULL);
    cout.tie(NULL);
    ios_base::sync_with_stdio(false);

    cin >> n;
    for (int i = 0; i < n; i++){
        cin >> s[i];

        for (int j = 0; j < s[i].length(); j++)
            c[i][s[i][j] - 'A']++;

        if (i == 0)
            continue;

        int same = 0;
        for (int j = 0; j < 26; j++)
            same += c[0][j] > c[i][j] ? c[i][j] : c[0][j];

        int temp = answer;
        if (s[0].length() == s[i].length()){
            if (same == s[0].length() || same == s[0].length() - 1)
                answer++;
        }
        else if (s[0].length() - 1 == s[i].length()){
            if (same == s[0].length() - 1)
                answer++;
        }
        else if (s[0].length() + 1 == s[i].length()){
            if (same == s[0].length())
                answer++;
        }
    }

    cout << answer;
}
728x90
반응형
LIST