221214_TIL

reggias·2022년 12월 14일
0

I learned

목록 보기
18/62
post-custom-banner

오늘 한 일

  • 오늘부터 TIL쓸때 오답노트를 하나 이상 작성하려한다. 이것은 문법에 익숙해지기위한 나의 노력이다!
    • 형식은 아래와 같다.
    1. 문제
    2. 이 문제를 풀기위한 문법정리
    3. 내가 생각해본 의사코드
    4. 답지안보고 써본 리얼코드
    • 문법이 익숙해지면 나중에 2번을 마지막에 둘 예정이다.
  • 특강 느낀점
    • 질문하는 방법에 대하여
    • 에러 메세지 복붙보다 메세지 읽고 고민하고 고민의 흔적을 글로 남기자
    • run by doing 행하면서 배우자
    • 알고있는 것보다 해보았다를
    • 공유 잘되는 문화권의 글을 많이 읽기
    • 개발자가 되었더니 슬라임이 되었던 건에 대하여

내일 할 일

  • 강의를 거꾸로 들어서 입문을 새로 들어야한다...

오답노트

문제1

personArray의 나이 평균을 구해주는 Arrow Function을 작성해봅시다.

const personArray = [
  { name: "John Doe", age: 20 },
  { name: "Jane Doe", age: 19 },
  { name: "Fred Doe", age: 32 },
  { name: "Chris Doe", age: 45 },
  { name: "Layla Doe", age: 37 },
];

// 
const getAgeAverage = (personArray) => {};

console.log(getAgeAverage(personArray));

필요한 문법

// 일반 익명 함수 표현식
const sum = function(a, b) {
  return a + b;
};

// 화살표 함수 표현식1
const sum = (a, b) => {
	return a + b;
};

// 화살표 함수 표현식2
const sum = (a, b) => a + b;

// 화살표 함수 표현식3
const hello = a => {
	return a;
};
hello('hi'); // hi

의사코드

  1. 나이를 평균으로 하는거니까 일단 다 더하고 총 개수를 나누면 됨.
  2. 합계를 위한 변수를 만들고
  3. 평균을 위한 변수를 만듬
    딕셔너리의 키값을 가져오려면 변수명.키명을 써야한다.
    또한 총 개수를 찾기위해 .length를 사용해야함

내가 써본 리얼코드

const sum = (a, b) => a + b;
const getAgeAverage = (people.age) => { return sum(people.age)/(personArray.length) };
// 하다가 모르겠어서 쓰다말았다...

답안

const personArray = [
  { name: "John Doe", age: 20 },
  { name: "Jane Doe", age: 19 },
  { name: "Fred Doe", age: 32 },
  { name: "Chris Doe", age: 45 },
  { name: "Layla Doe", age: 37 },
];

const getAgeAverage = () => {
	let sum = 0;
	for (let person of personArray) {
		sum = sum + person["age"];
	}
	const average = sum / personArray.length;

	return average;
}

console.log(getAgeAverage(personArray)); // 30.6

비교

  • 화살표 함수 표현식1을 사용한 것 같다.
    ()는 function() 이다. 화살표 함수는 최대한 한줄로만 끝나는 줄 알았는데 그게 아니었다.
  • 의사코드에서 합계를 위한 변수를 만들고 평균을 구하는 함수를 짠다는 것은 얼추 맞춘 것같은데 코드가 이상하다 내가 만든 sum을 따로 빼서 실행시켜보니
    [object Object],[object Object],[object Object],[object Object],[object Object]undefined
    이렇게 나온다. 배열 안의 딕셔너리로 된 키값을 빼올때는 이제부터 반복문을 활용하자.
  • 잘한 점은 .length로 총 개수를 구하려고 했다는 점이다.

문제2

생년월일을 입력받아 만 나이 계산하는 함수 작성해보자

function getAge(dateOfBirth) {
  // 코드 작성
}

console.log(getAge('1993-12-14 16:27:00'));
// Print: 29

필요한 문법

// Date() 생성자
const date1 = new Date('December 17, 1995 03:24:00');
// Sun Dec 17 1995 03:24:00 GMT...


// Date.prototype.getFullYear()
// 주어진 날짜의 현지 시간 기준 연도를 반환
const moonLanding = new Date('July 20, 69 00:20:18');

console.log(moonLanding.getFullYear());
// expected output: 1969


// Date.prototype.getMonth()
// Date 객체의 월 값을 현지 시간에 맞춰 반환합니다. 월은 0부터 시작함.
const moonLanding = new Date('July 20, 69 00:20:18');

console.log(moonLanding.getMonth()); // (January gives 0)
// expected output: 6


// Date.prototype.getDate()
// 주어진 날짜의 현지 시간 기준 일을 반환
const birthday = new Date('August 19, 1975 23:15:30');
const date1 = birthday.getDate();

console.log(date1);
// expected output: 19

