저장을 습관화

프로그래머스 LV.0 컨트롤 제트 본문

코딩 테스트/프로그래머스 - 자바스크립트

프로그래머스 LV.0 컨트롤 제트

ctrs 2023. 9. 27. 22:46

프로그래머스 LV.0 컨트롤 제트

https://school.programmers.co.kr/learn/courses/30/lessons/120853

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

1. 문제 명

컨트롤 제트


2. 문제 설명

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


3. 제한 사항

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


4. 예시

s result
"1 2 Z 3" 4
"10 20 30 40" 100
"10 Z 20 Z 1" 1
"10 Z 20 Z" 0
"-1 -2 -3 Z" -3


5. 기본 제공 코드

function solution(s) {
    var answer = 0;
    return answer;
}


6. 제출한 내 답

const solution = (s) => {
  return s
    .replaceAll(/-?\d+ Z\b/g, "")
    .split(" ")
    .reduce((a, b) => (a += Number(b)), 0);
};

// 테스트
console.log(solution("1 2 Z 3"));
console.log(solution("10 20 30 40"));
console.log(solution("10 Z 20 Z 1"));
console.log(solution("10 Z 20 Z"));
console.log(solution("-1 -2 -3 Z"));

 

6-2. VSC에 작성한 내용

const solution = (s) => {
  return s
    .replaceAll(/-?\d+ Z\b/g, "")
    .split(" ")
    .reduce((a, b) => (a += Number(b)), 0);
};

// 테스트
console.log(solution("1 2 Z 3"));
console.log(solution("10 20 30 40"));
console.log(solution("10 Z 20 Z 1"));
console.log(solution("10 Z 20 Z"));
console.log(solution("-1 -2 -3 Z"));


7. 특이사항

정규 표현식 '/-?\d+ Z\b/g'을 사용하여 "(숫자) Z"를 제거하는 과정 설명

1. "-?": '-'가 있을 수도 있고, 없을 수도 있음을 의미함. Z 앞에 오는 수가 음수일 경우를 위함

2. "\d": 숫자(digit)를 나타냄.

3. "+": 앞에 적힌 패턴, 즉 숫자가 하나 이상 반복됨을 의미함. -1000 < s의 원소 숫자 < 1000 

최대 3자리 숫자가 올 수 있음을 위함

4. " Z": 적힌 그대로 (공백)Z를 의미함

5. "\b": 단어(word) 경계를 나타냄. 여기서는 'Z'를 패턴의 끝으로 지정하기 위해서 사용됨

만약 요소가 "123 Zebra" 같은 경우에는 이를 replaceAll의 대상으로 해당되지 않음

6. "/g": 전역검색(global search). "(숫자) Z" 패턴이 2개 이상일 경우를 위함.

 


8. 다른 사람이 작성한 답

8-1. 가장 많이 쓰인 풀이법, pop

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);
}

 

8-2. 좋아요를 가장 많이 받은 풀이법, pop

function solution(s) {
    const stack = []

    s.split(' ').forEach((target) => {
        if(target === 'Z') stack.pop();
        else stack.push(+target)
    })

    return stack.length ? stack.reduce((pre, cur) => pre + cur) : 0;
}

매개변수 s를 " "를 기준으로 배열로 만든 후 모든 요소를 검사한다.

현재 요소가 'Z'가 아닐 경우, 요소를 미리 준비한 배열 arr 혹은 stack에 추가한다.

현재 요소가 'Z'일 경우, 배열 arr 혹은 stack을 pop 한다. 즉 가장 뒤에 있던 요소를 제거한다.

이후 배열 arr 혹은 stack을 reduce 과정을 통해 모두 더한다.