28255번: 3단 초콜릿 아이스크림백준/문제2024. 8. 13. 13:48
Table of Contents
문제 출처 : https://www.acmicpc.net/problem/28255
언어 : Kotlin
문제 설명 :
코코는 초콜릿 아이스크림을 쌓아서 먹는 것을 좋아한다. 초콜릿 아이스크림 탑은 알파벳 대문자로 이루어진 문자열로 나타낼 수 있다. 예를 들면 벨기에, 민트, 오리지널 맛을 순서대로 쌓은 것은 BMO라고 쓸 수 있다.
코코는 “2단 아이스크림”의 정의를 다음과 같이 내리기로 했다.
- 길이 n인 아이스크림 문자열 S가 주어졌을 때, 길이가 $\left\lceil \frac{n}{2} \right\rceil$인 S의 접두사 S'를 생각한다.
- $\left\lceil x \right\rceil$은 x보다 크거나 같은 최소의 정수이다.
$S=S'+\operatorname{rev}(S')$ 또는 $S=S'+\operatorname{tail}(\operatorname{rev}(S'))$를 만족하면 S는 2단 아이스크림이다. 여기서 $S_1+S_2$는 두 문자열을 순서대로 이어붙인 것, $\operatorname{rev}(S)$는 S의 글자의 순서를 뒤집은 것이고, $\operatorname{tail}(S)$는 S의 첫 글자를 제거한 것을 의미한다.
하지만 이 정의가 평범한 팰린드롬의 정의와 같다는 것에 실망한 코코는 한 단계 더 나아간 “3단 아이스크림”을 정의하였다.
- 길이 n인 아이스크림 문자열 S가 주어졌을 때, 길이가 $\left\lceil \frac{n}{3} \right\rceil$인 S의 접두사 S'를 생각한다.
- 다음 중 적어도 하나를 만족하면 S는 3단 아이스크림이다.
- $S=S'+\operatorname{rev}(S') +S'$
- $S=S'+\operatorname{tail}(\operatorname{rev}(S')) +S'$
- $S=S'+\operatorname{rev}(S') +\operatorname{tail}(S')$
- $S=S'+\operatorname{tail}(\operatorname{rev}(S')) +\operatorname{tail}(S')$
예를 들어, DOTTODOT은 DOTTODOT =DOT + TOD + OT이므로 3단 아이스크림이다.
각각의 문자열이 3단 아이스크림 문자열인지 판별해보자.
입력 :
첫 줄에는 테스트 케이스의 수 T가 주어진다. (1 ≤ T ≤ 1000)
다음 T개의 줄 각각에는 알파벳 대문자로 이루어진 문자열이 주어진다. 문자열의 길이는 6 이상 30 이하이다.
출력 :
각각의 테스트 케이스에 대해, 주어진 문자열이 3단 아이스크림 문자열이면 1, 아니면 0을 출력한다.
제한 사항 :
- 시간 제한 : 1초
- 메모리 제한 : 1024MB
입출력 예 :
입력 | 출력 |
8 XYYXXY BANABAN DOTTODOT DADADADADA RANDOM HOTSHOT CHOCOLATE DADADADADADA |
1 1 1 1 0 0 0 0 |
풀이 :
문제에서 주어진 3단 아이스크림의 조건에 맞게 문자열을 생성하고 그 조건 중 하나라도 맞다면 1 아니면 0을 출력하게 하는 문제.
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() = with(BufferedReader(InputStreamReader(System.`in`))) {
val bw = BufferedWriter(OutputStreamWriter(System.out))
repeat(readLine().toInt()) {
val cur = readLine()
val n = (cur.length + 2) / 3
val curPrime = cur.substring(0, n)
val revCurPrime = curPrime.reversed()
val tailRCP = revCurPrime.drop(1)
val tailCP = curPrime.drop(1)
val p1 = curPrime + revCurPrime + curPrime
val p2 = curPrime + tailRCP + curPrime
val p3 = curPrime + revCurPrime + tailCP
val p4 = curPrime + tailRCP + tailCP
bw.write(if (cur == p1 || cur == p2 || cur == p3 || cur == p4) "1" else "0")
bw.newLine()
}
bw.flush()
bw.close()
}
'백준 > 문제' 카테고리의 다른 글
1599번: 민식어 (0) | 2024.08.14 |
---|---|
3778번: 애너그램 거리 (0) | 2024.08.14 |
18787번: Mad Scientist (0) | 2024.08.13 |
13234번: George Boole (0) | 2024.08.12 |
2149번: 암호 해독 (0) | 2024.08.12 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!