숫자들이 공백으로 구분된 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 “Z”가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 “Z”로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.
s | result |
---|---|
"1 2 Z 3" | 4 |
"10 20 30 40" | 100 |
"10 Z 20 Z 1" | 1 |
입출력 예 설명
입출력 예 #1
입출력 예 #2
입출력 예 #3
function solution(s) {
let arr = s.split(' ')
for(let i = 0; i < arr.length; i++){
if(arr[i] === 'Z'){
if(arr[i-1]){
arr.splice(i-1, 2);
i -= 2;
}
else{
arr.splice(i,1)
i--;
}
}
}
return arr.reduce((a,b) => a*1+b*1, 0);
}
스택 문제인것 같은데 pop()
과 push()
를 사용하라는 말이 이해가 안 되어서 splice()
를 써 주었다. splice()
는 인덱스를 찾아 배열을 잘라 주기 때문에 빈 공백이 생긴다. 따라서 for문의 순서에 문제가 생긴다. 그래서 2자리를 잘라주면 i도 2를, 1자리를 잘라 주면 i도 1을 줄여 순서를 보정해 주었다.
function solution(s) {
s = s.split(' ');
let arr = [];
for (let v of s) v === 'Z' ? arr.length ? arr.pop() : '' : arr.push(v);
return arr.reduce((a,v)=>a+ +v,0);
}
push()
와 pop()
을 쓰라는 말이 이해가 잘 안되었는데, 빈 배열에 값을 넣으면서 사용하라는 의미였다. 빈 배열에 값을 넣으니 뒤의 값이 Z라면 pop()
을 이용하여 직전 값을 빼줄 수 있다.
reduce()
에서 합을 구할 때는 내가 1을 곱한 것과 달리 a + +b
의 형태를 사용해 주었다. 값이 숫자가 아닐 때는 +를 붙이면 숫자형으로 쉽게 바꿀 수 있고 +를 연속해 주면 b의 값을 숫자로 바꾼 뒤 a와 더해 준다. 대신 연속된 + 중간에 공백을 삽입해 주어야 하는 듯 하다. a는 이전의 합이므로 이미 숫자형으로 바뀌었기 때문에 굳이 앞에 +를 붙여 숫자형으로 바꿀 필요가 없다.