이전에 프로그래머스에서 풀어본 문제 유형(well-known이라고 해야하나..?)
너무 문제가 똑같고 풀이가 기억나서 그대로 풀었다.
레이저에 해당하는 ()
부분을 다른 문자로 replace하고, 그 문자가 레이저라고 생각하고 answer에 값을 더해줬다.
값은 레이저를 만나면 지금까지 쌓은 스택만큼 answer를 더해주고, )
를 만나면 answer에 1만큼만 더해줘서 계산해주면 된다.
C++은 마찬가지로 풀었지만 string replace 함수를 사용하지 않고, 현재 보고 있는 위치가 (
이고 다음 위치가 )
라면 레이저라고 생각하고 풀었다.
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));
#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;
}