저장을 습관화
프로그래머스 LV.0 컨트롤 제트 본문
프로그래머스 LV.0 컨트롤 제트
https://school.programmers.co.kr/learn/courses/30/lessons/120853
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 과정을 통해 모두 더한다.
'코딩 테스트 > 프로그래머스 - 자바스크립트' 카테고리의 다른 글
프로그래머스 LV.0 문자열 묶기 (0) | 2023.09.28 |
---|---|
프로그래머스 LV.0 이진수 더하기 (0) | 2023.09.27 |
프로그래머스 LV.0 리스트 자르기 (0) | 2023.09.27 |
프로그래머스 LV.0 2의 영역 (0) | 2023.09.27 |
프로그래머스 LV.0 수열과 구간 쿼리 4 (0) | 2023.09.27 |