[ Review ] 어려웠던 문제 복습하기

_dodo_hee·2021년 3월 22일
0

>wecode

목록 보기
2/7
post-thumbnail

Replit 풀면서 어려웠던 문제들을 다시 해석하면서 다시 다뤄보자
남들에게 술술 알려 줄 정도로 😇

for문

let count = 1;
for (let i = 0; i < 6; i++) {
  count = count + 1;
  console.log(count); // 2,3,4,5,6,7
}

console.log(count); // 7
  • for 문의 종료 조건(끝 값)을 i <= 5에서 i < 6 으로 변경하였습니다.
  • 코드에서 <=5 를 수정해서 직접 확인해보세요.
  • 6보다 작을때까지 실행하고 for 문이 끝나기 때문에,
  • i 가 0, 1, 2, 3, 4, 5일때만 실행하여 결국 for 문을 반복하는 횟수는 똑같습니다.

Assignment 📌

  1. findSmallestElement 함수를 구현해 주세요.
  2. findSmallestElementarr 인자는 숫자 값으로만 이루어진 배열입니다.
  3. arr 의 값들 중 가장 작은 값을 리턴 해주세요.
  4. 만일 arr 가 비어있으면 0을 리턴 해주세요.
  5. 예를 들어, 다음과 같은 배열이 인자(input)으로 들어왔다면 1이 리턴 되어야 합니다.
  6. [20, 200, 23, 1, 3, 9]

답안 💡

const arr = [20, 200, 23, 1, 3, 9];

function findSmallestElement(arr) {
  if (arr.length === 0) {
    return 0;
  } else {
    let min = arr[0];
    for (let i = 0; i < arr.length; i++) {
      if (arr[i] < min) {
        min = arr[i];
      }
    }
    return min;
  }
}

console.log(findSmallestElement(arr));

코드해석 🔍

findSmallestElement arr를 가져와라.
만약에 arr.length가 0과 같으면 0을 반환해라.
그렇지 않으면 min의 값은 arr[0] arr의 첫번째 인덱스값인데,
i는 0으로 초기화시켜, i의 값이 arr의 길이보다 작아? 맞으면 밑에 문장으로 내려가,
만약 arr[i]arr[0] 첫번째값보다 작으면 min 값을 재할당해 arr[i]
반복해서 비교가 끝나면 min값을 반환시켜줘.



배열 조작하기

let cities = [];
cities.push("경주", "전주");
cities.unshift("인천");

console.log(cities); //["인천","경주","전주"]

push() , unshift() 메소드는 배열에 요소를 추가해주는 함수이다.

둘의 차이는 요소들이 배열에 추가되는 위치가 다르다는 것 입니다.
push 는 배열의 마지막 부분, 즉 꼬리에 요소들을 추가하고,
unshift는 배열의 맨 앞부분, 즉 머리 부분에 요소를 추가합니다.
console.logcities 배열이 어떻게 나오는지 확인하고 넘어가주세요.

Assignment 📌

  1. divideArrayInHalf 함수는 array를 인자로 받습니다.
  2. array는 숫자 값으로 만 구성되어 있으며 총 5개의 요소(element)들로 구성되어 있습니다.
  3. divideArrayInHalf 함수는 인자로 들어온 array 로 부터
    새롭게 구성된 배열 result 을 리턴합니다.
  4. array 요소들 중 10과 같거나 작은 값의 요소들은 result의 맨 앞으로, 10보다 큰 값의 요소들은 result의 맨 뒤로 재구성된 배열을 리턴 해주세요.
  5. 재구성이 되는 순서는 array의 맨 뒤 요소부터 맨 앞 요소까지 입니다.
  6. 즉, 배열의 뒷 요소 부터 재구성을 진행해주세요.

답안 💡

function divideArrayInHalf(array){
  let result = []; 
  for(let i = array.length; i >= 0; i--){ 
    if (array[i]<=10){
     result.unshift(array[i])
    }else if(array[i] > 10){ 
    result.push(array[i])  
    }
  }    
   return result;
}
console.log(divideArrayInHalf([1, 20, 10, 5, 100])); 
// [ 1 , 10 , 5 , 100 , 20 ]

코드해석 🔍

divideArrayInHalf array를 가져와라.
result의 빈배열을 만들어준다.
i는 배열의 길이와 같다고 초기값을 만들어준다. i는 0보다 크거나 작아? 그럼 밑에 문장으로 내려가자
만약 array의 마지막 배열 100이 10보다 작거나 크니? 아니?
그럼 else if 문장으로 내려가 array[5]가 10보다 크니? 맞으면
빈배열에 array[5]=100을 마지막배열에 집어넣어.
그리고 반복시키고 반복이 끝나면 result 값을 반환해.

💁‍♀️ 내가 궁금했던 점 💁‍♀️
Q : 왜 출력값이 순서대로 배열이 되지 않았을까?
A : 애초에 배열을 가져오는 순서가 뒤죽박죽이라 가져오는 순서대로 push,unshift 해줘서 그런것.



날짜와 시간

llet rightNow = new Date();
let year = rightNow.getFullYear();
let month = rightNow.getMonth()+1;
let date = rightNow.getDate();

console.log(rightNow); // Mon Mar 22 2021 15:51:36 GMT + 0900 (대한민국 표준시)
console.log(year) // 2021년
console.log(month) // 3
console.log(date) // 22

🖐 주의 🖐

getMonth 메서드는, 현재 달보다 1 작은 값을 반환 하므로 주의해주세요.

