[Replit] js object / for ~ in

HongDuHyeon·2022년 3월 4일
0
post-thumbnail
문제 5번은 쳐다보기

getExamResult 함수를 구현하세요.

인자 scores 는 다음과 같은 객체입니다. 객체의 요소의 갯수 및 키의 이름들은 달라질 수 있습니다. 
객체의 값은 다음 9가지 문자열 중에서 하나를 가지고 있습니다.
'A+', 'A', 'B+', 'B', 'C+', 'C', 'D+', 'D', 'F'
{
  '생활속의회계': 'C',
  '논리적글쓰기': 'B',
  '독일문화의이해': 'B+',
  '기초수학': 'D+',
  '영어회화': 'C+',
  '인지발달심리학': 'A+',
}
인자 requiredClasses 는 다음과 같이 문자열로 된 배열입니다.

`['영어회화', '기초수학', '공학수학', '컴퓨터과학개론']`
다음 조건을 만족하는 객체를 리턴하도록 함수를 구현해주세요.

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

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

내가 풀었던 방식

가면 갈수록 문제도 이해가 안되는 부분이 꽤 많았다. 일단 문제가 이해 안되면 최소한 3번씩은 읽어봤고 그래도 이해가 안되면 구글링으로 검색을 해서 나와 같은 문제를 푼 사람이 있는지 확인하고 정답이 아닌 문제를 이해하는 방식을 거쳤다.

먼저 객체안에서 프로퍼티 값? 키값? 뭐든간에 안에 들어있는 요소를 사용할 수 있어야했다. 그러기 위해선
for in이 필요했고 자주 사용했던 방식이 아니긴 했지만 일단 먼저 for in의 개념을 짚고 넘어가는게 필요했다.

for ~ in

for in문은 객체의 모든 열거 가능한 속성들을 순회하도록 한다.
여기서 순회 가능한 속성이라는 것은 객체의 key값을 말한다. value값은 직접 접근하는 것이 불가능하므로 객체의 value 값을 알고 싶다면 example[key] 같은 표현 방식으로 간접적으로 접근해야 한다.

// Object 생성
const introduce = {
	name : "DuHyeon",
  	age : 28,
  	city : "Incheon",
  	hobby : "BJJ"
}

// Array 생성
const location = ["Seoul","Busan","Jeju","Incheon"];

for (let key in introduce) {
	console.log(key) // name , age, city, hobby
  	console.log(introduce[key]) // "DuHyeon", 28, "Incheon", "BJJ"
}

for ~ in문을 통해 각각 객체와 배열의 key에 접근했다.
그리고 introduce[key]를 통해서 간접적으로 value에 접근했다.
이처럼 for ~ in문을 사용하면 객체의 값에 접근하여 순회하는 것이 가능하다.
위에서도 설명했듯, for ~in문은 순서가 없는 객체에 임의의 순서를 가지고 접근하는 방식이다.

따라서 순서대로, 정렬된 값을 출력해야 하는 경우에는 for ~in문을 사용하지 않는 것이 좋겠다. 특히나 반복 가능하며 순서를 가지는 배열의 경우, for ~in문 보다는 후에 설명할 for ~of문을 사용하는 것이 더 적절하다.

그럼 이제 위에서 정리한 for ~ in문을 사용해서 문제에 접근 해보겠다.

먼저 scores에 없는 과목들을 0으로 만들고 시작을 해보겠다.

const getExamResult = (scores, requiredClasses) => {
  	let result = {}
	
    for (let i = 0; i < requiredClasses.length; i++){
    	let key = requiredClasses[i];
      	result[key] = 0;
    }
}

그리고 나서 for in문을 통해 주어진 조건에 맞춰서 값이 숫자로 바뀌어서 할당되어야한다.

const getExamResult = (scores, requiredClasses) => {
  	let 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 point = scores[j];
    	result[j] = grade[point];
  	}
  
	return result;
}

scores를 j로 순회하고 그 값을 point 변수에 할당해주고 grade라는 변수에 키값으로 대체 해준 후 결과물인 result와 grade를 맞춰줌으로써 없는 값들은 0이고 나머지 값들은 제대로 들어가게 된다.

결과

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

javascript replit 30번 문제가 끝이 났다. for of는 굳이 사용하지 않고 for in으로 적절하게 코드를 마무리 할 수 있었고 계속 써도 헷갈리는만큼 블로그에 적어둠으로써 잊지 않기 위해 노력하고 쓰고자할때 자연스럽게 나올 수 있도록 익혀둡시당

profile
마음이 시키는 프론트엔드.. RN과 IOS를 곁들인..

0개의 댓글