© 2025 anveloper.dev
GitHub·LinkedIn·Contact

목차

  • 문제
  • 입력
  • 출력
  • 예제
  • 풀이
  • 코드
  • 복잡도
풀이 목록으로 돌아가기

BOJ 11478 - 서로 다른 부분 문자열의 개수

2022-10-28
BOJ
실버 III
java
원본 문제 보기
자료 구조
문자열
집합과 맵
해시를 사용한 집합과 맵
트리를 사용한 집합과 맵

문제

BOJ 11478 - 서로 다른 부분 문자열의 개수

문자열 S가 주어졌을 때, 서로 다른 부분 문자열(연속된 일부분)의 개수를 구하라.

입력

첫째 줄에 알파벳 소문자로 이루어진 문자열 S가 주어진다 (길이 1 이상 1,000 이하).

출력

서로 다른 부분 문자열의 개수를 출력한다.

예제

입력출력
ababc12

풀이

모든 부분 문자열을 HashSet에 넣어 중복을 제거한 후 크기를 출력한다.

  1. 길이 1부터 S.length()까지 이중 반복한다
  2. 각 길이 i에 대해 시작 인덱스를 이동하며 substring을 추출한다
  3. 추출한 부분 문자열을 HashSet에 삽입하여 중복을 자동 제거한다
  4. 최종 HashSet의 크기가 정답이다

핵심 아이디어: 문자열 길이가 최대 1,000이므로 부분 문자열은 최대 약 500,500개이고, HashSet으로 충분히 처리 가능하다.

코드

package ASP_study.day299;
 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
 
public class Day263BOJ11478서로다른부분문자열 {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String S = br.readLine();
		HashSet<String> hs = new HashSet<>();
 
		for (int i = 1; i <= S.length(); i++) {
			int length = i;
			while (length <= S.length()) {
				hs.add(S.substring(length - i, length));
				length++;
			}
		}
 
		System.out.println(hs.size());
	}
}

복잡도

  • 시간: O(N^3) - 이중 반복 O(N^2) * substring 생성 O(N)
  • 공간: O(N^3) - HashSet에 저장되는 부분 문자열 총 길이