구름 LEVEL JAVA - 문자열 나누기 (난이도 2)
May 27, 2024
»
algorithm
구름 난이도 2 문자열 나누기
문제 요약
- 문자열의 길이가 (3 <= N <= 100) 사이인 소문자의 문자열 S가 주어진다.
- 문자열을 중복 제거한 사전 순서로 3개의 부분문자열을 구성할때 최대 값은 무엇일까?
코드
import java.io.*;
import java.util.*;
class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String S = br.readLine();
List<String[]> str = new ArrayList();
TreeSet<String> setStr = new TreeSet<>();
// 이중 for 문을 돌며 3개의 부분 문자열을 나눈다.
for(int i=1; i<N; i++) {
for(int j=i+1; j<N; j++) {
String a = S.substring(0,i);
String b = S.substring(i,j);
String c = S.substring(j);
// 나눈 문자열을 목록으로 만든다.
str.add( new String[]{a , b , c} );
// TreeSet 으로 사전 순서로 정렬하며, 중복을 제거 한 목록을 만든다.
setStr.add( a );
setStr.add( b );
setStr.add( c );
}
}
// 정렬,중복이 끝난 set 으로 for 문을 돌며 각 문자열에 점수를 기입한다.
HashMap<String,Integer> map = new HashMap<>();
int index = 1;
for(String word : setStr) {
map.put(word , index++);
}
int max = 0;
// 위에서 나눈 문자열 목록으로 for 문을 돌린다.
for(String[] word : str) {
// 부분 문자열 3개 값의 각 점수를 더한 후 max 값을 찾는다.
max = Math.max( max , map.get(word[0]) + map.get(word[1]) + map.get(word[2]) );
}
System.out.println(max);
}
}
풀이
- 이중 for 문을 돌며 3개의 부분 문자열을 나누고, 나눈 문자열을 아래 두가지 목록으로 만든다.
- 기본 목록 : ArrayList
- 사전 순(a b c d) 정렬 + 중복 제거 한 목록 : TreeSet
-
TreeSet 으로 for 문을 돌며 각 문자열에 점수를 기입한다.
- ArrayList 목록으로 for 문을 돌며 3개의 부분 문자열 점수를 다 더하고 Math.max 로 최대값을 찾는다.