문제 링크
https://www.acmicpc.net/problem/2607
◆문제 해결 및 설명◆
문제 : 같은 문자로 같은 개수로 이루어져 있다면 "같은 구성을 갖는다" 라고 하고 이 상태거나, 이 상태에서 하나 더 문자가 있거나, 하나만 다르거나, 하나가 적을 때의 개수를 첫번째 문자열과 비교하여 몇개의 문자열이 그러한지 답하라.
처음에는 이중 반복문을 통해서 문자열의 문자 하나하나를 비교해서 같다면 sameCount 변수에 +1을 해주었다.
이후 아래의 상황에 맞게 answer++를 해주었다.
- 첫번째 문자열의 size()와 sameCount가 같고, 비교 문자열의 size() 와 sameCount가 같다면 (같은 구성)
- 첫번째 문자열의 size() 와 sameCount가 같고, 비교 문자열의 size() 와 sameCount + 1 이 같다면 (하나 길면)
- 첫번째 문자열의 size() 와 sameCount + 1 이 같고, 비교 문자열의 size() 와 sameCount가 같다면 (하나 적으면)
- 첫번째 문자열의 size() 와 sameCount + 1 이 같고, 비교 문자열의 size() 와 sameCount + 1 이 같다면 (하나 다르면)
바로 실패... 생각해보니 단순한 이중 반복문으로는 문자열을 비교할때 어떤 문자열이 비교 되었는지 기록하지 못하는 점을 발견 하였다.
- ex) GOG, GA : first string size = 3 , second string size = 2 , sameCount = 2 //3번에 해당
따라서 비교 중 하나의 문자가 같다고 판단될때 문자의 위치에 해당하는 배열의 값을 1로 만들어주는 배열을 선언하였다.
// 첫 번째 문자열이 어느 부분이 같은지 저장하는 배열
vector<int> sameCountArray(array[0].size(), 0);
// 도 번째 문자열이 어느 부분이 같은지 저장하는 배열
vector<int> sameCheckArray(array[i].size(), 0);
int sameCount = 0;
for (int k = 0; k < array[0].size(); k++)
{
for (int x = 0; x < array[i].size(); x++)
{
if (sameCheckArray[x] || sameCountArray[k])
{
continue;
}
if (array[0][k] == array[i][x])
{
sameCountArray[k] = 1;
sameCheckArray[x] = 1;
}
}
}
◆코드 전문◆
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
int N, answer = 0;
cin >> N;
cin.get();
vector<string> array(N);
for (int i = 0; i < N; i++)
{
getline(cin, array[i]);
}
bool b_Same = true;
for (int i = 1; i < N; i++)
{
// 첫 번째 문자열이 어느 부분이 같은지 저장하는 배열
vector<int> sameCountArray(array[0].size(), 0);
// 도 번째 문자열이 어느 부분이 같은지 저장하는 배열
vector<int> sameCheckArray(array[i].size(), 0);
int sameCount = 0;
for (int k = 0; k < array[0].size(); k++)
{
for (int x = 0; x < array[i].size(); x++)
{
if (sameCheckArray[x] || sameCountArray[k])
{
continue;
}
if (array[0][k] == array[i][x])
{
sameCountArray[k] = 1;
sameCheckArray[x] = 1;
}
}
}
for (int k = 0; k < sameCountArray.size(); k++)
{
sameCount += sameCountArray[k];
}
// 같은 구성
if (array[0].size() == sameCount && array[i].size() == sameCount)
{
answer++;
}
// 하나 많을 때
else if (array[0].size() == sameCount && array[i].size() == sameCount + 1)
{
answer++;
}
// 하나 적을 때
else if (array[0].size() == sameCount + 1 && array[i].size() == sameCount)
{
answer++;
}
// 하나 다를 때
else if (array[0].size() == sameCount + 1 && array[i].size() == sameCount + 1)
{
answer++;
}
}
cout << answer;
}
'코딩 공부 > 백준(C++)' 카테고리의 다른 글
[백준 10942][C++] 팰린드롬? (0) | 2023.08.11 |
---|---|
[백준 1911][C++] 흙길 보수하기 (0) | 2023.08.11 |
[백준 15686][C++] 치킨 배달 (0) | 2023.08.09 |
[백준 9658][C++] 돌 게임 4 (0) | 2023.08.09 |
[백준 16974][C++] 레벨 햄버거 (0) | 2023.08.07 |