구름 LEVEL JAVA - 문자열 나누기 (난이도 2)

» algorithm

구름 난이도 2 문자열 나누기

문제 요약

  1. 문자열의 길이가 (3 <= N <= 100) 사이인 소문자의 문자열 S가 주어진다.
  2. 문자열을 중복 제거한 사전 순서로 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);
    }
}

풀이

  1. 이중 for 문을 돌며 3개의 부분 문자열을 나누고, 나눈 문자열을 아래 두가지 목록으로 만든다.
    • 기본 목록 : ArrayList
    • 사전 순(a b c d) 정렬 + 중복 제거 한 목록 : TreeSet
  2. TreeSet 으로 for 문을 돌며 각 문자열에 점수를 기입한다.

  3. ArrayList 목록으로 for 문을 돌며 3개의 부분 문자열 점수를 다 더하고 Math.max 로 최대값을 찾는다.