[백준(BOJ)] 비슷한 단어(2607번)_C++
2024. 4. 30. 21:12ㆍProblem 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
'Problem Solving > Greedy & 구현' 카테고리의 다른 글
| [백준(BOJ)] 타노스(20310번)_C++ (0) | 2024.05.02 |
|---|---|
| [백준(BOJ)] KCPC(3758번)_C++ (0) | 2024.05.01 |
| [백준(BOJ)] 햄버거 분배(19941번)_C++ (0) | 2024.04.25 |
| [백준(BOJ)] 어두운 굴다리(17266번)_C++ (0) | 2024.03.23 |
| [백준(BOJ)] 크로스 컨트리(9017번)_C++ (0) | 2024.03.20 |