728x90
https://www.acmicpc.net/problem/11478
- 예제 입력1
ababc
- 예제 출력1
12
- 문제 접근
- 문자열을 입력 받아 1개 ~ 문자열 길이까지의 모든 문자열을 저장
- 단, 겹치는 문자열은 제외하고 서로 다른 것의 개수만 출력
- 문제 해결
- Set을 이용하여 모든 경우의 수 저장하고 사이즈 출력
- 슈도 코드
str(문자열 저장)
subSet(중복되지 않는 Set 선언)
for(start = 0 ~ 문자열 길이 전까지 반복){
for(end = start+1 ~ 문자열 길이까지 반복){
set에 str.substring(start, end) 저장
}
}
subSet 사이즈 출력
- 코딩하기
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = br.readLine();
Set<String> subSet = new HashSet<>();
for(int start = 0; start < str.length(); start++){
for(int end = start + 1; end <= str.length(); end++){
// end = start를 하게 되면, [0,0]일 때 공백이 Set에 저장되어 1개가 더 카운팅
// substring의 endIndex는 포함되지 않아 end는 문자열 길이까지
subSet.add(str.substring(start, end));
}
}
System.out.println(subSet.size());
}
- 슬라이딩 윈도우 방식으로 코딩 해보기
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Set<String> stringSet = new HashSet<>();
String str = br.readLine();
// 슬라이딩 윈도우 도전
int size = 1;
while(size <= str.length()){
StringBuilder sb = new StringBuilder();
int start = 0, end = size;
// str의 0 ~ end-1까지 substring하여 StringBuilder에 추가 -> 최초 윈도우
sb.append(str, start, end);
// 최초 윈도우의 값 Set에 저장
stringSet.add(sb.toString());
while(end < str.length()) {
// StringBuilder의 가장 첫 번째값 삭제
sb.deleteCharAt(0);
// StringBuilder에 문자열의 end번째 값 추가
// substring은 endIndex를 포함하지 않기 때문에, end번째 인덱스의 값을 추가하고 후증가
sb.append(str.charAt(end++));
// 앞에 한 개 지우고, 뒤에 한 개 추가한 부분 문자열 Set에 저장
stringSet.add(sb.toString());
}
size++; // 슬라이딩 윈도우 크기 증가
}
System.out.println(stringSet.size());
}
728x90
'Coding Test > Problem Number' 카테고리의 다른 글
[Java] 팰린드롬 파티션 [2705번] (0) | 2024.07.20 |
---|---|
[Java] Z [1074번] (0) | 2024.07.20 |
[Java] 파일 정리 [20291번] (0) | 2024.07.19 |
[Java] 회사에 있는 사람 [7785번] (0) | 2024.07.19 |
[Java] 수 이어 쓰기 1 [1748번] (0) | 2024.07.19 |