-
문제
접근법
필자는 큰 조건을 " ( " 인 경우와 ")" 인 경우로 나누었다.
[1] 첫 번째 조건
"("가 들어 온 경우는, stack 에 이것을 push하여 저장함으로써 몇개의 쇠막대기가 있는지 유추 할 수 있도록 만든다.
[2] 두 번째 조건
")" 가 들어 온 경우에는 세부조건을 추가적으로 걸어서 위의 문제를 해결하면 된다.
(2-1) 세부조건 1
) 이라는 입력 값을 받기 전에 "("가 있는 경우인데, 이를 이해하기 쉽도록 풀어서 설명하자면, 레이저로 잘랐을 때 (= () ) 를 의미한다.
그리하여 ( 를 pop 하고 이전에 쌓인 ((( 의 개수 즉 길이를 알아내면 레이저로 잘랐을 때 우리가 얻을 수 있는 막대기의 수를 알 수 있다.
이를 통해, () 만 있는 경우는 이전에 들어와있던 값이 없었기에, 레이저만 있다는걸로 유추가 가능하고 결과적으로 카운트가 증가 하지 않음.
(2-2) 세부조건 2
(()) 와 같은 막대기를 레이저로 한번 커팅하면 2개의 막대기가 나온다.
하지만 위의 세부조건을 따르게 되면 (() 일 때, 카운트를 1 올리고 나머지 내용이 모두 없어지기에 )만 남는 현상이 나오는데 이러한 문제를 해결 하기 위한 예외조건으로 설정 해두었다.
코드
const input = require("fs").readFileSync("/dev/stdin").toString().split("\n"); const bar = input[0]; let answer = 0; let stack = []; for (let i = 0; i < bar.length; i++) { if (bar[i] === "(") { stack.push(bar[i]); } else { // () 과 같이 된 경우에는 자를 철근이 없다는 것을 의미한다. // 그리하여 ) 인 상태에서 자신의 전에 (가 있었어도 stack은 비어있기에 0이 증가한다. if (bar[i - 1] === "(") { stack.pop(); answer += stack.length; } else { stack.pop(); answer += 1; } } } console.log(answer);
문제를 풀면서 배우고 느낀 점
이전에 문자열을 검사 하는 방법 중에, ( a of string) 이라는 방법을 알아냈다.
그리하여, 본 문제에서도 그러한 루프를 적용 하려고 했는데, i 일 때 i-1인 경우를 체크 하는 경우에서는 사용하기가 어렵다는 점을 알 수 있었다.
'PS > 백준' 카테고리의 다른 글
[백준_DP] 11052 카드 구매하기 ( by using javascript ) (0) 2021.04.14 [백준_1934] 최소공배수 (by using javascript) (0) 2021.04.05 [ 백준_17413 ] 단어 뒤집기 2 ( by using Javascript ) (0) 2021.04.01 [백준_1874] 스택수열 (0) 2021.03.31 [백준] 1260 DFS와 BFS (0) 2021.03.23 댓글