본문 바로가기
프론트엔드로 가는 길/프로그래머스

48. 컨트롤 제트

by woody-j 2023. 4. 25.

https://school.programmers.co.kr/learn/courses/30/lessons/120853
[ 문제 설명 ]

 

프로그래머스

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

programmers.co.kr

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

[ 문제 풀이 ]

 

첫번째 풀이

function solution(s) {
  //idx배열
  let idxArray = [];
  // 문자열 배열로 만들기
  let sArray = s.split(" ");
  // 숫자만 포함한 배열로 만들기
  let sNumberArray = sArray.filter((item) => !isNaN(parseInt(item)) && !"");
  // 숫자와 z만 포함한 배열로 만들기
  let sNumberStringArray = sArray.filter((item) => item !== " ");
  //   z index값 찾기
  let idx = sNumberStringArray.indexOf("Z");
  while (idx != -1) {
    idxArray.push(idx);
    idx = sNumberStringArray.indexOf("Z", idx + 1);
  }
  //   z문자 전 숫자열 합산
  let zBeforeArray = idxArray.map((el) => sNumberStringArray[el - 1]);
  let sumZBefore = zBeforeArray.reduce((acc, cur) => Number(acc) + Number(cur),0);
  //숫자 합산
  let sumNumber = sNumberArray.reduce((acc, cur) => Number(acc) + Number(cur),0);
  return sumNumber - sumZBefore;
}

 

 

1. sNumberArray : filter로 sArray의 배열에서 숫자가 아닌 항목을 필터링

isNaN(value) 함수는 인자로 전달된 값(value)이 숫자인지 여부를 판단

 

parseInt(string, radix) 함수는 문자열(string)을 정수로 변환

 

2. sNumberStringArray : 숫자 + Z 포함 배열, 원소가 ""가 아니면 true

3. idx : sNumberStringArray에서 Z 문자 인덱스 찾기

4. let idxArray=[]: indexOf() 함수를 통해 이후 등장하는 Z문자를 찾기 위해서 idx+1로 갱신. whilie 루프를 통해 Z 문자의 모든 인덱스 저장

5. zBeforeArray : idxArray에 저장된 Z문자의 앞 숫자 추출해서 저장

6. sumNumber : 전체 숫자 배열 합산

7. sumZBefore : zBeforeArray 배열 숫자 합산

8. 전체 숫자 합산에서 Z문자 앞에 있는 숫자를 빼기

 

두번째 풀이

function solution(s) {
  let result = 0; // 결과를 저장할 변수 초기화
  let prevNum = 0; // 이전 숫자를 저장할 변수 초기화
  
  for (let i = 0; i < s.length; i++) {
    const char = s[i];
    
    if (!isNaN(char)) { // 문자가 숫자인 경우 (JavaScript에서는 isNaN 함수를 사용하여 숫자 여부를 판별)
      prevNum = prevNum * 10 + Number(char); // 현재 문자를 숫자로 변환하여 이전 숫자에 추가
    } else if (char === 'Z') { // 문자가 "Z"인 경우
      result -= prevNum; // 이전 숫자를 결과에서 빼기
      prevNum = 0; // 이전 숫자를 초기화
    } else { // 공백인 경우 (숫자와 "Z"를 구분하는 기준)
      result += prevNum; // 이전 숫자를 결과에 더하기
      prevNum = 0; // 이전 숫자를 초기화
    }
  }
  
  result += prevNum; // 마지막 숫자를 결과에 더하기 (문자열이 끝난 경우)
  
  return result;
}

'프론트엔드로 가는 길 > 프로그래머스' 카테고리의 다른 글

51. 문자열 내 p와 y의 개수  (0) 2023.04.29
49. 소인수분해  (0) 2023.04.26
47. 캐릭터의 좌표  (0) 2023.04.24
46. 로그인 성공  (1) 2023.04.21
45. 특이한 정렬  (1) 2023.04.20