[백준] 쇠막대기 #10799

welchs·2022년 1월 14일
0

알고리즘

목록 보기
9/44
post-thumbnail

설명

이전에 프로그래머스에서 풀어본 문제 유형(well-known이라고 해야하나..?)
너무 문제가 똑같고 풀이가 기억나서 그대로 풀었다.
레이저에 해당하는 ()부분을 다른 문자로 replace하고, 그 문자가 레이저라고 생각하고 answer에 값을 더해줬다.
값은 레이저를 만나면 지금까지 쌓은 스택만큼 answer를 더해주고, )를 만나면 answer에 1만큼만 더해줘서 계산해주면 된다.

C++은 마찬가지로 풀었지만 string replace 함수를 사용하지 않고, 현재 보고 있는 위치가 (이고 다음 위치가 )라면 레이저라고 생각하고 풀었다.

Node.js 풀이

const fs = require('fs');
const input = fs.readFileSync('/dev/stdin').toString();
// test
// const input = `(((()(()()))(())()))(()())`;

const solution = (input) => {
  let stack = 0;
  let answer = 0;
  const str = input.replace(/\(\)/g, '0');
  [...str].forEach((ch) => {
    if (ch === '0') {
      answer += stack;
    } else if (ch === '(') stack += 1;
    else if (ch === ')') {
      stack -= 1;
      answer += 1;
    }
  });
  return answer;
};

console.log(solution(input));

C++ 풀이

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    string data; cin >> data;
    int answer = 0;
    int stack = 0;
    for (int i=0; i<data.length(); i++) {
        if (data[i] == '(') {
            if (i+1 < data.length() && data[i+1] == ')') {
                // 레이저
                answer += stack;
                i+=1;
            } else {
                stack += 1;
            }
        } 
        else if (data[i] == ')') {
            stack -= 1;
            answer += 1;
        }
    }
    cout << answer << '\n';
    return 0;
}
profile
고수가 되고 싶은 조빱

0개의 댓글