프로그래머스 LV2 #4 쇠막대기
이 문제는 케이스별로 나눠서 생각해서 규칙을 만들면 쉽게 풀립니다.
케이스는 총 4개정도로 볼 수 있는데,
(
가 들어왔을 때((
가 들어왔을 때)
가 들어왔을 때()
가 들어왔을 때(
가 하나만 들어왔을 때는 기본적으로 아무런 일도 일어나지 않습니다. 그러나 ((
처럼 (
가 연속으로 2개가 들어올 때는 길든 짧든 쇠막대가 하나 생깁니다.)
가 들어왔을 때는 앞에 뭐가 나왔는지가 중요한데, 앞에 (
가 나온 상태에서 )
가 나온다면 레이저가 발사됩니다. )
가 나온상태에서 또 )
가 나오는 것은 그냥 쇠막대의 끝을 의미합니다.저는 괄호가 생성될 때 acc
라는 변수를 이용해서 (
가 나오면 acc = acc + 1
, )
가 나오면 acc = acc - 1
을 해주는 방식으로 괄호를 체크했습니다.
그리고 쇠막대가 생기면 최소한 1개의 쇠막대는 있는 것이므로 answer = answer + 1
과 같이 정답에 1을 더해주었고, 레이저가 쏘였을 때는 현재 쇠막대의 갯수만큼의 조각을 정답에 더해주어 쇠막대의 조각을 더해나갔습니다.
let solution = (arg) => {
let acc = 0;
let answer = 0;
arg.split("").map((a, i) => {
// "("가 들어올 때
if(a === "("){
acc = acc + 1;
// "("가 2번 연속 들어오면 쇠막대가 한 개 생김
if(arg[i-1] === "("){
answer = answer + 1;
}
// ")"가 들어올 때 (쇠막대의 끝 or 레이저 발사)
}else{
acc = acc - 1;
// "(" 뒤에 ")"가 들어오면 레이저 발사 -> 현재 쇠막대를 개수만큼 조각에 더함
if(arg[i-1] === "(" && a === ")"){
answer = answer + acc;
}
}
});
return answer;
}