과제 03
https://github.com/wooahan-agile/coding-test-study-3term/pull/37
문자열 다루기 기본
https://programmers.co.kr/learn/courses/30/lessons/12918
- 정규표현식 사용
- Number()를 이용하려 했으나 Number() 사용 시 e도 지수로서 숫자로 변환이 가능하기 때문에 테스트를 통과하지 못했다. 추가적으로 조건을 더 붙이려고 했지만 코드가 점점 더러워지는 것을 보고 멘토의 도움을 받아 접근 방식을 정규표현식으로 바꾸어 풀었다.
function solution(s) {
const check = /[^0-9]/g;
return (s.length === 4 || s.length === 6) && !check.test(s) ? true : false;
}
리뷰
- 정규 표현식 활용 굿
- 변수 선언한 후에 for문이나 다른 기능을 하는 코드가 있다면 공백 한 줄 주기
수정 코드
function solution(s) {
const check = /[^0-9]/g;
return (s.length === 4 || s.length === 6) && !check.test(s) ? true : false;
}
자릿수 더하기
https://programmers.co.kr/learn/courses/30/lessons/12931
function solution(n) {
const strN = String(n);
let answer = 0;
for (let i = 0; i < strN.length; i++) {
answer += Number(strN[i]);
}
return answer;
}
리뷰
- 변수 선언한 후에 for문이나 다른 기능을 하는 코드가 있다면 공백 한 줄 주기
수정 코드
function solution(n) {
const stringN = String(n);
let answer = 0;
for (let i in stringN) {
answer += Number(stringN[i]);
}
return answer;
}
- 다른 문제에서 for in문 리뷰를 받아서 수정해보았다.
K번째수
https://programmers.co.kr/learn/courses/30/lessons/42748
function solution(array, commands) {
let answer = [];
let sliceSortArr = [];
for (let i = 0; i < commands.length; i++) {
sliceSortArr = array
.slice(commands[i][0] - 1, commands[i][1])
.sort((a, b) => {
return a - b;
});
answer.push(sliceSortArr[commands[i][2] - 1]);
}
return answer;
}
리뷰
- 배열 자체가 재할당되는 일이 없다면 const로 선언하기
- 변수 선언한 후에 for문이나 다른 기능을 하는 코드가 있다면 공백 한 줄 주기
- for in 문 사용해보기
- 화살표 함수에서 하나의 식만 있을 경우 return 생략 가능!
수정 코드
function solution(array, commands) {
const answer = [];
let sliceSortArr = [];
for (let i in commands) {
sliceSortArr = array
.slice(commands[i][0] - 1, commands[i][1])
.sort((a, b) => a - b);
answer.push(sliceSortArr[commands[i][2] - 1]);
}
return answer;
}
두 개 뽑아서 더하기
https://programmers.co.kr/learn/courses/30/lessons/68644
function solution(numbers) {
let answer = [];
let uniqueAnswer = [];
for (let i = 0; i < numbers.length - 1; i++) {
for (let j = i + 1; j < numbers.length; j++) {
answer.push(numbers[i] + numbers[j]);
}
}
answer = answer.sort((a, b) => {
return a - b;
});
uniqueAnswer = answer.filter((element, index) => {
return answer.indexOf(element) === index;
});
return uniqueAnswer;
}
리뷰
- 배열 자체가 재할당되는 일이 없다면 const로 선언하기
- 화살표 함수에서 식이 하나라면 return 생략 가능!
- 메서드를 이어서 사용할 수 있는 메서드 체이닝 방식 이용하기 ⇒ uniqueAnswer 배열 필요 없어짐
수정 코드
function solution(numbers) {
const answer = [];
for (let i = 0; i < numbers.length - 1; i++) {
for (let j = i + 1; j < numbers.length; j++) {
answer.push(numbers[i] + numbers[j]);
}
}
return answer
.sort((a, b) => a - b)
.filter((element, index) => answer.indexOf(element) === index);
}
TIL
Number()
- 문자열로 표현한 숫자를 숫자로 변환해주는 함수이다.
- 영어 e도 지수로서 숫자 변환이 가능하다.
정규표현식
- 특정 패턴의 문자열을 찾기 위한 표현 방식
- https://curryyou.tistory.com/234
indexOf()
- 포함하고 있는 문자의 첫번째 인덱스를 반환
- 만약 문자를 가지고 있지 않는다면 -1 반환
// 포함하고 있는 문자 찾을 때
const arrDays = ['월','화','수'];
const strDays = '월화수';
console.log(arrDays.indexOf('화')); // 1
console.log(strDays.indexOf('목')); // -1
filter()
- 특정 조건에 부합하는 배열의 모든 값을 배열 형태로 리턴
- SQL문의 where절 생각하면 됨
- IndexOf()와 같이 사용하면 중복되지 않은 값만 추출 가능
const n = [1,3,2,4,2,3];
const a = n.filter((element, index) => {
return n.indexOf(element) === index;
});
console.log(a); // [1,3,2,4]
코드 설명
return n.indexOf(element) === index;
// indexOf는 포함하고 있는 값의 첫번째 인덱스를 반환한다.
// n을 순회하면서 각 원소의 첫번째 인덱스가 n에서의 인덱스와 같은지 확인한다.
n.filter((element, index) => {}
// 필터를 통해 함수를 실행하고 true만 가져온다.
// 그렇기 때문에 a를 출력하면 중복된 값이 제거되고 [1,3,2,4]가 나온다.
// 1, 3, 2, 4는 중복되지 않은 첫번째 값이므로 각각 인덱스가 0, 1, 2, 3이 되고
// 1, 3, 2, 4 뒤에 나오는 2, 3은 중복된 값이므로 indexOf를 거치면
// 현재 인덱스 값이 아닌 첫번째 값을 가져와 2, 1이 된다.
// 이를 현재 인덱스 값과 비교하면 4, 5이므로 다른 값이 되기 때문에 false를 반환하고
// filter()를 통해 true 값만 가져오므로 추출대상에서 제외된다.
sort()
- 파라미터로 정렬 순서를 정의하는 함수를 넣지 않는다면 유니코드순으로 정렬된다는 점 잊지 말자!
// 오름차순
sort((a, b) => a - b);
// 내림차순
sort((a, b) => b - a);
메서드 체이닝
- 메서드가 객체를 반환하게 되면 메서드의 반환 값인 객체를 통해 또 다른 함수를 호출할 수 있다.
- 이러한 프로그래밍 패턴을 매서드 체이닝이라 부른다.
- https://velog.io/@seungsang00/JavaScript-Method-Chaining
화살표 함수
- 함수 안에서 하나의 식으로 return하는 경우 return 생략 가능
const add1 = (a, b) => {
return a + b;
};
console.log(add1(1, 2));
// 위 코드와 결과가 같다.
const add2 = (a, b) => a + b;
console.log(add2(1, 2));
null과 undefined의 차이
- null : 없다고, 고의적으로 설정한 값
- undefined : 설정하지 않았기 때문에, 없는 값
논리연산자의 연산 순서
- NOT → AND → OR
==와 ===의 차이
- ==는 타입 검사를 하지 않는다.
- == 사용 시 숫자 1과 문자열 '1'은 동일한 값
- == 사용 시 0과 false는 동일한 값
- == 사용 시 undefined와 null은 같은 값
- 결론 : ==가 아니라 ===를 사용하자!
Lesson Learned
잘한 점
- filter()와 indexOf()를 같이 써서 중복된 값 제외하고 추출하는 코드를 이해하기 위해 오랜 시간 동안 붙잡았고, 결국에는 이해를 해서 어떤 과정을 통해 그런 결과가 나오는지를 정리할 수 있게 됐다!
아쉬운 점
- 메서드들이 파이썬과 비슷한 듯 달라서 할 때마다 찾느라 시간이 오래 걸렸다 ㅜ.ㅜ 머릿속에 얼른 다 들어왔음 좋겠다😭
배운 점
- 문자열에 여러 조건을 써야 한다면 정규표현식을 사용하는 것이 훨 간편하다는 것을 알게 되었다! 많은 조건을 달았어야 해서 코드가 전체적으로 너무 지저분해졌는데 정규표현식을 이용하니 코드가 너무 간편해졌다,,
- 과제 중 두 개 뽑아서 더하기 문제 푸는데 메서드를 연결하고 싶었으나 식이 한 줄이 아니라 이을 수 없을 거라 생각했었다. 근데 웬걸 화살표 함수에서 식이 하나라면 return을 없애고 한 줄로 쓸 수 있다니...! 문제를 풀 수록 재밌는 것을 많이 알아간다😆
'Modern Agile > TIL' 카테고리의 다른 글
Day 06 - 2021.12.13 (0) | 2021.12.13 |
---|---|
Day 05 - 2021.12.10 (0) | 2021.12.10 |
Day 04 Tech Talk Day🎤 - 2021.12.09 (2) | 2021.12.09 |
Day 02 - 2021.12.07 (0) | 2021.12.07 |
Day 01 - 2021.12.06 (1) | 2021.12.06 |