컨트롤 제트(Javascript)

·2022년 10월 20일
1
post-thumbnail

숫자들이 공백으로 구분된 문자열이 주어집니다. 문자열에 있는 숫자를 차례대로 더하려고 합니다. 이 때 “Z”가 나오면 바로 전에 더했던 숫자를 뺀다는 뜻입니다. 숫자와 “Z”로 이루어진 문자열 s가 주어질 때, 머쓱이가 구한 값을 return 하도록 solution 함수를 완성해보세요.

제한사항

  • < s의 길이 < 1,000
  • -1,000 < s의 원소 중 숫자 < 1,000
  • s는 숫자, "Z", 공백으로 이루어져 있습니다.
  • s에 있는 숫자와 "Z"는 서로 공백으로 구분됩니다.
  • 연속된 공백은 주어지지 않습니다.
  • 0을 제외하고는 0으로 시작하는 숫자는 없습니다.
  • s의 시작과 끝에는 공백이 없습니다.
  • 모든 숫자를 지우는 경우는 주어지지 않습니다.
  • 지울 숫자가 없는 상태에서 "Z"는 무시합니다.

입출력 예

sresult
"1 2 Z 3"4
"10 20 30 40"100
"10 Z 20 Z 1"1

입출력 예 설명

입출력 예 #1

  • 본문과 동일합니다.

입출력 예 #2

  • 10 + 20 + 30 + 40 = 100을 return 합니다.

입출력 예 #3

  • "10 Z 20 Z 1"에서 10 다음 Z, 20 다음 Z로 10, 20이 지워지고 1만 더하여 1을 return 합니다.

나의 풀이

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는 이전의 합이므로 이미 숫자형으로 바뀌었기 때문에 굳이 앞에 +를 붙여 숫자형으로 바꿀 필요가 없다.

profile
전 이것도 몰라요

0개의 댓글