코딩테스트/백준

[백준 1251] 단어 나누기 (S5)

34suuuuu 2025. 4. 30. 12:53

📍 문제

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

 

📍 문제 풀이

만들어진 모든 문자열을 추가할 리스트를 만들어둔다.

그리고 입력받은 문자열을 3개로 나눌 인덱스 값을 지정한다.

아래와 같은 경우로는 `(0, a)`, `(a, b-1)`, `(b, input.length()-1)` 세개로 문자열을 나눌 수 있다.

for (int a = 1; a < input.length(); a++) {
    for (int b = a + 1; b < input.length(); b++) {
 	}
}

 

각각의 문자열을 뒤집기 위한 `flipWord()` 메서드를 선언해줬다.

여러 방법이 있겠지만, StringBuilder를 통해 새로운 문자열을 생성해 리턴해주는 방식을 사용했다.

각각 문자열을 뒤집은 뒤 처음에 선언해 둔 리스트에 추가해주고 정렬하면 사전순으로 가장 앞서는 단어를 출력할 수 있다.

 

📍전체코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

		List<String> wordList = new ArrayList<>();
		String input = br.readLine();
		for (int a = 1; a < input.length(); a++) {
			for (int b = a+1; b < input.length(); b++) {
				String str1 = input.substring(0, a);
				String str2 = input.substring(a, b);
				String str3 = input.substring(b);

				StringBuilder sb = new StringBuilder();
				wordList.add(sb.append(flipWord(str1)).append(flipWord(str2)).append(flipWord(str3)).toString());
			}
		}
		Collections.sort(wordList);
		System.out.println(wordList.get(0));
	}

	private static String flipWord(String word) {
		StringBuilder sb = new StringBuilder();
		for(int i = word.length()-1; i >= 0; i--){
			sb.append(word.charAt(i));
		}
		return sb.toString();
	}
}