문자열 S가 주어졌을 때, S의 서로 다른 부분 문자열의 개수를 구하는 프로그램을 작성하시오.
부분 문자열은 S에서 연속된 일부분을 말하며, 길이가 1보다 크거나 같아야 한다.
예를 들어,ababc
의 부분 문자열은a, b, a, b, c, ab, ba, ab, bc, aba, bab, abc, abab, babc, ababc
가 있고, 서로 다른것의 개수는 12개이다.
첫째 줄에 문자열 S가 주어진다. S는 알파벳 소문자로만 이루어져 있고, 길이는 1,000 이하이다.
첫째 줄에 S의 서로 다른 부분 문자열의 개수를 출력한다.
✅ 문자열
s
를 입력받아toCharArray()
메서드를 사용하여arr[]
에 char 타입으로 변환하여 저장한 후, 이중 for문을 사용하여 부분 문자열을 생성한다. 서로 다른 부분 문자열, 즉, 중복 문자열을 제외한 개수를 구해야 하므로 HashSetset
을 생성하여 문자열을 생성할 때마다 추가해주면 중복 데이터는 알아서 걸러진다! 개수를 출력해야 하므로 마지막 출력문에size()
메서드를 사용하였다.
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = br.readLine();
char[] arr = s.toCharArray();
Set<String> set = new HashSet<>();
for(int i=0;i<arr.length;i++) {
String str = String.valueOf(arr[i]);
set.add(str);
for(int j=i+1;j<arr.length;j++) {
str += arr[j];
set.add(str);
}
}
bw.write(set.size() + "");
br.close();
bw.close();
}
}
➕ 다른 사람의 코드 : 다들 내 풀이보다 시간이 짧길래 봤는데 나처럼 굳이 변환+변환+... 하지 않아도
subString()
메서드를 사용하니 간단하게 풀 수 있었다,,! 문자열 끊기 하면서 이 메서드를 생각 못하다니,, 망충 그잡채,,
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s = br.readLine();
Set<String> set = new HashSet<>();
for(int i=0;i<s.length();i++) {
for(int j=0;j<s.length()-i;j++) {
set.add(s.substring(j, j+i+1));
}
}
bw.write(set.size() + "");
br.close();
bw.close();
}
}