배열, 배열의 반복, 배열 기초(Chapter)
코플릿 - 배열(Pair)
객체(Lesson)
배열, 객체(checkpoint)
코플릿 - 배열(Pair) / 객체(Object)
개인적으로 javascript에서 가장 중요한 부분이라고 생각하는 배열과 객체를 오늘 배웠으며,
이를 바탕으로 코플릿 및 checkpoint을 해결했었다.
Pair에게 배운 점
오늘의 코플릿을 함께한 Pair는 직접적인 답을 말하기 보다
(이전까지 Pair들에게 설명을 잘 못하여 답을 말했던 경험이 있었다. )
신중하게 내가 모르는 부분을 답에 이를수 있도록
어떻게 생각을 해야하는지 알려주었다.
Pair라면 저렇게 안내해 주는 것이 맞겠구나,
다음에 내가 누군가에게 무언가를 알려준다면 저런 태도를 가져야겠다라고 다짐을 했다.
오늘 코플릿을 진행하며 Pair에게 덕분에 배웠습니다라는 말을 참 많이 했었고,
글을 쓰고있는 지금도 또 마음이 감사하고 싶어서 디스코드로 메세지를 남겼다.
코플릿에서의 의미도출
자! 오늘중 많은 것을 느낀 코플릿 코드를 가져와서 하나하나 씹고 뜯고 맛보고 즐겨보겠다.
function 가장긴단어를추출해라(str) {
let neuArr = str.split(' ');
let head = neuArr[0];
for(let i = 1; i < neuArr.length; i++){
if(head.length < neuArr[i].length){
head = neuArr[i];
}
}return head;
}
//1. 문자열을 입력받아서 str.split(' ')을 통해 단어별로 나누어서 배열(neuArr)에 넣는다.
//2. 임의의 변수 head에 neuArr[0]을 할당한다.
//3. for문으로 배열의 각 요소들을 돌며 head.length보다 길다면 그 요소가 head에 할당되도록 한다.
// (i가 neuArr.length - 1까지 가면서 더 긴 요소가 있다면 head에 재할당을 해줄것이다.)
//4. for문이 끝난 후에 head를 리턴하자.
위 문제는 반복문에서도 나왔던 문제와 비슷했다.
어 이거 아는 문제인데?라고 말하며 임의의 변수에 neuArr[i]와 neuArr[i+1]을 비교하여 넣는 형식으로 논리를 짰음에도
결과를 도출할 수 없었다.
하지만 Pair가 임의의 변수에 미리 neuArr[0]을 넣고 반복문을 돌리자는 아이디어를 줬고
이에 해결할 수 있었다.
아차!오늘 풀다가 이거는 헷갈리기 쉽겠다라고 생각한 부분이있었다.
push, unshift는 요소를 추가하고 난뒤의 배열의 길이를 리턴하고,
pop, shift는 배열에서 빼는 요소를 리턴한다.
자 다음 문제로 가자.
function 휴대폰번호를만드시오(arr) {
if(arr === []){
return 0
}
if(arr.length === 8){ //8자리의 경우
return '(010)' + arr.slice(0, 4).join('') + '-' + arr.slice(4, 8).join('')
}else if(arr.length === 11 ){ // 11자리일 경우
return '(' + arr.slice(0, 3).join('') + ')' + arr.slice(3, 7).join('') + '-' + arr.slice(7, 11).join('')
}
}
//아래 코드는 문제 풀 때 당시의 pseudo code다.
//전화번호가 8자리일 경우 slice로 4자리씩 잘라내고
//그 4자리씩 잘라낸 2개를 .join('-')으로 각각 붙이고
//'010' + 더하기 하는 것이죠
생각보다 쉽게 풀었지만
풀면서도 이런 방식이 효율적이지는 않은 것 같다며 얘기를 했었다. ㅋㅋ
문제를 풀고나서 reference를 보고 머리를 맞은듯 멍했다.
function 휴대폰번호를만드시오(arr) {
let head = '(010)';
const len = arr.length;
const body = arr.slice(len - 8, len - 4).join('');
const tail = arr.slice(len - 4, len).join('');
if (len === 11) {
head = `(${arr.slice(0, 3).join('')})`;
}
return `${head}${body}-${tail}`;
}
전화번호가 11자리이든 8자리이든 body, tail의 부분을 공통적으로 공유하여 코드의 길이를 간결하게 하였고,
또 코드를 간결하게하는 와중에 length를 활용하여 변수 body, tail을 깔끔하게 만들어주었다.
그리고 전화번호가 11자리일 경우 앞의 세자리로 head를 재할당하여 이를 return하였는데,
보면 볼수록 배우고싶은 논리력이다.
대망의 배열 코플릿의 마지막 문제였다.
본인이 리드하여 풀었기에 자랑스럽다? 음... 엄밀히 얘기하자면
풀었다기엔 뭐하고 구글링을 통해 피보나치수열을 출력하는 코드에서 아이디어를 뽑아내어
내가 아는 for문에 내가 잘 녹여냈달까.
아이디어의 출처는 아래와 같다.
function 길이가num인피보나치배열을구하라(num) {
let n1 = 0, n2 = 1, nextTerm;
let arr =[n1, n2];
if(num === 0){
return [0];
}
for(nextTerm = n1 + n2; arr.length <= num; nextTerm = n1 + n2){
arr.push(nextTerm);
n1 = n2;
n2 = nextTerm;
}return arr;
}
//1. 피보나치수열의 시작인 0과 1을 각각 n1과 n2로 선언,할당한다.
//2. for문에서 nextTerm이라는 변수를 n1 + n2로 초기화시켜준다.
//3. arr의 길이가 num이 될 때까지라는 조건 식을 달아주고, 재할당 된 n1, n2로 nextTerm 증한다.
//4. arr.length가 num보다 작다면 nextTerm은 n1과 n2를 더하여 arr의 뒤에 넣어주고
//5. n1에는 기존의 n2를 그리고 n2는 기존의 nextTerm을 할당하여 nextTerm을 증가시킨다.
생각보다 문제가 쉬움에도 수학과 관련된 무언가를 보면 경직되는 부분이있는 것 같다.
천천히 살펴보면 규칙이 있고 구글센세가 미리 답을 내놓으셨기에 두려워 할 필요가 없다.
조금 더 부딪혀보자.
용기를 가져보자.
내일은 객체이다.
귀중한 양분이 될 코플릿을 잘 흡수하리라.
'코드스테이츠' 카테고리의 다른 글
2021년 4월 21일 코드스테이츠 DAY-17(Twittler 목업 만들기) + CSS (0) | 2021.04.21 |
---|---|
2021년 4월 20일 코드스테이츠 DAY-16(객체 코플릿) + twittler mock-up 계획(wireframe) + figma 사용법 숙지(인강) (0) | 2021.04.20 |
2021년 4월 16일 코드스테이츠 DAY-12(Git 기초) (0) | 2021.04.16 |
2021년 4월 15일 코드스테이츠 DAY-11(Linux 기초, Git 기초) (0) | 2021.04.15 |
2021년 4월 14일 코드스테이츠 DAY-10(Linux 기초) (0) | 2021.04.14 |