문제 : 쇠막대기
문제 설명
여러 개의 쇠막대기를 레이저로 절단하려고 한다. 효율적인 작업을 위해서 쇠막대기를 아래에서 위로 겹쳐 놓고, 레이저를 위에서 수직으로 발사하여 쇠막대기들을 자른다. 쇠막대기와 레이저의 배치는 다음 조건을 만족한다.
• 쇠막대기는 자신보다 긴 쇠막대기 위에만 놓일 수 있다. - 쇠막대기를 다른 쇠막대기 위에 놓는 경우 완전히 포함되도록 놓되, 끝점은 겹치지 않도록 놓는다.
• 각 쇠막대기를 자르는 레이저는 적어도 하나 존재한다.
• 레이저는 어떤 쇠막대기의 양 끝점과도 겹치지 않는다.
아래 그림은 위 조건을 만족하는 예를 보여준다. 수평으로 그려진 굵은 실선은 쇠막대기이고, 점은 레이저의 위치, 수직으로 그려진 점선 화살표는 레이저의 발사 방향이다.
이러한 레이저와 쇠막대기의 배치는 다음과 같이 괄호를 이용하여 왼쪽부터 순서대로 표현할 수 있다.
- 레이저는 여는 괄호와 닫는 괄호의 인접한 쌍 ‘( ) ’ 으로 표현된다. 또한, 모든 ‘( ) ’는 반
드시 레이저를 표현한다. - 쇠막대기의 왼쪽 끝은 여는 괄호 ‘ ( ’ 로, 오른쪽 끝은 닫힌 괄호 ‘) ’ 로 표현된다.
위 예의 괄호 표현은 그림 위에 주어져 있다.
쇠막대기는 레이저에 의해 몇 개의 조각으로 잘려지는데, 위 예에서 가장 위에 있는 두 개의 쇠막대기는 각각 3개와 2개의 조각으로 잘려지고, 이와 같은 방식으로 주어진 쇠막대기들은 총 17개의 조각으로 잘려진다.
쇠막대기와 레이저의 배치를 나타내는 괄호 표현이 주어졌을 때, 잘려진 쇠막대기 조각의 총
개수를 구하는 프로그램을 작성하시오.
내코드
function solution(s) {
let answer = 0;
let stack = [];
// 레이저 구분을 위한 정규식 처리하여 '()' 문자는 실질적으로 레이저를 의미하게 '|' 문자로 변경
let regex = /\(\)/g;
let processedS = s.replaceAll(regex, "|");
console.log("전처리된 문자열: ", processedS);
// 문자열 만큼 순회
for (const word of processedS) {
if (word === "|") answer += stack.length;
if (word === "(") stack.push(word);
if (word === ")") {
stack.pop();
answer++;
}
}
return answer;
}
let a = "()(((()())(())()))(())"; // 17
let b = "(((()(()()))(())()))(()())"; // 24
console.log(solution(a));
console.log(solution(b));
풀이
아이디어
'(' 문자는 쇠막대기 하나가 레이저 아래 위치한것을 의미하고 ')' 문자는 쇠막대기의 끝 부분을 의미한다. 즉 '(' 문자의 갯수가 겹쳐진 쇠막대기의 수량과 같음을 의미한다 마찬가지로 ')' 문자가 들어온경우 '(' 문자를 삭제해 겹쳐진 쇠막대기의 수량을 알 수 있다.
'|' 문자는 겹쳐진 쇠막대기를 절단하는 레이저를 의미하고 잘릴때마다 겹쳐있는 쇠막대기의 수량만큼(stack.length) 쇠막대기 조각이 생긴다.
')' 문자가 들어온경우 막대가 더이상 짤리지 않을 것을 의미하고 남은 막대자체가 마지막 쇠막대기 한조각으로써 추가 된다.
- 괄호로 이루어진 문자열을 쉽게 구분하기 위해 정규식울 통해 레이저를 의미하는 '()' 문자열을 '|' 문자로 전체 문자열을 변경
- 전체 문자열을 순회하면서 현재 문자가 '(' 문자는 쇠막대기 하나가 레이저 아래 위치한것을 의미해 쇠막대기 갯수를 의미하는 stack 에 push 해 저장
- 현재 문자가 '|' 문자인 경우 레이저로 겹쳐진 쇠막대기를 잘라 겹쳐진 만큼 조각이 생김을 의미하므로 answer 변수 에 반영
- 현재 문자가 ')' 문자인 경우 한개의 막대가 더이상 짤리지 않을 것을 의미하고 남은 막대자체가 마지막 쇠막대기 한조각으로써 answer 변수를 1 증가 한다.
참고
'코딩 테스트 문제 및 풀이' 카테고리의 다른 글
[JS] 코딩 테스트 문제 : 교육과정 설계 [큐] (0) | 2024.01.08 |
---|---|
[JS] 코딩 테스트 문제 : 공주 구하기 [큐] (0) | 2024.01.08 |
[JS] 코딩 테스트 문제 : 후위식 연산(postfix) [스택] (0) | 2024.01.04 |
[JS] 코딩 테스트 문제 : 크레인 인형뽑기(카카오 기출) [스택] (0) | 2024.01.04 |
[JS] 코딩 테스트 문제 : 괄호 문자 제거 [스택] (0) | 2024.01.04 |