글 작성자: 개발자 올라프

Assignment

 

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

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

 

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

 

3. 다음 조건을 만족하는 객체를 리턴하도록 함수를 구현하라.

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

 

3-2. requiredClasses 배열의 요소로는 존재하지만, scores의 키로는 존재하지 않는 항목이 있다면, 해당 요소는 새로운 객체의 키가 되고, 값으로 0을 가져와야 한다. 위에서 예시로 묘사된 객체와 배열이 인자로 들어왔다면, 다음과 같은 객체가 리턴된다. 요소간 순서는 다를 수 있지만 채점에 무관하다.

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

 

 

My code

const getExamResult = (scores, requiredClasses) => {
	
    const result = {};
    const strToNum = {
    	"A+": 4.5,
        "A": 4,
        "B+": 3.5,
        "B": 3,
        "C+": 2.5,
        "C": 2,
        "D+": 1.5,
        "D": 1,
        "F": 0
    }
    
    // result에 강의명과 숫자로 바꾼 학점을 대입
    for(let i in scores) {
    	result[i] = strToNum[scores[i]];
    }
    
    // result에 requiredClasses 인자 요소 중에서 scores인자 요소에 없는 값을 추가하고 0을 대입
    const keys = Object.keys(result);
    for(let i in requiredClasses) {
    	if(!keys.includes(requiredClasses[i])) {
        	result[requiredClasses[i]]=0;
        }
    }
    
    return result;
}

 

자바스크립트 replit문제 중에서 가장 어려웠다. for-in문을 제대로 이해하지 못하고 풀이를 진행했던 점이 크지 않았을까 싶다. 우선 for-in문 개념부터 정리해보자.

 

for-in문은 상속된 열거 가능한 속성들을 포함하여 객체에서 문자열로 키가 지정된 모든 열거 가능한 속성에 대해 반복한다. for-in문은 임의의 순서로 객체의 속성들에 대해 반복한다. 즉, for-in은 인덱스의 순서가 중요한 배열에서 반복을 위해 사용할 수 없다. 다음 예제를 통하여 for-in이 어떻게 동작하는지 이해해보자.

const obj = {
	a: 1,
    b: 2,
    c: 3
};

for(const prop in obj) {
	console.log(`obj.${prop} = ${obj[prop]}`);
}
// "obj.a = 1"
// "obj.b = 2"
// "obj.c = 3"

이처럼 prop은 매번 반복마다 다른 속성이름이 변수로 지정된다. 단순히 for(let i=0; i<5; i++){} 구문처럼 숫자가 증가하는 것이 아니라 key값이 저장된다.

 

for-in을 이해했으면 이제 풀이 코드를 뜯어서 이해해보자.

for(let i in scores) {
	result[i] = strToNum[scores[i]];
}

i에는 scores인자의 key값인 '생활속의회계', '논리적글쓰기' 등의 값들이 저장된다. 이를 토대로 코드를 풀어보면

result['생활속의회계'] = strToNum[scores['생활속의회계']];

result['생활속의회계'] = strToNum['C']; 으로 result 객체에는 어떤 순서로 올지는 모르지만 다음 값이 저장된다.

{ '생활속의회계': 2 }

 

객체는 이미 키가 존재하는데 재할당하면 값이 수정되고, 이전에 없던 키로 접근하면 새로운 프로퍼티가 추가되므로 '생활속의회계'라는 key가 생기고 strToNum['C']에 접근하면 2라는 값이 나오므로 문제에서 요구하는 결과인 { '생활속의회계': 2 }를 반환할 수 있었다. 이후 열거 가능한 속성에 대해 반복하여 scores에 담긴 모든 key와 숫자로 바뀐 value 값들을 가져온다.

 

다음으로 requiredClasses의 프로퍼티중 scores에 없는 key를 추가하고 value로는 0을 대입한다.

const keys = Object.keys(result);
for(let i in requiredClasses) {
    if(!keys.includes(requiredClasses[i])) {
        result[requiredClasses[i]]=0;
	}
}

우선 scores값들은 이미 result에 모두 옮겼으므로 result의 key값들을 담은 keys변수를 생성한다.

이후 requiredClasses를 for-in문으로 keys변수에 포함되어 있지 않는 값들을 찾아내어 0값을 대입하도록 했다.