https://www.acmicpc.net/problem/16120
P는 PPAP 문자열이고, PPAP 문자열의 P 하나를 PPAP로 바꾼 것도 PPAP 문자열이다.
주어진 문자열이 PPAP 문자열인지 확인하는 문제이다.
문자열이 주어졌으니, 주어진 문자열에서 PPAP가 등장하면 P로 바꾸고 끝까지 작업을 마쳤을 때, P 하나만 남는 지 찾는 것이 좋겠다 생각하였다.
그래서 첫 번째 풀이 시도에서는, StringBuilder를 이용해 PPAP를 찾으면 P로 바꾼 후 앞으로 3칸 이동하는 것을 반복하는 알고리즘을 작성했다.
하지만 주어지는 문자열의 길이가 최대 1,000,000이므로 시간초과가 발생했다.
그래서 두 번째 풀이로, Int형 변수를 통해 P의 개수를 세며 스택과 유사한 효과를 내도록 해 보았다.
그 알고리즘은 다음과 같다. (변수를 p라고 하면)
위 알고리즘을 통해 예시를 풀어보자.
PPPPAPAPAP라는 문자열이 주어졌다.
모든 문자를 순회한 후 p가 1이므로 PPAP 문자이다.
fun main(args: Array<String>): Unit = with(System.`in`.bufferedReader()) {
val str = readLine().toCharArray()
var p = 0
for(i in str.indices){
if(str[i] == 'P') p++
if(str[i] == 'A'){
if(p >= 2 && i + 1 < str.size && str[i + 1] == 'P')
p -= 2
else{
p = 0
break
}
}
}
print(if(p == 1) "PPAP" else "NP")
}