본문 바로가기

■ 프로그래밍/알고리즘

[JS] Object를 활용한 성적 가져오기

 

[ 문제 ] 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. requiredClass 배열의 요소로는 존재하지만, scores의 키로는 존재하지 않는 항목이 있다면,

해당 요소는 새로운 객체의 키가 되고, 값으로 0을 가져야 합니다.

 

위에서 예시로 묘사된 객체와 배열이 인자로 들어왔다면,

다음과 같은 객체과 리턴됩니다. (요소간 순서는 다를수 있지만, 채점에 무관합니다.)

 

{

  '생활속의회계': 2,

  '논리적글쓰기': 3,

  '독일문화의이해': 3.5,

  '기초수학': 1.5,

  '영어회화': 2.5,

  '인지발달심리학': 4.5,

  '공학수학': 0,

  '컴퓨터과학개론': 0,

}

 

[ 풀이 ] 

처음에는 완전 노가다로 풀어서 코드가 간결하지 못했다.

if문으로 영문성적을 숫자성적으로 변경했고, for문으로 requiredClasses를 불러왔지만, 기존에 있던 과목들의 성적은 숫자성적이 적용되지 않아 다시 한번 if문으로 적용시켰다. (엄청 비효율적으로 푼 케이스...)

 

객체 관련 문제다보니, scores 자체를 객체로 지정하여 for문으로 result객체에 하나씩 넣어주면 더 쉽게 풀 수 있다. 

const scores = {
  '생활속의회계': 'C',
  '논리적글쓰기': 'B',
  '독일문화의이해': 'B+',
  '기초수학': 'D+',
  '영어회화': 'C+',
  '인지발달심리학': 'A+',
}
const requiredClasses = ['영어회화', '기초수학', '공학수학', '컴퓨터과학개론'];

const getExamResult = (scores, requiredClasses) => {
  const result = {};
  const numScore = {
  "A+": 4.5,
  "A": 4,
  "B+": 3.5,
  "B": 3,
  "C+": 2.5,
  "C": 2,
  "D+": 1.5,
  "D": 1,
  "F": 0,
  }
  // console.log(Object.keys(numScore));
  
  for (let key in scores) {
    // 영문성적 => 숫자성적으로 변경
    for (var i = 0; i < 9; i++) {
      // console.log(i);
      if (scores[key] === Object.keys(numScore)[i]) {
        result[key] = Object.values(numScore)[i]; // 바뀐 값을 result[key]에 할당
      }
    }
    // console.log(result[key]); // 숫자로 바뀐 점수
  }
  
  for (let i in requiredClasses) {
    // console.log(requiredClasses[i]); // 영어회화, 기초수학, 공학수학, 컴퓨터과학개론
    const className = requiredClasses[i]; // 과목들 className에 할당
    const existingKeys = Object.keys(scores); // 이미 있는 과목
    // console.log(`이미 있는 과목: ${existingKeys}`);
    
    if (!existingKeys.includes(className)) {
      // console.log(existingKeys.includes(className));
      result[className] = 0;
    }
  }
  
  return result;
}

getExamResult(scores, requiredClasses);

 

영문 성적 => 숫자 성적 변경

for (let key in scores) {
    // scores의 성적을 숫자성적으로 바꾸기 위해, socres의 key 수 만큼 반복, 6번
    
    for (var i = 0; i < 9; i++) {
    // 영문성적을 숫자성적으로 바꾸기 위해, 존재하는 성적(numScore) 수 만큼 반복, 9번
      if (scores[key] === Object.keys(numScore)[i]) {
          // scores["과목명"] = 영문성적
          // Object.keys(numScores) = 영문성적
        result[key] = Object.values(numScore)[i]; // 바뀐 값을 result[key]에 할당
        // 비어 있는 result[key](= result의 value)에 상응하는 숫자성적 입력
      }
    }
    // console.log(result[key]); // 숫자로 바뀐 점수
  }

 

없는 과목 0으로 설정

for (let i in requiredClasses) {
	// requiedClasses 수 만큼 반복, 4번
    // console.log(requiredClasses[i]); // 영어회화, 기초수학, 공학수학, 컴퓨터과학개론
    
    const className = requiredClasses[i]; // 과목명을 className에 할당
    const existingKeys = Object.keys(scores); // scores에 이미 존재하는 과목
    // console.log(`이미 있는 과목: ${existingKeys}`);
    
    if (!existingKeys.includes(className)) {
      // 만약 existingKeys안에 상응하는 className이 존재하지 않다면,
      // result[className](= result value)을 0으로 설정
      // console.log(existingKeys.includes(className));
      result[className] = 0;
    }
  }

 

 

[ 참고 ] 

2020/03/25 - Object (1) - 접근, 할당

2020/03/26 - Object (2) - 중첩객체 접근