Replit 30.object( 3 )

이진혁·2022년 9월 21일
0
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,
    }

문제 이해

문제에서 인자로 주어지는 scores는 아래와 같이 생겨먹었다

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

그리고 인자 requiredClasses 는 아래와 같이 문자열로 된 배열로 주어진다.

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

우리가 구해야 할 것은 배열로 들어오는 requiredClasses 의 요소에 scores에서 주어졌던 학점(A+, B, D 등등)을 점수(4.5, 3, 1 등등)으로 바꿔서 새로운 객체를 생성해야 하며 만약 requiredClasses 에는 있지만 scores 에 없는 과목이 있다면 0을 부여해야 한다.

쉽게 설명하자면 scores = {'공학수학' : 'A+', '기초수학' : 'B'} 가 주어졌고 requiredClasses = ['공학수학','기초수학','컴퓨터과학개론']이 주어졌다면 우리가 구해야 하는 답은 result = {'공학수학' : 4.5, '기초수학' : 3, '컴퓨터학개론' : 0} 인 셈이다.

접근법

정말,, 많은 방법을 생각해봤다.
scores 로 들어오는 학점들(A+, B, D 등등)을 조건문을 사용하여 먼저 점수로 바꿔준 다음 requiredClasses 의 요소들과 scores 의 키값을 비교해서 scores 에 없는 과목이 있다면 0을 넣어주는 방법을 생각해 보았다.

하지만 이렇게 되면 조건문을 아래와 같이 무려 9번을 돌려줘야 하며 나중에는 requiredClasses 의 요소들과 scores 의 키값까지 비교해야 하는데 너무나 비효율적이고 멍청한 코드라고 생각했다.

  for (let key in scores) {
    let value = scores[key]
    if(value === 'A+'){
      scores[key] = 4.5
    }
    if(value === 'A'){
      scores[key] = 4
    }
    if(value === 'B+'){
      scores[key] = 3.5
    }
    if(value === 'B'){
      scores[key] = 3
    }
    if(value === 'C+'){
      scores[key] = 2.5
    }
    if(value === 'C'){
      scores[key] = 2
    }
    if(value === 'D+'){
      scores[key] = 1.5
    }
    if(value === 'D'){
      scores[key] = 1
    }
    if(value === 'F'){
      scores[key] = 0
    }
  } //끔찍해

그래서 생각한 방법이 requiredClasses 의 모든 요소들을 객체로 만들어 value값을 0으로 할당시키고, 후에 scores 의 학점대로 값을 객체에 재할당하는 방법으로 진행해 보았다.

풀이법

const getExamResult = (scores, requiredClasses) => {

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

    result[key] = value
  }  
}
  1. 새로운 객체를 만들기 위해 result 라는 빈 객체를 선언하고 requiredClasses 을 배열의 길이만큼 반복문을 돌려준다.

  2. requiredClasses 각각의 요소들을 key라는 변수에 저장하고 0으로 할당하기 위해 value라는 변수에 0을 저장한다. => 사실 그냥 result[key] = 0으로 짧게 끝내도 됨

  3. result[key] = value 을 통해 각각의 요소에 0을 재할당 시켜준다.

여기까지 했으면 딱 반은 한 거다. 다음으로 넘어가보자

const getExamResult = (scores, requiredClasses) => {

  let result = {}

  for (let i = 0; i < requiredClasses.length; i++) {

    let key  = requiredClass[i]
    let value = 0

    result[key] = value
  }
  
-----------------------------------------------------
  
  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 key in scores){
    let score = scores[key]
    result[key] = grade[score]
  }
  return result
}
  1. 모든 value가 0으로 할당된 result라는 객체에 각각 scores의 값을 재할당 하기 위해 grade라는 새로운 객체를 만들어준다.

  2. scores 를 반복문을 돌려 각각의 value 값을 구한다음 score라는 변수에 저장한다.

    => 예를 들어 scores scores = {'공학수학' : 'A+', '기초수학' : 'B'} 이런 식으로 들어온다고 가정해보자.

    그렇게 되면 식은 let score = scores[ '공학수학' ] 이 되고 let score = 'A+' 로 해석할 수 있다.

  3. result 객체에 grade를 대입해준다.

    => 2번에서 구한 A+를 우린 score에 할당했다. 하지만 우리가 원하는 것은 A+가 아니라 4.5라는 숫자이기 때문에 학점을 숫자로 바꾸는 작업을 해주어야 한다.

    result[key] = grade[score]result[key] = grade[A+] 로 해석할 수 있으며 grade[A+]는 4.5로 해석할 수 있다.

    그리고 이 4.5를 result[ '공학수학' ]에 재할당한다. 이런식으로 scores의 길이만큼 반복문으로 돌려주면 scores의 모든 학점들이 숫자로 치환되고 scores 에 없는 과목은 아까 0으로 할당했었으니 그대로 0이라는 value값을 갖게 된다.

느낀점

이걸 3시간이나 걸렸다니 내 자신이 너무 한심했다,,,,,,
for-in 개념과 객체의 값을 []로 접근해서 재할당하는 것에 익숙치 않아 문제를 푸는 시간이 너무나 길어졌다. 문제를 풀고나니 개념만 잘 알고 있다면 그렇게 어려운 문제가 아니었는데 조금 허탈하다,, 그래도 개념을 정확히 짚고나니 내 것으로 만들었다는 생각에 뿌듯뿌듯
앞으로는 절대 안 까먹을듯(?)

profile
개발 === 99%의 노력과 1%의 기도

0개의 댓글