백준/문제

23746번: 문자열 압축 해제

스몰스테핑 2024. 9. 12. 13:31

문제 출처 : https://www.acmicpc.net/problem/23746

 

언어 : Kotlin

 

문제 설명 :

특정 소문자 문자열 패턴을 대문자 한 글자로 압축하는 프로그램 SPC(String Pattern Compressor)가 있다.

예를 들어, 다음과 같은 방법으로 압축하는 경우, “aabbaaac”는 “ABAC”로 압축된다.

 

소문자 문자열 패턴 대문자
 aa  A
 bba  B
 c  C

 

압축 프로그램과 압축된 문자열이 주어지면, 압축되기 전 문자열의 일부를 출력하는 프로그램을 작성하시오.

 

입력 :

첫 번째 줄에 압축 방법의 개수 N이 주어진다. (1 ≤ N ≤ 26)

두 번째 줄부터 N개의 줄에 소문자 문자열 패턴과 대응되는 대문자가 공백으로 구분되어 주어진다. 각 소문자 문자열 패턴의 길이는 1,000을 넘지 않으며, 같은 대문자는 두 번 이상 주어지지 않는다.

 N+1번째 줄에 압축된 문자열이 주어진다. 압축된 문자열 길이는 1,000을 넘지 않는다.

마지막 줄에 두 정수 S와 E가 주어진다. (1 ≤ S ≤ E ≤ (압축되기 전 문자열 길이))

 

출력 :

압축되기 전 문자열의 S번째 문자에서 E번째 문자까지 출력한다.

 

제한 사항 :

  • 시간 제한 : 1초
  • 메모리 제한 : 256MB

 

입출력 예 :

입력 출력
3
aa A
bba B
c C
ABAC
4 6
baa
5
abcde A
abcde B
abcde C
abcde D
abcde E
ABCDE
1 25
abcdeabcdeabcdeabcdeabcde
4
e E
f F
g G
h H
EEEFEEE
4 5
fe

 

풀이 : 

import java.io.BufferedWriter
import java.io.OutputStreamWriter

fun main() = with(System.`in`.bufferedReader()) {
    val bw = BufferedWriter(OutputStreamWriter(System.out))

    val n = readLine().toInt()
    val map = mutableMapOf<Char, String>()
    repeat(n) {
        val (pattern, code) = readLine().split(" ")
        map[code.toCharArray()[0]] = pattern
    }
    val zipWord = readLine()
    val (s, e) = readLine().split(" ").map { it.toInt() }

    val sb = StringBuilder()
    zipWord.forEach { sb.append(map[it]) }
    
    bw.write(sb.substring(s - 1 until e))
    bw.flush()
    bw.close()
}