본문 바로가기
coding test

Simple Text Editor

by 루에 2022. 3. 31.
반응형

Implement a simple text editor. The editor initially contains an empty string, . Perform  operations of the following  types:

  1. append - Append string  to the end of .
  2. delete - Delete the last  characters of .
  3. print - Print the  character of .
  4. undo - Undo the last (not previously undone) operation of type  or , reverting  to the state it was in prior to that operation.

Example


operation
index   S       ops[index]  explanation
-----   ------  ----------  -----------
0       abcde   1 fg        append fg
1       abcdefg 3 6         print the 6th letter - f
2       abcdefg 2 5         delete the last 5 letters
3       ab      4           undo the last operation, index 2
4       abcdefg 3 7         print the 7th characgter - g
5       abcdefg 4           undo the last operation, index 0
6       abcde   3 4         print the 4th character - d

The results should be printed as:

f
g
d

Input Format

The first line contains an integer, , denoting the number of operations.
Each line  of the  subsequent lines (where ) defines an operation to be performed. Each operation starts with a single integer,  (where ), denoting a type of operation as defined in the Problem Statement above. If the operation requires an argument,  is followed by its space-separated argument. For example, if  and , line  will be 1 abcd.

Constraints

  •  
  •  
  • The sum of the lengths of all  in the input .
  • The sum of  over all delete operations .
  • All input characters are lowercase English letters.
  • It is guaranteed that the sequence of operations given as input is possible to perform.

Output Format

Each operation of type  must print the  character on a new line.

Sample Input

STDIN   Function
-----   --------
8       Q = 8
1 abc   ops[0] = '1 abc'
3 3     ops[1] = '3 3'
2 3     ...
1 xy
3 2
4 
4 
3 1

Sample Output

c
y
a

Explanation

Initially,  is empty. The following sequence of  operations are described below:

  1. . We append  to , so .
  2. Print the  character on a new line. Currently, the  character is c.
  3. Delete the last  characters in  (), so .
  4. Append  to , so .
  5. Print the  character on a new line. Currently, the  character is y.
  6. Undo the last update to , making  empty again (i.e., ).
  7. Undo the next to last update to  (the deletion of the last  characters), making .
  8. Print the  character on a new line. Currently, the  character is a.

 

문제 풀이

연산을 줄이고 줄이고 줄였지만 테스트 케이스 2~4개 가변적으로 타임아웃이 발생한다... 더 줄일 수가 있나..? 코틀린으로는 안되나..?

전략은 다음과 같다.

  • string 연산은 stringbuilder를 사용한다.
  • 문자열 제거는 substring을 사용한다.
  • undo는 mutable list를 이용해 넣고 꺼내고 지운다.

함수 콜도 없애고, 할 건 다 한 것 같은데 타임아웃이 나니까 답이 없음.

import java.io.*
import java.util.*

fun main(args: Array<String>) {
    /* Enter your code here. Read input from STDIN. Print output to STDOUT. */
    val t = readLine()!!.trim().toInt()
    var s = ""
    var preS = mutableListOf<String>()
    for (tItr in 1..t) {
        val q = readLine()!!.trimEnd().split(" ")
    
        if(q[0] == "1") {
            preS.add(s)
            val sb = StringBuilder()
            s = sb.append(s).append(q[1]).toString()
        } else if(q[0] == "2") {
            preS.add(s)
            s = s.substring(0, s.length - q[1].toInt())
        } else if(q[0] == "3") {
            println(s[q[1].toInt() - 1])
        } else {
            s = preS.get(preS.lastIndex)
            preS.removeAt(preS.lastIndex)
        }
    }  
}
반응형

댓글