[JS replit] Object 문제 풀이

이종민·2021년 6월 10일
0

Wecode Assignment

목록 보기
3/5
post-thumbnail

위코드 첫주차 자바스크립트 문제 중에 이 문제가 개인적으로 가장 난이도 있었던 문제라고 생각하기에 내 기억 저장 용도로 블로깅을 하였다.

❗️ Assignment

아래 설명을 읽고 getExamResult 함수를 구현하세요.

인자 scores 는 다음과 같은 객체입니다. 객체의 요소의 갯수 및 키의 이름들은 달라질 수 있습니다. 객체의 값은 다음 9가지 문자열 중에서 하나를 가지고 있습니다.

  • 'A+', 'A', 'B+', 'B', 'C+', 'C', 'D+', 'D', 'F'
{
  '생활속의회계': 'C',
  '논리적글쓰기': 'B',
  '독일문화의이해': 'B+',
  '기초수학': 'D+',
  '영어회화': 'C+',
  '인지발달심리학': 'A+',
}

인자 requiredClasses 는 다음과 같이 문자열로 된 배열입니다.

['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']

다음 조건을 만족하는 객체를 리턴하도록 함수를 구현해주세요.

  1. scores 객체가 가지고 있는 키들은 새로운 객체에 포함되어야 합니다. 단, 그 값들은 다음 원리에 따라 숫자로 바뀌어 할당되어야 합니다.

    • A+ => 4.5
    • A => 4
    • B+ => 3.5
    • B => 3
    • C+ => 2.5
    • C => 2
    • D+ => 1.5
    • D => 1
    • F => 0
  2. requiredClasses 배열의 요소로는 존재하지만, scores의 키로는 존재하지 않는 항목이 있다면, 해당 요소는 새로운 객체의 키가 되고, 값으로 0을 가져야 합니다. 위에서 예시로 묘사된 객체와 배열이 인자로 들어왔다면, 다음과 같은 객체과 리턴됩니다. 요소간 순서는 다를수 있지만, 채점에 무관합니다.

    {
      '생활속의회계': 2,
      '논리적글쓰기': 3,
      '독일문화의이해': 3.5,
      '기초수학': 1.5,
      '영어회화': 2.5,
      '인지발달심리학': 4.5,
      '공학수학': 0,
      '컴퓨터과학개론': 0,
    }

☑️ 나의 풀이

const getExamResult = (scores, requiredClasses) => {
  const result = {}; 
  
  let grade = {
    'A+': 4.5,
    'A': 4,
    'B+': 3.5,
    'B': 3,
    'C+': 2.5,
    'C': 2,
    'D+': 1.5,
    'D': 1,
    'F': 0
  };
  
  for (let i=0; i < requiredClasses.length; i++) {
    let key = requiredClasses[i];
    result[key] = 0;
  }
  
  for (let j in scores) {  
    let score = scores[j];
    result[j] = grade[score];
  }  
   
  return result;
}

☑️ 풀이 해설

문제가 요구하는 결과물은

{
  '생활속의회계': 2,
  '논리적글쓰기': 3,
  '독일문화의이해': 3.5,
  '기초수학': 1.5,
  '영어회화': 2.5,
  '인지발달심리학': 4.5,
  '공학수학': 0,
  '컴퓨터과학개론': 0,
}

위와 같은 모양의 객체로 나와야한다.

 const result = {}; 

우선 결과가 출력 될 빈 공간을 하나 선언해줬다.

 let grade = {
    'A+': 4.5,
    'A': 4,
    'B+': 3.5,
    'B': 3,
    'C+': 2.5,
    'C': 2,
    'D+': 1.5,
    'D': 1,
    'F': 0
  };

'grade' 를 선언한 이유는 매개변수 scores 는 아래와 같은 형태이다.

{
  '생활속의회계': 'C',
  '논리적글쓰기': 'B',
  '독일문화의이해': 'B+',
  '기초수학': 'D+',
  '영어회화': 'C+',
  '인지발달심리학': 'A+',
}

위와 같은 매개변수로 받은 객체의 과목들의 등급을 학점으로 변환하기 위한 작업을 위해 미리 선언을 하였다.

다음으로는

  for (let i=0; i < requiredClasses.length; i++) {
    let key = requiredClasses[i];
    result[key] = 0;
  }

이 부분은 문제에 보면 매개변수 requiredClasses 는

['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']

와 같은 배열인데 이는 전부 학점을 0점으로 출력해야 하는 과목이다.
따라서 for 반복문을 이용하여 배열의 요소 irequiredClasses.length 보다 작게 범위를 정해주면 위의 조건문 연산으로 위 과목들이 0점이라는 결과가 result 에 key와 값으로 들어가게된다. 연산에 대해서 풀어서 쓴다면

for (let i=0; i < requiredClasses.length; i++) {
    let key = requiredClasses[i];
    result[key] = 0;
  }

연산순서 해석
let key = requiredClasses[0] // 이 값은 '영어회화' 이다. 배열의 첫번째이므로
result[영어회화] = 0 //result 에 '영어회화' 라는 key 가 추가되서 그 값은 0이다.

result = {
 '영어회화' : 0, 
} 
첫 연산 이후의 result 는 위와 같은 형태가 된다.

위 반복문의 연산이 끝나면 
result = {
  '영어회화' : 0
  '기초수학' : 0
  '공학수학' : 0
  '컴퓨터과학개론' : 0
}
이런 형태의 결과물이 된다.

이제 아래 두번째 for 반복문을 보자.

let grade = {
    'A+': 4.5,
    'A': 4,
    'B+': 3.5,
    'B': 3,
    'C+': 2.5,
    'C': 2,
    'D+': 1.5,
    'D': 1,
    'F': 0
  };

  for (let j in scores) {  
    let score = scores[j];
    result[j] = grade[score];
  }  

이 두번째 반복문 때문에 위에 grade 를 선언해준 것이다.
두번째 반복문의 연산이 어떻게 진행되는지 살펴보자.

매개변수 scores 는 아래와 같다.
{
  '생활속의회계': 'C',
  '논리적글쓰기': 'B',
  '독일문화의이해': 'B+',
  '기초수학': 'D+',
  '영어회화': 'C+',
  '인지발달심리학': 'A+',
}

let score = scores[j] 는 위 배열의 첫번째 키 부터 매개변수가 시작된다.

따라서 첫번째 연산은
let score = scores['생활속의회계']

scores['생활속의회계'] 의 뜻은 '생활속의회계' 란 키의 값이란 의미이므로 'C' 가 저 값이다. 

result['생활속의회계'] = grade['C']

위와 같은 형태가 된다. 
우변의 score 는 scores['생활속의회계'] 이므로 즉 'C' 가 된다. 
grade['C'] 는 앞전의 선언한 grade의 키들 중 'C' 의 값을 표현하는 것이므로  2.5 가된다.
좌변의 result 에는 '생활속의회계' 라는 키가 삽입된다.

result = {
  '영어회화' : 0
  '기초수학' : 0
  '공학수학' : 0
  '컴퓨터과학개론' : 0
  '생활속의회계' : 2.5
}
첫 연산이 끝나면 아래와 같은 모습으로 result 가 바뀐다.

위의 연산과정을 통해서 결론에 도달할 수 있다.

0개의 댓글