반응형
리뷰
https://www.acmicpc.net/problem/2179
트라이로 문제를 접근했는데 모든 예제가 다 맞아도 계속 AC를 받지 못하였다.
브루트포스 알고리즘을 사용하면 최대 2만 * 2만 / 2의 연산이 진행되고 시간 제한이 2초이므로 시도해 보았는데 해당 방법으로 AC를 받았다.
풀고도 찝찝한 문제...
전역 변수
- n : 문자열의 개수를 저장할 정수형 변수
- max_len : 탐색 중 접두사의 최대 길이를 저장할 정수형 변수
- a1, a2 : 최대 길이의 접두사를 가진 문자열의 인덱스를 저장할 정수형 변수
- str : 문자열 정보를 저장하기 위한 문자열 타입의 배열, 최대 크기는 2만이다.
함수
없음
문제풀이
- n값을 입력 받고, n개의 문자열을 str배열에 입력 받아준다.
- 0 ~ n - 2, i + 1 ~ n - 1까지의 2중 for문을 개행해 준다.
- str[i]와 str[j]의 사이즈를 비교하여 작은 값을 정수형 변수 len에 초기화 해준다.
- len이 max_len보다 작을 경우 탐색할 필요가 없으니 continue 처리해준다.
- 현재 문자열간의 접두사의 개수를 세어줄 정수형 변수 cnt를 0으로 초기화 해준다.
- len길이의 반복문을 개행하고, 두 문자의 k번째 인덱스가 다를 경우 break 아닐 경우 cnt를 증가시킨다.
- max_len이 cnt보다 작을 경우 cnt로 바꾸어 주고 a1, a2에 각각 i, j를 저장해 준다.
- 탐색이 완료된 후에 str배열의 a1, a2인덱스를 줄바꿈을 기준으로 출력해 주면 된다.
참고 사항
- 브루트포스를 통해 완전 탐색을 돌렸으므로 별도의 정렬은 필요하지 않다.
- 최악의 케이스엔 적용되지 않겠지만 len이 max_len보다 작을 경우 탐색하지 않는 가지치기를 넣어주었다.
정답 코드
#include<iostream>
using namespace std;
int n, max_len, a1, a2;
string str[20000];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
for (int i = 0; i < n; i++) cin >> str[i];
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
int len = min(str[i].size(), str[j].size());
if (len < max_len) continue;
int cnt = 0;
for (int k = 0; k < len; k++) {
if (str[i][k] != str[j][k]) break;
cnt++;
}
if (max_len < cnt) {
max_len = cnt;
a1 = i;
a2 = j;
}
}
}
cout << str[a1] << "\n" << str[a2];
}
728x90
반응형
'알고리즘 공부 > C++' 카테고리의 다른 글
[G4] 백준 9935번 문자열 폭발 C++ 문자열, 스택 (0) | 2024.10.31 |
---|---|
[G4] 백준 13144번 List of Unique Numbers C++ 투 포인터 (0) | 2024.10.31 |
[G3] 백준 22866번 탑 보기 C++ 스택 (0) | 2024.10.31 |
[G3] 백준 14658번 하늘에서 별똥별이 빗발친다 C++ set, 브루트포스 알고리즘 (0) | 2024.10.31 |
[G3] 백준 24337번 가희와 탑 C++ 구현, 그리디 알고리즘, 해 구성하기 (0) | 2024.10.31 |