와우,,정말 갑작스러운 난이도 변화에.. 나의 머릿속은 하루 종일 요런 상태였다..
이렇게 갑자기 난이도를 올려버리는게 어딨냐구요,,,엉엉ㅠㅠㅠ그치만 나는 전공자인데 이정도로 어려운데 다른 분들은 오죽하겠나 싶어서 최대한 배웠던걸 기억해내면서 유어클래스 글자 하나하나를 꼼꼼히 읽었다.. 라이브 세션도 이렇게 열심히 들었던건 첨..(사실 앞전 라이브 세션은 아는 내용 + 풀이여서 안 들은경우가 많았다..) 4년 컴공의 짬으로 보면 어쨋든 계속 보다보면 이해된다는 거였다..그래서 정말 열심히 보고,,풀고,,했다..배웠던걸 간단하게! 아주 간단하게 정리해보고 가장 이해하기 어려웠던..reduce를 잘 정리해봐야겠다..하하..
map은 배열의 각 요소에 어떠한 함수를 적용시켜 나온 값들로 새로운 배열을 만드는 것이다. 어떠한 함수이기때문에 예를 들어 각 값들에 곱하거나 더하는 등등 이런 새로운 값들이 새로운 배열에 저장되는 것이다.
filter은 배열의 각 요소에 어떤 함수 적용시 'TRUE'를 리턴하는 값들로 새로운 배열을 만드는 것이다. 그러니까 filter는 참과 거짓으로 나뉘는 함수만 사용할수 있겠다!
(라이브세션+ 정리 덕에 요정도 정리된것,, 문제만 냅다 풀었을땐 이렇게 명쾌하게 정리되지 않았다.)
대망의 reduce...진짜 문제 풀땐 엥? 엥?하면서 reduce 문제는 정말 다 밑에 짤 처럼 푼거 같다.. 앞에 쉬운 문제 몇개 빼고,,
일단 가장 큰 문제점은 reduce의 acc와 cur을 제대로 파악하고 있지 않았다는 점이였다.. 이거때문에 오류난게 한두개가 아니구,,(당연히.. 제대로 모르고 냅다 풀면,, 그렇지..) reduce에는 전달인자가 acc,cur빼고도 2개정도 더 있는거 같지만 일단 오늘 배운 것과 풀었던 모든 문제들은 acc, cur 선에서 정리되었다..먼저 reduce는 배열의 각 요소가 어떤 함수에 의해서 하나의 값으로 응축되어 리턴되는 메소드이다.
일단 초기값을 줄 경우,
acc에 초기값이 들어간다...! cur엔 당연히 배열 0번째 인덱스 값이 들어간다.
예를 들어 이런 코드가 있을때
const sum = same.reduce(function(obj,cur){ return obj + cur.score },0);
'0'이라는 초기값을 줬기때문에 이것은 obj에 들어간다..이게 cur에 들어간다 생각해서 이 문제도 처음엔 return obj.score+cur 이렇게 하니까 자꾸 undifined가 떴다.. (이걸 풀겠다고,,강제형변환부터 이거저거 다하다가..미친척하고 cur에 score를 불러왔더니 됐다.. 그치만 왜 됐는지 모르고 그냥 일단 됐으니 넘어감..) 0은 obj에 들어가고 cur 객체의 score 값을 불러와서 계속 합산되는 함수이다.
만약에 초기값이 없다면?
acc에는 배열 0번째 인덱스 값이 cur엔 1번째 인덱스 값이 들어간다.
#이때 주의해야할것이 있는데 만약에 초기값이 없는데 빈배열이면 reduce가 돌아갈수가 없다는 에러가 뜬다. 이걸 방지해주기 위해서는 reduce가 돌기 전에 if문으로 걸러줘야한다.
관련된 문제를 풀었는데
function findShortestWord(arr) { // TODO: 여기에 코드를 작성합니다. const type_string = arr.filter(function(obj){ return typeof obj === "string" }); const min = type_string.reduce(function(acc,cur){ if(acc === ''){ return cur } else if(acc.length <= cur.length){ return acc } else{ return cur } },''); return min }
이문제인데 이게 제일 작은 배열의 길이를 뽑는 거라서 acc가 ' '이면 안된다. (reduce 빈칸일 경우 오류를 나타내기 때문에..) 그치만 풀땐 해결 방법이 생각이 안나서 안에다가 ' '이면 첫번째 인덱스 값을 넣게 만들었다.
이것을 라이브 세션 이후에 다시 풀었다.const result = arr.filter(obj => typeof obj === "string") if(result.length === 0) return '' return result.reduce((acc,cur) => { if(acc.length <= cur.length) return acc else return cur })
이렇게 위에 타입이 string인거 걸러주는 거 까지는 똑같고 reduce로 가기 전에 무조건 if문을 거치게 만들면 초기화 값을 주거나 그 값으로 인해서 벌어지는 에러까지 잡을 필요가 없게 된다.
리액트에서 정말 많이 사용한다고 한다. 이것을 고차 함수 이렇게 생각 하지 말고 배열 내장 메서드에는 map, filter, reduce가 있다는 것을 잊지 말자.
-concat은 두개의 문자열을 합쳐주는 메소드다.
이것을 이용하면 2차원 배열을 1차원으로 쫙 필수 있다!
ex)
const result = arr.reduce(function(acc,cur){
return acc.concat(cur)
});
-백팁을 사용하고 안에 문자를 넣고 싶으면 그냥 ${변수} 넣고 싶은 문자
이렇게 하면 된다.
최소 공배수를 구하고 싶을땐
num1 * num2 = 최대공약수 * 최소공배수; 를 이용해서 구하면 된다.
(num1*num2)/최대공약수 = 최소공배수 인데
그렇다면 최대 공약수는 어떻게 구할까..?
num1, num2 중에 작은 값만큼 도는 for문을 만들고 i로 두 수를 나눴을때 두개 다 나머지가 0인 i가 최대 공약수가 된다.
코드 예는 이렇다.
for(let i = 0; i < Math.min(num1,num2);i++){
if(num1 % i === 0 && num2 % i ===0){
최대공약수 = i;
}
}
확실히 적으니 다시 한번 공부되는 기분이다...내일도 화이팅!! 반딧불이 반은 아니지만,,궁금해서 들어가봤는데 거기에 이런 글이 있었다 "쓰레기라도 적자.."ㅎㅎㅎ물론 진짜 쓰레기를 적는다는 건 아니지만 어쨌든 블로깅에 대한 부담감이 크기 때문에 줄이기 위해서는 이 마인드 컨트롤이 좋은거 같다!