본문 바로가기
경일/Javascript

[문제풀이] 문자열 갖고 놀기..?

by dev_kong 2022. 1. 6.
728x90
728x90

문제설명

수업시간에 풀었던 문젠데 재밌게 풀어서 정리해 봄

 

1. string 변수에 할당된 문자열에 포함되어 있는 'e' 갯수 출력

2. string 변수에 할당된 문자열을 5개씩 나눠서 배열에 담아서 출력

3. 2의 결과에서 e, z, d, v, n이 포함된 value 삭제 후 출력

4. 3의 결과에서 value가 중복된 문자 / 숫자 가 있을 경우 중복된 문자 / 숫자 삭제(하나는 남김)

 

문제에서 제시한 예시와

각 문제에서 요구하는 출력값은 아래와 같다

let string = '1e5315166152e1152z1d1v4b1n';

// 2,
// [ '1e531', '51661', '52e11', '52z1d', '1v4b1', 'n' ],
// [ '51661' ],
// [ '516' ]

 

 

접근방법

다른 값으로 함수를 호출해도 적용 될 수 있도록 코드를 짰다.

그니까 문제에선 'e' 의 갯수를 구하라고 되있지만,

다른 값으로 바뀌어도 적용이 되게끔 코드를 짠거다.

 

각 문제의 답을 배열 하나에 집어넣어서 한번에 출력이 되도록 코드를 짰다.

 

let string = '1e5315166152e1152z1d1v4b1n';

//thirdAnswer filter에 사용될 함수
function rmVal(val) {
  const noNeedCharArr = ['e', 'z', 'd', 'v', 'n'];
  //val 배열의 값이 char를 포함하고 있으면 false를 리턴하고
  for (const char of noNeedCharArr) {
    if (val.includes(char) === true) return false;
  }
  //아니면 true 리턴
  return true;
}

function mkArr(str, cutIndex, char) {
  //모든 정답를 담을 배열
  const answers = [];
  // 1번 문제 답
  let firstAnswer = 0;
  // 2번 문제 답
  const secondAnswer = [];
  // 3번 문제 답
  let thirdAnswer = null;
  //4번 문제 답
  const lastAnswer = [];

  //firstAnswer
  //indexOf 메서드 를 이용해 검색할 값의 인덱스를 indexOfChar 에 할당 해줌
  let indexOfChar = str.indexOf(char);

  // indexOf는 문자열/배열에 해당 값이 없으면 -1 리턴함
  while (indexOfChar >= 0) {
    firstAnswer += 1;
    // indexOf 메서드의 두번째 인자는 검색을 시작할 index를 의미한다.
    indexOfChar = str.indexOf(char, indexOfChar + 1);
  }
  answers.push(firstAnswer);

  //second Answer
  //substr메서드의 첫번째 인자는 잘라내기를 시작할 인덱스를 의미하고
  //subst 메서드의 두번째 인자는 잘라내기 할 값의 갯수를 의미한다.
  for (let i = 0; i <= str.length / cutIndex; i++) {
    secondAnswer.push(str.substr(i * cutIndex, cutIndex));
  }
  answers.push(secondAnswer);

  //third Answer
  //filter에 밖으로 빼둔 rmVal 함수 사용
  //filter 메서드는 콜백합수의 값이 true가 되는 value만 담은 새로운 배열을 리턴한다.
  //즉, rmVal이 true를 리턴하는 값들로만 이루어진 배열을 만들어서 thirdAnswer에 재할당
  thirdAnswer = secondAnswer.filter((val) => rmVal(val));
  answers.push(thirdAnswer);

  //last Answer
  for (const str of thirdAnswer) {
    // split 메서드로 하나하나 끊어서 배열에 담아주고,
    // filter와 indexOf 중복된 문자값 제거
    // join으로 배열에 있는 value 들 하나로 합쳐서 문자열로 리턴
    // 위 세 메서드의 결과를 lastAnswer push
    lastAnswer.push(
      str
        .split('')
        .filter((v, i, t) => t.indexOf(v) === i)
        .join('')
    );
  }
  answers.push(lastAnswer);

  return answers;
}

console.log(mkArr(string, 5, 'e'));
//   [
//     2,
//     [ '1e531', '51661', '52e11', '52z1d', '1v4b1', 'n' ],
//     [ '51661' ],
//     [ '516' ]
//   ]

포스팅 할라고 주석을 많이 달다보니 지저분해 보이는데

주석 없으면 나름 깔끔하다.

 

설명해주실 때 forEach를 잘 쓸줄 알아야 한다고 하셨다.

이유는 남들이 많이 쓰기 때문, 남들이 짠 코드에 forEach가 있는데 내가 그 코드를 볼때

forEach 해석을 못하면 곤란하니까.

나도 forEach를 이해는 하고 있지만

개인적으로 forEach 보다 for 나 for of를 선호한다.

뭔가 더 직관적으로 생겨서 가독성이 좋은것 같은 느낌적 느낌.

그러다 보니 forEach를 잘 안쓰게 되고,

남들이 forEach 를 사용해 짠 코드를 볼때 해석이 좀 오래걸리는 느낌이 있었는데,

앞으론 forEach와 좀더 친해 져야겠다는 생각이 들었다.

 

728x90
728x90

댓글