본문 바로가기

JavaScript

TIL 09 문제 분할 정복

아래 설명을 읽고 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을 가져야 합니다. 위에서 예시로 묘사된 객체와 배열이 인자로 들어왔다면, 다음과 같은 객체과 리턴됩니다. 요소간 순서는 다를수 있지만, 채점에 무관합니다.
  3. {'논리적글쓰기': 3, '기초수학': 1.5, '인지발달심리학': 4.5, '컴퓨터과학계론': 0, 공학수학': 0, '영어회화': 2.5, '독일문화의이해': 3.5,'생활속의회계': 2,}

첫번째로 풀이했을때는 scores객체를 for...in으로 순회하면서 조건문으로 성적을 변경해줬다.

 

const getExamResult = (scores, requiredClasses) => {
  let gradeCard = {}
  for (let i in scores) {
    if (scores[i]==='A+') {
      gradeCard[i] = 4.5
    } else if (scores[i]==='A') {
      gradeCard[i] = 4
    } else if (scores[i]==='B+') {
      gradeCard[i] = 3.5
    } else if (scores[i]==='B') {
      gradeCard[i] = 3
    } else if (scores[i]==='C+') {
      gradeCard[i] = 2.5
    } else if (scores[i]==='C') {
      gradeCard[i] = 2
    } else if (scores[i]==='D+') {
      gradeCard[i] = 1.5
    } else if (scores[i]==='D') {
      gradeCard[i] = 1
    } else if (scores[i]==='F') {
      gradeCard[i] = 0
    }
  }
  }

보기만해도 상당히 가독성이 떨어지고 실수할 가능성이 높아보이는 코드이다.

그래서 문제를 보다 깔끔하게 해결하기 위해서 해결해야할 문제를 분할해서 접근하는게 좋아보인다.

먼저 해결해야할 문제는 알파벳 학점을 숫자 학점으로 변환을 해줘야한다. 이걸 객체로 접근해본다.

 

const table = {
    'A+': 4.5,
    'A': 4,
    'B+': 3.5,
    'B': 3,
    'C+': 2.5,
    'C': 2,
    'D+': 1.5,
    'D': 1,
    'F': 0, 
  }

 

table변수에 알파벳 학점을 Key로 두고 숫자 학점을 value로 설정해서 object를 할당했다.

이후에 scores를 순환하면서 key에 접근해 value를 table에 있는 값으로 바꿔준다. 이는 for...in문으로 해결한다.

 

for (let i in scores) {
    gradeCard[i] = table[scores[i]]
  }

 

for...in문 변수 i는 scores의 key에 접근해서 빈 객체인 gradeCard에 기존키의 값으로 새로운 value 즉 숫자 학점을 table객체에 접근해서 할당해준다. 예를 들어서 i = '생활속의회계'라면 gradeCard['생활속의회계'] = table[scores['생활속의회계']] 이렇게 할당이 된다.

scores['생활속의회계']는 'C'의 값을 가지고 table['C']는 2의 값을 가지므로 결과적으로 

 

let gradeCard = {'생활속의회계': 2}

 

이렇게 할당이 되는것을 볼 수 있다. 나머지 값들도 for문을 돌면서 gradeCard객체에 추가가 된다.

 

const getExamResult = (scores, requiredClasses) => {
  let gradeCard = {}
  
  const table = {
    '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 in scores) {
    gradeCard[i] = table[scores[i]]
  }
  
  for (let i in requiredClasses) {
    if (!(requiredClasses[i] in scores)) {
      gradeCard[requiredClasses[i]] = 0
    }
  }
  return gradeCard
  }

마지막 for...in문은 requiredClasses의 키중에서 scores에 없는 키는 gradeCard에 0점으로 할당해주는 코드이다.

위가 문제를 분할해서 접근한 방법이고 첫번째 방법에 비해서 상당히 가독성도 좋고 간략한게 보인다.

 

 

'JavaScript' 카테고리의 다른 글