문자열 속 패턴 찾기
배열에 Pattern 존재 여부 판단은
Flag와 함수 쓰는 법 두가지 있다.
함수 사용
#include <iostream>
using namespace std;
char vect[10] = "BTABCQABC", pattern[4];
int isPattern(int index)
{
for(int i=0; i<3; i++)
{
if(vect[index+i] != pattern[i])
return 0;
}
return 1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cin >> pattern;
for(int i=0; i<7; i++)
{
if(isPattern(i))
cout << "발견 :" << i << '\n';
}
return 0;
}
Flag 사용
#include <iostream>
using namespace std;
char vect[10] = "BTABCQABC";
char pattern[4];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
int flag = 0;
cin >> pattern;
for(int i=0; i<7; i++)
{
flag = 0;
for(int j=0; j<3; j++)
{
if(vect[i+j] != pattern[j])
{
flag = 1;
break;
}
}
if(flag == 0)
{
cout << "index : " << i << " 발견" << '\n';
}
}
return 0;
}
2차 배열에서 패턴 찾기도 동일하게 풀 수 있다.
이 경우에도 flag와 함수 둘 다 가능하지만 결국 똑같은 동작을 하기에 함수만 구현해볼 것이다.
#include <iostream>
using namespace std;
int vect[6][3] = {
3, 5, 1,
2, 4, 5,
3, 6, 1,
3, 1, 1,
4, 5, 6,
2, 4, 5
}, pattern[3];
int isPattern(int row)
{
for(int i=0; i<3; i++)
{
if(vect[row][i] != pattern[i])
return 0;
}
return 1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
for(int i=0; i<3; i++)
cin >> pattern[i];
for(int i=0; i<6; i++)
{
if(isPattern(i))
{
cout << "index : " << i << " 발견\n";
}
}
return 0;
}
2차 배열에서 패턴을 찾을 때 패턴보다 2차 배열의 크기가 더 크다면 한칸씩 이동하면서 비교해야한다.
이 때 열이 0~4까지만 존재하기에 0부터 2까지만 검사해주어야 한다. 3부터 3칸을 검사하면 에러가 난다.
#include <iostream>
using namespace std;
int vect[6][5] = {
3, 5, 1, 4, 1,
2, 4, 5, 0, 0,
3, 6, 3, 4, 1,
3, 1, 1, 3, 2,
4, 5, 3, 4, 1,
2, 4, 5, 5, 6
}, pattern[3];
int isPattern(int row, int col)
{
for(int i=0; i<3; i++)
{
if(vect[row][col+i] != pattern[i])
return 0;
}
return 1;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
for(int i=0; i<3; i++)
cin >> pattern[i];
for(int i=0; i<6; i++)
{
for(int j=0; j<3; j++) // 2까지만 돌려야 함
{
if(isPattern(i, j))
{
cout << "index : " << i << " 발견\n";
}
}
}
return 0;
}
DAT
DAT는 값을 index로 활용하는 코딩 방식으로 Direct Addressing Table의 줄임말이다.
배열에 어떤 종류의 알파벳이 있는지 찾는 프로그램 작성
#include <iostream>
using namespace std;
char vect[7] = "ADBFAD";
int direct[32];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
for(int i=0; i<6; i++)
{
direct[vect[i]-'A'] = 1;
}
for(int i=0; i<32; i++)
{
if(direct[i] == 1)
cout << char(i+65) << " find \n";
}
return 0;
}
이제 존재하는 것 뿐만 아니라, 갯수를 센다면 같은 원리로 1을 계속 더하면 된다.
#include <iostream>
using namespace std;
char vect[7] = "ADBFAD";
int direct[32];
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
for(int i=0; i<6; i++)
{
direct[vect[i]-'A']++;
}
for(int i=0; i<32; i++)
{
if(direct[i] >= 1)
cout << char(i+65) << " find : " << direct[i] << '\n';
}
return 0;
}
'C++ > 공부 정리' 카테고리의 다른 글
함수 오버로딩, public & private (0) | 2021.10.04 |
---|---|
클래스, 재귀함수 (0) | 2021.10.01 |
Direct offset 배열, 구조체, 2차원 배열에서 패턴찾기 (0) | 2021.10.01 |
비트배열과 다중 카운트 (0) | 2021.09.16 |
length() 사용하지 않고 문자열 길이 구하여 배열 속 요소 카운트하기 (0) | 2021.09.15 |