문제
https://www.acmicpc.net/problem/1251
1251번: 단어 나누기
알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다. 먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다
www.acmicpc.net
문제 접근
- 입력으로 주어진 단어에 대해 문자열을 나누어 뒤집고, 이를 다시 조합하는 것이 가장 핵심적인 로직이다.
- 이때 만들 수 있는 모든 단어를 만들어야 하므로 어떻게 문자열을 나눌 것인지를 생각해야 한다.
- 모든 경우의 수를 따져보아야 하므로 문제에서 제시된 조건인 각각의 문자열은 적어도 길이 1 이상이어야 한다를 만족하도록 문자열을 나누어 주면 된다.
- 2중 for문으로 만들어낼 수 있다.
- 또한 사전 순으로 가장 앞서는 단어를 출력해야 하는데 이는 모든 데이터를 저장한 후에 정렬을 수행하여 가장 앞에 존재하는 문자열을 가져오도록 함으로서 구현할 수 있다.
- 다른 방법으로는 최소 힙을 사용하여 데이터가 저장될 때 마다 내부적으로 정렬이 자동으로 수행되도록 할 수 있다. 필자는 해당 방법을 사용하였다.
정답 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String data = br.readLine();
String[] divided = new String[3];
PriorityQueue<String> pq = new PriorityQueue<>();
for (int i = 1; i <= data.length() - 2; i++){
divided[0] = data.substring(0, i);
for (int j = i + 1; j <= data.length() - 1; j++){
divided[1] = data.substring(i, j);
divided[2] = data.substring(j);
StringBuilder result = new StringBuilder();
for (int k = 0; k < divided.length; k++){
StringBuffer sb = new StringBuffer(divided[k]);
result.append(sb.reverse().toString());
}
pq.offer(result.toString());
}
}
System.out.println(pq.poll());
}
}
'Algorithm > BruteForce' 카테고리의 다른 글
[백준][BOJ 5883] - 아이폰 9S (0) | 2023.10.05 |
---|---|
[백준][BOJ 2422] - Ice Cream (1) | 2023.10.04 |
[백준][BOJ 1969] - DNA (1) | 2023.10.02 |
[백준][BOJ 4134] - 다음 소수 (0) | 2023.10.02 |
[백준][BOJ 2210] - 숫자판 점프 (0) | 2023.10.02 |