의사코드

  1. 생년월일을 입력하면 연도, 월, 일로 나누어 현재 년월일과 비교해야함
  2. 그러니 현재 날짜들의 변수를 만들어 cur 을 붙인다. 현재라는 뜻!
  3. 조건문을 이용해 현재 연도에서 입력받은 생년을 빼면 현재 나이가 된다.
  4. 하지만 만나이는 연도가 아닌 생일이 지났나 안지났나 기준이므로 현재 월과 생월을 비교하고 같거나 현재 월이 더 크면 생일이 지났거나 생일 당일이므로 현재 나이를 그대로 가지고 간다.
  5. 현재 월이 더 작다면 당연히 생일이 지나지않았으므로 나이에 -1 을 한다.
  6. 현재 월과 생월이 같을 경우 일자도 비교하여 같은 형식으로 간다.
  7. 주의할 점은 getmonth()는 0부터 시작하므로 1을 더해주어야한다.

내가 써본 리얼코드

function getAge(dateOfBirth) {
    const CurDate = new Date(Date())
    const CurYear = CurDate.getFullYear()
    const CurMonth = CurDate.getMonth() + 1
    const Curday = CurDate.getDate()

    let InputDate = new Date(dateOfBirth);
    
    let CurAge = CurYear - InputDate.getFullYear();
    
    if ( CurMonth > InputDate.getMonth() + 1 ) {
        CurAge = CurAge
    } else if ( (CurMonth == InputDate.getMonth() + 1 )
    && ( Curday >= InputDate.getDate() ) ) {
        CurAge = CurAge
    } else {
        CurAge = CurAge - 1
    }
    
    if (CurAge >= 0) {
      console.log(CurAge)
    } else {
      console.log('아직 태어나지 않았습니다.')
    }

    return 
  }
  
  console.log(getAge('1993-12-14 16:27:00'));
  // Print: 29

답안

function getAge(dateOfBirth) {
  const now = new Date();
  const birth = new Date(dateOfBirth);

  const age = now.getFullYear() - birth.getFullYear();
  const isBirthdayOver =
    now.getMonth() - birth.getMonth() >= 0 &&
    now.getDate() - birth.getDate() >= 0;

  if (isBirthdayOver) {
    return age;
  }

  return age - 1;
}

비교

  • 답안의 변수명이 아주 직관적이다. 현재 날짜를 now로 하고 입력받는 날짜가 태어난 날짜이니 birth로 하였다. 현재 나이는 age
  • 답안은 각각 현재 날짜와 태어난 날짜를 뺄샘으로 비교해서 간결한 코드가 되었다.
  • 내가 생각한 것을 코드로 구현해냈다는 점이 기쁘다.

문제3

20세 미만 출력하는 함수 작성해보자

function getChildren(persons) {
  // 코드 작성
}

const allPersons = [
  { name: "John Kim", age: 10 },
  { name: "Jane Doe", age: 20 },
  { name: "Fred Kang", age: 13 },
  { name: "Chris Doe", age: 39 },
  { name: "Layla Park", age: 19 },
];

console.log(getChildren(allPersons));
// Print: [
// 	{"name": "John Kim", "age": 10},
// 	{"name": "Fred Kang", "age": 13},
//  {"name": "Layla Park", "age": 19},
// ]

필요한 문법

// Array.prototype.filter()
// 주어진 함수의 테스트를 통과하는 모든 요소를 모아 새로운 배열로 반환
const words = ['spray', 'limit', 'elite', 'exuberant', 'destruction', 'present'];

const result = words.filter(word => word.length > 6);

console.log(result);
// expected output: Array ["exuberant", "destruction", "present"]

의사코드

  1. 배열 안에 딕셔너리가 5개 있음으로 반복문을 5번 돌려서 나이를 확인
  2. 조건문을 사용해서 20살 미만이면 이름을 출력하도록 한다. 아니면 continue
  3. 키밸류를 이용해야하니 for~of문과 length를 이용하자.

내가 써본 리얼코드

function getChildren(persons) {
    for (const person of persons) {
        if ( person.age < 20 ) {
            console.log(person);
        } else {
            continue
        }
    }
    return
  }
  
  const allPersons = [
    { name: "John Kim", age: 10 },
    { name: "Jane Doe", age: 20 },
    { name: "Fred Kang", age: 13 },
    { name: "Chris Doe", age: 39 },
    { name: "Layla Park", age: 19 },
  ];
  
  console.log(getChildren(allPersons));
// Print:
// { name: 'John Kim', age: 10 }
// { name: 'Fred Kang', age: 13 }
// { name: 'Layla Park', age: 19 }

답안

function getChildren(persons) {
  return persons.filter((person) => person.age < 20);
}

비교

  • 힌트에 있던 Array의 메서드를 이용하면 쉽다는 문구를 미처 보지못해서 이상한 방향으로 가고있었다. 그래도 생각하는 힘은 기른 것 같아서 좋긴한데 한 문제에 1시간이상이 들어가니 마음이 좀 조초해지네...
  • 출력시 배열이 아닌 딕셔너리만 남아서 어떻게 해야할지 몰랐으나 답안을 보고 filter 메서드를 검색해보니 새로운 배열로 만들어낸다고 한다.
profile
sparkle
post-custom-banner

0개의 댓글