(1).백준 9935번 문자열 폭발은 중복된 문자를 계속해서 제거해야 하는 문제였다.

 

예를 들어 ababccd라는 문자열에서 abc를 폭발시킬 경우

ab'abc'cd의 내부 abc가 먼저 폭발하고 남은 문자열이 abcd가 되기 때문에

앞의 abc가 다시 폭발해 d만 남는 형태로 진행된다.

 

예전에는 단순하게 while을 사용해서 문자열 내부 폭발을 처리했지만

당연히 시간복잡도나 메모리를 어마어마하게 잡아먹어서 실패해버렸고

어제 class 4가 사라진 것을 보고 class 4 문제를 확인하던 중

틀렸던 문제가 보여서 확인해보니 이제는 풀만해 보여서 진행했다.

 

사실 이것과 유사한 문제는 많이 있었는데 보통은 고정된 숫자의 문자열의 중복을 찾는 문제였고

이 문제는 주어질 문자의 길이 또는 글자를 제공하지 않고 찾아야 하기 때문에 조금 더 복잡했다.

 

문자열의 길이에 따라 조건이 달성될 때 pop을 해야 하는 횟수가 다르기 때문에(splice/slice보다 효율적)

popResult라는 n번의 pop을 반복하는 함수를 만들었고

현재 글자가 폭발해야 하는 문자열의 마지막 글자인지를 확인하기 위한 last라는 상수를 생성했다.

 

for문을 통해 한글자씩 문자열을 계속 추가해나가는 과정을 진행하며

문자열을 추가하기 전 현재 추가할 문자열이 target의 마지막 문자인 last일 경우

앞부분을 하나씩 추적하며 target이 완성되었는지를 확인해주고

만약 아닌 경우에는 현재 글자를 result에 추가해주고

만약 target의 문자열이 모두 완성된 경우 해당 글자들을 result에서 뺄 수 있도록 popResult에 

현재 count를 집어넣어 빼야 하는 숫자를 넣어줬다.

 

그리고 한글자일 경우가 있기 때문에 

if문을 통해 target이 한글자인 경우 해당 글자가 아닌 글자만 넣어줬다.

 

최종적으로는 남은 글자가 없는지 비교를 하라는 조건이 있었기 때문에

남은 글자가 없는 경우 'FRULA'를 출력하고 아닌 경우 result에 담은 내용을 출력했다.

const input = `mirkovC4nizCC44
C4`.split('\n')

const result = []
const target = input[1]
const last = input[1][target.length-1]

const popResult = (n) => {
    for(let i = 0 ; i < n ; i++){
        result.pop()
    }
}

if(target.length > 1){
    for(let i = 0 ; i < input[0].length ; i++){
        if(input[0][i] === last){
            let count = 0
            for(let j = 1 ; j < target.length ; j++){
                if(target[target.length -1 -j] !== result[result.length - j]){
                    count = 0
                    break
                }
                else{
                    count++
                }
            }
            if(count === 0){
                result.push(input[0][i])
            }
            else{
                popResult(count)
            }
        }
        else{
            result.push(input[0][i])
        }
    }
}
else{
    for(let i = 0 ; i < input[0].length ; i++){
        if(input[0][i] !== target){
            result.push(input[0][i])
        }
    }
}

console.log((result.length === 0 ? 'FRULA' : result.join('')))

'회고' 카테고리의 다른 글

[수습일지] - 80  (0) 2023.06.14
[수습일지] - 79  (0) 2023.06.13
[수습일지] - 77(주말)  (0) 2023.06.11
[수습일지] - 76(주말)  (0) 2023.06.10
[수습일지] - 75(동원훈련)  (0) 2023.06.09

+ Recent posts