Assignment
아래 설명을 읽고 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,
}
first trial
생각의 흐름
1. 일단 아는 개념인 Object.keys() 와 Object.values() 메소드를 통해 키와 값으로 이루어진 배열을 각각 생성한다.
=> scores 객체의 값들로 구성된 배열을 "A", "B", "C", "D", "F" 키워드가 있느냐를 확인한 후, 있으면 점수를 숫자로 바꾼다.
또한 "+"가 있는지를 확인하여 0.5점을 더해준다.
2. 두 개의 배열을 for 문을 이용하여 객체로 만들어준다.
3. 키값들의 배열로 만들어 이 내부를 순회하며, requiredClasses 내부 요소들과 대조하여 키값들 중 없는 값들을 배열에 끝 부분에 추가한다.
4. 키의 인덱스와 value의 index는 각각 동일하다. for문의 중첩을 이용해 이 인덱스들이 동일하면, 값을 할당한다.
만약 (키의 인덱스가 더 길기 때문에) 키의 값이 undefined이면, 0을 할당한다.
const getExamResult = (scores, requiredClasses) => {
let scoreKeys = Object.keys(scores);
let scoreValues = Object.values(scores);
let newResult = {};
let newValues = scoreValues.map(function(x) {
let score = 0;
if (x.indexOf("A") != -1) {
score = 4;
} else if (x.indexOf("B") != -1) {
score = 3;
} else if (x.indexOf("C") != -1) {
score = 2;
} else if (x.indexOf("D") != -1) {
score = 1;
}
if (x.indexOf("+") != -1) {
score += 0.5;
}
return score;
}
)
let newKeys = scoreKeys;
let isInThere = 0;
for (let i = 0; i < requiredClasses.length; i++) {
for (let j = 0; j < scoreKeys.length; j++) {
if (scoreKeys[j] == requiredClasses[i]) isInThere++;
}
if (isInThere === 0) newKeys.push(requiredClasses[i]);
isInThere = 0;
}
//newValues, newKeys
for(let i=0; i< newKeys.length; i++){
for(let j=0; j<newValues.length; j++){
if(i==j)newResult[newKeys[i]]=newValues[j];
}
if(!newResult[newKeys[i]]) newResult[newKeys[i]]=0;
}
return newResult;
}
46줄...
for 문의 중첩을 통해 이곳까지 오게 된 나...
뭔가 제거하거나 깔끔하게 내 의도를 명시할 수 있는 방법이 있을 것 같은데, 아직 잘 모르겠다.^^
위의 복잡한 표현식으로, 논리도 잘 짜고, 사실 원하는 흐름을 30분 만에 만들었는데, 코드가 길어지고, for문의 중첩 등등...의 복잡한 해결 방식때문에 길을 1시간 30분 정도 헤맸다... 흑흑...
이미 기운을 많이 소진한 이후여서 더 머리가 안돌아갔다는...
덕분에 console로 하나 하나 찍어보고, 확인해가며 복잡한 문제의 해결 방식에 대해 조금씩 적립해가는 중!!!
친구에게 나의 고충을 설명하였더니, 필요한 메서드들을 검색하고 바로 바로 공부하라는 충고를 주었다.
포함되어 있나를 체크할 때, indexOf를 사용하여 체크하는 하나씩 돌려보지 말고, includes를 사용하여 Boolean타입의 데이터로 더욱 빠르게 사용할 수 있는 것처럼...
정말, 그렇게 하니까 능률이 쫙 올랐다.
시간 대비 효율성 대박이었다.
짜릿하다. 코드가 복잡하지 않아 헤매지도 않고, 새로운 개념들을 공부해가며 했는데도, 20분 정도의 시간만 걸렸다.
친구가 (아마) 칭찬했다. 통과했다는 표현이 맞을 듯^.^
const getExamResult = (scores, requiredClasses) => {
for (x in scores) {
let score = 0;
if (scores[x].includes("+")) {
score += 0.5;
scores[x]=scores[x].slice(0,1);
}
switch(scores[x]){
case "A":
score +=4;
break;
case "B":
score +=3;
break;
case "C":
score +=2;
break;
case "D":
score +=1;
break;
default: score =0;
}
scores[x] = score ;
}
requiredClasses.forEach((x) => {
if (!Object.keys(scores).includes(x)) scores[x] = 0;
});
return scores;
}
29줄!!
46줄에서 for 문의 중첩과 새로운 변수들이 난무하게 짠 코드가 아닌, 더 깔끔하고, 배운 것도 활용하고 새로운 것도 활용할 수 있었다는 점에서 아주 기분이가 좋다^.^
우선 switch와 includes 라는 새로운 메소드들을 사용했고, switch는 type을 포함한 "동일함"을 체크해줄 때 사용하는 if문의 친구이다.
그래서 더 짧은 코드를 위해, "+" 부분을 체크하여 따로 계산을 했고, slice를 이용하여 +을 제외한 부분을 복사하여 반환 후 switch에 추가했다.
includes는 스트링과 배열의 매서드이고, 변수의 값 내에 어떤 요소가 있는지 판별하여 Boolean으로 값을 반환한다.
String.prototype.includes()
Array.prototype.includes()
SWITCH
switch(argument) {
case A : //1
console.log(A equal);
break;
case B : //2
console.log(B equal);
break;
case C : //3
console.log(C equal);
break;
default : console.log("Not equal"); //4
}
Switch는 인자를 받아 그 인자가 아래 케이스들과 일치하는지 확인하여 참일 경우, 종속된 코드들을 실행한다.
중요한 점은, type check라는 점과 각 케이스의 마지막에 항상 break를 작성해주어야 한다는 것이다.
들어온 인자가 case 옆에 위치한 값들과 일치하는 지 판별하여 일치할 경우에는, 한 case 내부의 코드를 실행한다.
=== 타입체크 포함하여 진행하는 엄격한 비교를 한다.
만약 여러 케이스와 일치하더라도, 맨 첫 케이스의 코드만 실행한다.
만약 break를 작성해주지 않으면, 1의 case와 일치하는 경우, 1,2,3,4까지 실행을 시킨다.
이 문제와 같이 if 문을 이용하여 같음을 체크하는 여러 분기점을 만들어줄 때, Switch를 사용하여 코드를 더욱 깔끔하게 작성할 수 있다.
'programming > JS' 카테고리의 다른 글
서버 함 만들어보까? | API와 HTTP (0) | 2022.10.02 |
---|---|
JS| NODE.JS (0) | 2022.10.02 |
JS | Array.map() 과 Array.forEach() (0) | 2022.09.24 |
JS | arrow method(map, forEach) (1) | 2022.09.23 |
JS | method를 포함한 Class 만들기 (0) | 2022.09.23 |