let month = rightNow.getMonth(); // 2

Assignment 📌

  1. 이 함수는 birthday 라는 인자를 받습니다.
  2. birthdayDate 객체 입니다. birthday 라는 인자를 넣었을 때, 현재를 기준으로 만으로 계산한 나이를 리턴 해주세요.
  3. birthday 는 string이 아닌 Date 객체라는 걸 명심하세요 :)

답안 💡

function getWesternAge(birthday) {

  let birth = new Date(birthday);
  let rightNow = new Date();
  let age = rightNow.getFullYear() - birth.getFullYear();
  
  let birthMonth = birth.getMonth();
  let thisMonth = rightNow.getMonth();

  let birthDate = birth.getDate();
  let thisDate = rightNow.getDate();
  
  if (birthMonth < thisMonth) {
    return age; 
  } else if (birthMonth > thisMonth) {
    return age -1;
  } else {
    if (birthDate < thisDate) {
      return age;
    } else {
      return age -1;
    }
  }
}

console.log(getWesternAge(1996,10,01));

코드해석 🔍

getWesternAge(birthday) 함수를 실행시키고
날짜,년도,월,일 각각 생일과 현재날짜를 가져온다.
age는 현재날짜에서 해당년도(2021) - 생일년도(1996)를 가져온다.

만약 현재 월이 더 크면 25살을 반환하고
아니면 현재 월이 더 작으면 24을 반환해라
그것도 아니라면 (동일하다면) 만약 현재 일이 더 크면 25살을 반환하고,
그게 아니라면 24살을 반환해라.



Object

객체는 중괄호{}로 감싸져있다.
콜론으로 구분되어있고 키 : value(값)으로 선언되있는 프로퍼티로 구성되어있다.

# 객체 만들때의 규칙

  • property 이름은 중복될 수 없다.
  • property 이름과 property값 사이에 : (콜론)으로 구분한다.
  • property를 추가할 때는 , (쉼표)를 붙여준다.
  • property 값에는 어느 type이나 가능하다(string, number, array, object, function..)

# 객체에 접근하고 싶을때

  • 마침표(.) 연산자를 사용
  • 대괄호([])를 사용. 프로퍼티 명은 쌍따옴표("")와 함께 대괄호 안에 작성합니다.

# 객체 접근 방법 중 . 과 [] 의 차이

대괄호[] 안에는 변수가 들어갈 수 있음.

Assignment 📌

  1. 왜 각각 세 개의 배열을 하나의 객체로 구조를 바꿔야 할까요?
  2. 위의 배열에서 4월 1일에 판매량, 리뷰수, 좋아요 수를 확인하려면 세 개의 배열을 각각 for문으로 반복해서 날짜를 확인해야 하므로 좋은 구조의 데이터라고 할 수 없습니다. (날짜가 365일이라고 하면, 세 개의 배열이 각자 365번 돌아야 하니까요)
  3. 그래서 세 개의 배열을 사용하기 좋게 객체로 바꿀 것입니다. 객체는 프로퍼티명으로 바로 접근 가능하니까, 날짜만 알면 반복 문을 돌지 않아도 바로 데이터를 얻을 수 있습니다. 그래서 객체의 형태로 데이터 구조를 바꾸려는 것입니다.
  4. 다음 요구사항을 충족하는 객체를 만들어서 return 해주세요.
  5. 리턴되는 객체가 갖고 있는 property는 3개 입니다.
    1. sumAmount : 총 판매량
    2. sumReview : 총 리뷰개수
    3. sumLike : 총 좋아요수

답안 💡

function getData(salesArr,reviewArr,likeArr){
  sumAmount = 0;
  sumReview = 0;
  sumLike = 0;

  for(let i = 0; i < salesArr.length; i++) {
      sumAmount += salesArr[i][1]; 
    }
  for(let i = 0; i < reviewArr.length; i++) {
      sumReview += reviewArr[i][1];
    }
  for(let i = 0; i < likeArr.length; i++) {
      sumLike += likeArr[i][1];
    }
    
  let objData = { 
    sumAmount: sumAmount,
    sumReview: sumReview,
    sumLike: sumLike,
  };
  return objData;
}

코드해석 🔍

getData 함수에는 salesArr,reviewArr,likeArr의 값을 가져온다.
총 판매량,총 리뷰개수,총 좋아요수의 변수를 만들어준다.
그리고 개별적으로 반복시켜준다.
총판매량 반복문 : i는 0으로 초기화; i가 salesArr.length보다 작니? 그럼 다음문장으로 넘어가

const salesArr = [
  ["20190401", 34],
  ["20190402", 23],
  ["20190403", 29]
];
const reviewArr = [
  ["20190328", 3],
  ["20190401", 0],
  ["20190403", 1]
];
const likeArr = [
  ["20190328", 98],
  ["20190401", 102],
  ["20190403", 125]
];

이렇게 코드가 있다고 가정했을때,
sumAmount += salesArr[i][1]
현재 i가 0이니까 0번째 인덱스안에있는 1번째 인덱스값을 가져오면 34가 된다.
그리고 계속 반복하면서 sumAmount값에 더해준다.
총판매량,총리뷰수,총좋아요수 모두 같은 방법으로 계산해준다.
그리고 objData라는 객체 데이터에 값을 넣어주고 objData값을 반환시킨다.

profile
무럭무럭 자라나는 도도 개발성장일기

0개의 댓글