새소식

Baekjoon

[BaekJoon] 1662 번 압축 문제 - (nodejs)

  • -
728x90
문제 번호 :  1662번

문제 바로가기 https://www.acmicpc.net/problem/1662

 

<<< 문제 내용 >>>

 


 

const fs = require('fs');
const filePath = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
let input = fs.readFileSync(filePath).toString().trim().split('\r\n');

input = input[0].split('');
let arr = [];
let front = 0;
let answer = new Array(20).fill(0);

for(let i in input){
    if(input[i] === ')'){
        let temp = "";
        while(true){
            let index = arr.pop();
            
            if(index === '('){
                let number = arr.pop();
                answer[front] = answer[front] + (answer[front+1]+temp.length) * number;
                answer[front+1] = 0;

                break;
            }else{
                temp += index;
            }
        }
        front--;
    }else if(input[i] === '('){
        arr.push(input[i]);
        front++;
    }else arr.push(input[i]);

}

console.log(arr.length+answer[1]);

* 처음엔 문자를 그대로 담아뒀다 갯수만큼 쏟아내었더니 메모리초과가 떴습니다.

이 문제는 결국 string을 줄이고 반복되는 건 버려야 했습니다.

 

해결방법

1. 입력값을 하나씩 담고 '(' 와 ')'일때만 다르게 처리한다.

2. '('는 front값을 하나씩 진행해주었는데, 이는 괄호의 단계를 뜻한다.

3. 따라서 만약 answer = [0, 0, 0, 0, 0, 0, 0 ... 0] 이렇게 있다고하면 세번째 '('는 answer[3]에 기록될 것이다.

( 그 이유는 15(22)13(92(1111)42(222))123(1)45 와 같은 반례 때문이다. 그리고 answer[0]은 계산의 편의를 위해 그냥 비웠다. )

4. 그 이후 ')'를 만나게되면 '('를 만날 때 까지 temp에 값을 담아두고, '('를 만나면 '('앞의 숫자와 계산해서 answer[괄호 단계]에 계속해서 누적시켜준다.

5. 만약 괄호단계가 줄어들게되면 뒤의 단계에 영향을 주지 않도록 0으로 초기화 시켜주면서 마지막엔 answer[1]에 모든 계산한 값이 누적된다.

6. 이 누적한 값을 계산에 들어가지않았던 나머지 arr의 길이와 합쳐주면 값이 출력된다.

 

 

다른 사람의 코드도 확인해보고자 검색해봤지만 안타깝게도 javascript, nodejs 등의 검색어로도 찾을 수 없었습니다.

애초에 제출한 사람의 수가 굉장히 적었고, 그 중 2명만이 맞추었기 때문인 것 같았습니다.

 

그래서 다른 언어로 한번 보았으나, 대부분 재귀를 사용하시더라구요.

재귀로도 할 수 있겠구나... 싶어서 놀랬지만 어쨋든 이렇게 정해진 케이스 내에서는 제 방식이 나름 빠른 것 같아서 도움이 될까하고 올려봅니다 ㅎㅎ.

 

 

 

도움이 되셨다면 공감 부탁드립니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.