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) 로 첫번째 인덱스에 해당하는원소 즉, 가장 사전상 앞인 최종단어를 출력하어 구현할 수 있었다.
'백준 알고리즘(코딩테스트 공부)' 카테고리의 다른 글
| 소트인사이드 (0) | 2024.09.18 |
|---|---|
| 영화감독 숌 (1) | 2024.09.18 |
| 백준 2751번: 수 정렬하기 2 (C언어) (1) | 2024.02.29 |
| 백준 2163번: 초콜릿 자르기 (C언어) (1) | 2024.02.13 |
| 백준 1292번: 쉽게 푸는 문제 (C언어) (1) | 2024.01.25 |