알고리즘/문자열

[BOJ] 백준 1251 - 단어 나누기 풀이

송승현(SSH) 2022. 9. 1. 23:15

1. 문제

https://www.acmicpc.net/problem/1251

 

1251번: 단어 나누기

알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다. 먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다

www.acmicpc.net

 

2. 풀이

문자열 관련 문제이고 브루트포스로 해결하였다.
단어를 세 부분으로 나누어야 하기에, 나누는 포인트(/) 2개를 브루트포스 알고리즘으로 나눌 수 있는 모든 문자열을 구하여 각각 뒤집고 합친 후 리스트에 추가한다.
그 후 Collections.sort()로 정렬하면 기본적으로 오름차순으로 정렬되기에, 리스트의 첫 번째 인덱스에 들어있는 문자열이 사전순으로 가장 앞선 문자열이 된다.

 

3. 소스 코드

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 input = br.readLine();
        List<String> stringList = new ArrayList<>();

        for (int i = 1; i < input.length() - 1; i++) {
            for (int j = i + 1; j < input.length(); j++) {
                String tempString = new String();

                tempString += reverse_String_method(0, i, input);
                tempString += reverse_String_method(i, j, input);
                tempString += reverse_String_method(j, input.length(), input);

                stringList.add(tempString);
            }
        }

        Collections.sort(stringList);

        bw.write(stringList.get(0));
        bw.flush();
        bw.close();
        br.close();
    }

    private static String reverse_String_method(int i, int j, String input) {
        StringBuilder sb = new StringBuilder();
        sb.append(input.substring(i, j));
        sb.reverse();
        return sb.toString();
    }
}