Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | |||
| 5 | 6 | 7 | 8 | 9 | 10 | 11 |
| 12 | 13 | 14 | 15 | 16 | 17 | 18 |
| 19 | 20 | 21 | 22 | 23 | 24 | 25 |
| 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 코드트리
- 플로이드-워셜
- 티스토리챌린지
- 파이썬
- 개발자루틴
- 운영체제
- #코드트리 #코딩테스트 #코테공부 #백트래킹 #알고리즘 기초
- 데이터베이스
- 코딩테스트준비
- 갭체크
- 1일1코테
- 웹
- 자바스크립트
- 알고리즘
- til
- 코딩테스트
- 자료구조
- 항해99
- 연결 리스트
- 코테공부
- 인접 행렬
- 오블완
- 개발자취업
- 자바
- 99클럽
- 코딩테스트사이트추천
- C
- Java
- 프로그래머스
- 프로그래밍 언어
Archives
- Today
- Total
와드의 블로그
단어 나누기 본문
문제
알파벳 소문자로 이루어진 단어가 주어집니다. 이 단어를 임의의 두 부분을 골라서 세 개의 단어로 나눕니다. (나뉜 각 단어는 적어도 길이가 1 이상이어야 합니다.) 그 다음, 나뉜 세 개의 단어를 각각 순서를 뒤집은 후 다시 원래 순서대로 합칩니다. 이렇게 만들 수 있는 모든 단어들 중 사전순으로 가장 앞서는 단어를 출력하는 프로그램을 작성하는 문제입니다.
- 입력: 첫째 줄에 영어 소문자로 된 단어가 주어집니다. 길이는 3 이상 50 이하입니다.
- 출력: 첫째 줄에 사전순으로 가장 앞서는 단어를 출력합니다.
링크: https://www.acmicpc.net/problem/1251
풀이: 3분할 완전 탐색과 리스트 정렬
단어의 길이가 최대 50으로 매우 작기 때문에, 세 부분으로 나눌 수 있는 모든 경우의 수를 직접 구해보는 완전 탐색(Brute Force) 방식이 가장 적합합니다.
- 분할점 설정: 단어를 세 부분으로 나누기 위해 두 개의 자르는 위치 i와 j를 설정합니다.
- i는 두 번째 단어의 시작 인덱스로, 1부터 문자열 길이 - 2까지 가능합니다.
- j는 세 번째 단어의 시작 인덱스로, i + 1부터 문자열 길이 - 1까지 가능합니다.
- 문자열 뒤집기 및 병합: i와 j가 정해지면, 인덱스를 역순으로 순회하는 반복문 3개를 사용하여 각 단어를 뒤집고 StringBuilder에 추가합니다.
- 첫 번째 단어: 0부터 i - 1까지 역순 탐색
- 두 번째 단어: i부터 j - 1까지 역순 탐색
- 세 번째 단어: j부터 끝까지 역순 탐색
- 정렬 및 출력: 만들어진 새로운 단어들을 ArrayList에 모두 담고, Collections.sort()를 통해 사전순(오름차순)으로 정렬합니다. 가장 앞에 있는 요소(list.get(0))가 사전순으로 가장 앞서는 단어입니다.
코드
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 s = br.readLine();
List<String> list = new ArrayList<>();
// i: 두 번째 단어의 시작점, j: 세 번째 단어의 시작점
for (int i = 1; i < s.length() - 1; i++) {
for (int j = i + 1; j < s.length(); j++) {
StringBuilder sb = new StringBuilder();
// 첫 번째 단어 뒤집어서 추가 (0 ~ i-1)
for (int k = i - 1; k >= 0; k--) {
sb.append(s.charAt(k));
}
// 두 번째 단어 뒤집어서 추가 (i ~ j-1)
for (int k = j - 1; k >= i; k--) {
sb.append(s.charAt(k));
}
// 세 번째 단어 뒤집어서 추가 (j ~ 끝)
for (int k = s.length() - 1; k >= j; k--) {
sb.append(s.charAt(k));
}
list.add(sb.toString());
}
}
// 사전순 정렬
Collections.sort(list);
// 가장 앞서는 단어 출력
bw.write(list.get(0));
bw.flush();
}
}
알고리즘 분류
문자열 (String), 브루트포스 알고리즘 (Brute Force), 정렬 (Sorting)
'PS > B.O.J' 카테고리의 다른 글
| 2941번: 크로아티아 알파벳 (0) | 2026.04.10 |
|---|---|
| 1929번: 소수 구하기 (0) | 2026.04.08 |
| 16637번: 괄호 추가하기 (0) | 2026.04.06 |
| 1080번: 행렬 (0) | 2026.04.06 |
| 1018번: 체스판 다시 칠하기 (0) | 2026.04.06 |