단순 구현으로 풀었는데, 알고보니 해시를 사용해서 푸는 문제였다..!
개인적으로 지난 컨베이어 벨트 위의 로봇 문제 이후로 문제를 이해하는 데 시간이 상당히 오래 걸리는 문제였다...
문제의 설명이 다소 터프한데, 결론적으로 정리하면 모든 단어를 두 쌍씩 비교한 후 가장 비슷한 두 단어를 출력하면 되는 문제이다. 이 때 출력 순서는 처음 입력받은 순서대로 출력해야 하고, 가장 비슷하다고 판단하는 조건이 맨 앞에서부터 연속된 글자가 가장 많은 경우가 되겠다.
입력값을 살펴보면 N은 20,000 이하이고, 단어의 길이도 100을 넘지 않기 때문에 단순 탐색으로도 충분히 구할 수 있을 것 같아서 다른 자료구조는 사용하지 않았다(그냥 모든 단어를 하나하나 비교했다). 아마 N의 개수나 단어의 길이가 조금만 더 길어지면 시간초과가 날 것 같지만… 적어도 이 문제에서는 충분히 통과할 것 같아서..
N 길이의 문자열 배열에 입력값을 차레로 넣어준 뒤 모든 문자열을 비교하면 된다. 이 때 두 문자열의 모든 글자를 비교하여 같은 글자인 경우를 세는 check() 함수를 선언하여 사용했다. 처음부터 연속으로 같은 문자의 개수(문제의 접두사의 길이)를 카운트한 후, 해당 값이 최댓값인 경우엔 두 문자열의 인덱스(순서)를 기억해준다. 이후 배열에 있는 모든 문자열을 검사했다면 최종 저장된 인덱스의 문자열을 차례로 출력해주면 끝이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
static int check(String s1, String s2) {
int cnt = 0, size = Math.min(s1.length(), s2.length());
for(int i=0;i<size;i++) {
if(s1.charAt(i)==s2.charAt(i)) cnt++;
else break;
}
return cnt;
}
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String[] list = new String[N];
for(int i=0;i<N;i++) {
list[i] = br.readLine();
}
int ans1=-1,ans2=-1;
int max=Integer.MIN_VALUE;
for(int i=0;i<N-1;i++) {
String s1 = list[i];
for(int j=i+1;j<N;j++) {
int cnt=0;
String s2 = list[j];
cnt = check(s1,s2);
if(cnt>max) {
ans1 = i;
ans2 = j;
max = cnt;
}
}
}
System.out.println(list[ans1]);
System.out.println(list[ans2]);
}
}
안녕하세요 이 문제 왜 통과하는건가요? 제한시간 2초인데 시간복잡도가 n제곱 * 문자열길이라 10의 10승인거 같은데... 흠