728x90
https://www.acmicpc.net/problem/1251
문제
알파벳 소문자로 이루어진 단어를 가지고 아래와 같은 과정을 해 보려고 한다.
먼저 단어에서 임의의 두 부분을 골라서 단어를 쪼갠다. 즉, 주어진 단어를 세 개의 더 작은 단어로 나누는 것이다. 각각은 적어도 길이가 1 이상인 단어여야 한다. 이제 이렇게 나눈 세 개의 작은 단어들을 앞뒤를 뒤집고, 이를 다시 원래의 순서대로 합친다.
예를 들어,
- 단어 : arrested
- 세 단어로 나누기 : ar / rest / ed
- 각각 뒤집기 : ra / tser / de
- 합치기 : ratserde
단어가 주어지면, 이렇게 만들 수 있는 단어 중에서 사전순으로 가장 앞서는 단어를 출력하는 프로그램을 작성하시오.
해설
그리디 알고리즘(탐욕 알고리즘)을 통해 문제를 풀어보았다.
이중 for문을 통해 세 단어로 나눌 수 있는 경우를 모두 찾아 사전적으로 가장 앞서는 문장을 찾는다.
여기서 정렬을 통해 첫번째에 있는 문장을 출력해도 되지만 나는 가장 작은 값을 출력하도록 하였다.
결론적으로 다를 것이 없기 때문이다.
자바 또는 코틀린으로 문제를 접한다면 substring과 reversed 메소드를 사용할 줄 안다면 쉽게 풀 수 있다.
소스 코드
import java.io.BufferedReader
import java.io.InputStreamReader
import kotlin.collections.HashSet
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val input = br.readLine()
val comb: HashSet<String> = HashSet()
for(i in 1 until input!!.length) {
for(j in i+1 until input.length) {
var a = input.substring(0, i)
var b = input.substring(i, j)
var c = input.substring(j, input.length)
a = a.reversed()
b = b.reversed()
c = c.reversed()
comb.add(a + b + c)
}
}
println(comb.minOrNull())
}
728x90
'PS(Problem Solving) > BOJ' 카테고리의 다른 글
[백준/BOJ] 11656번: 접미사 배열 (0) | 2021.12.29 |
---|---|
[백준/BOJ] 1380번: 귀걸이 (0) | 2021.12.27 |
[백준/BOJ] 1343번: 폴리오미노 (0) | 2021.12.19 |
[백준/BOJ] 1021번: 회전하는 큐 (0) | 2021.12.15 |
[백준/BOJ] 10866번: 덱 (0) | 2021.12.14 |
댓글