백준 알고리즘(코딩테스트 공부)

단어 나누기

Dev.gunnuuu 2024. 9. 18. 16:08

 

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

 

 

문제

알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다.

먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다. 각각은 적어도 길이가 1 이상인 단어여야 한다. 이제 이렇게 나눈 세 개의 작은 단어들을 앞뒤를 뒤집고, 이를 다시 원래의 순서대로 합친다.

예를 들어,

  • 단어 : arrested
  • 세 단어로 나누기 : ar / rest / ed
  • 각각 뒤집기 : ra / tser / de
  • 합치기 : ratserde

단어가 주어지면, 이렇게 만들 수 있는 단어 중에서 사전순으로 가장 앞서는 단어를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 영어 소문자로 된 단어가 주어진다. 길이는 3 이상 50 이하이다.

출력

첫째 줄에 구하고자 하는 단어를 출력하면 된다.

예제 입력 1 

mobitel

예제 출력 1 

bometil

 

풀이

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));
        String word = br.readLine();
        List<String> list = new ArrayList<>();
        
        for(int i = 2; i<word.length();i++){
            for(int j = 1; j<i;j++){
                StringBuilder sb1 = new StringBuilder(word.substring(0, j));
                StringBuilder sb2 = new StringBuilder(word.substring(j, i));
                StringBuilder sb3 = new StringBuilder(word.substring(i));
                String w1 = sb1.reverse().toString();
                String w2 = sb2.reverse().toString();
                String w3 = sb3.reverse().toString();
                list.add(w1 + w2 + w3);
            }
        }
        Collections.sort(list);
        System.out.println(list.get(0));
    }
}

 

 우선 문자열을 읽을 것이므로 scanner보다는 BuffferedReader를 사용하기로 하였고 IOException, Arraylist, 정렬을 위한 Collections 등 을 사용하기 위하여 필요한 패키지들을 import 해주었다. BufferedReader를 사용하여 읽어온 문자열 word를 3부분으로 나누어 주기 위해서 이중 for문을 구성해보았다. 기본적으로 단어의 길이는 1 이상이여야 하므로 j 는 1부터 i까지, i는 2부터 읽어온 word의 길이까지 반복문을 돌렸으며 StringBuilder과 substring 함수를 사용하여 적어도 1이상의 길이를 갖는 다른 3개의 sb1, sb2, sb3으로 나누어 저장할 수 있었다. 그 뒤에 각 단어들을 reverse() 한 뒤  w1, w2, w3에 문자형태로 각 각 저장하여 주었다. 이렇게 만들어진 세 단어를 연결하여 하나의 문자열로  Arraylist 원소로 각각 저장해주고 Collections.sort() 를 사용하여 list를 사전순으로 오름차순 정렬하였다. 마지막으로 list.get(0) 로 첫번째 인덱스에 해당하는원소  즉, 가장 사전상 앞인 최종단어를 출력하어 구현할 수 있었다.