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
'경일 > Javascript' 카테고리의 다른 글
[Javascript] 객체의 비교와 복사 (0) | 2022.01.07 |
---|---|
[Javascript] 메서드와 프로토타입 (0) | 2022.01.06 |
[Javascript] this 동적 바인딩 (0) | 2022.01.04 |
[문제풀이] 짱구의 마스크 소분 (0) | 2022.01.03 |
[Javascript]var, let, const 차이점 (0) | 2022.01.03 |
댓글