문제 url:
서로 다른 부분 문자열의 개수
문제:
일단, 중복된 값을 저장하지 않기 때문에 HashSet을 활용할 수 있다.
이를 이용해서 문제를 풀어보겠다.
필자는 subString()를 이용해 문자열을 인덱스별로 잘라 사용해보고자 한다.
이를 이용해서 함께 코드를 알아보자
import java.io.*;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
Set<String> s_set = new HashSet<>();
for(int i = 0; i< s.length(); i++) {
for(int j = i+1; j <= s.length(); j++) {
s_set.add(s.substring(i, j));
}
}
System.out.println(s_set.size());
}
}
예시코드는 tc인 ababc를 활용하도록 하겠다.
a (0:1) | ab (0:2) | aba (0:3) | abab (0:4) | ababc (0:5) |
---|---|---|---|---|
b (1:2) | ba (1:3) | bab (1:4) | babc (1:5) | |
a (2:3) | ab (2:4) | abc (2:5) | ||
b (3:4) | bc (3:5) | |||
c (4:5) |
해당 문제를 이렇게 답이 나올 수 있다. 이를 HashSet에 add하게 되면 중복값이 제거된
a, b, c, ab, ba, bc, aba, bab, abc, abab, babc, ababc
총 12개가 저장될 수 있다.
해당 문제를 푸는데, set과 substring()을 생각했지만, 안타깝게도 생각을 너무 깊게 하였다.
해당 문제는 길이가 최대 1,000가지로 최대 O(N^2)까지 시간 복잡도를 생각해볼 수 있다. 하지만, for문의 두려움을 견디지 못하고.... 너무 빙빙 돌아가버렸다..
해당 문제를 통해 복기하지만, 하드코딩이라도 일단 해보고 판단해보자!