Wecode> JS Repl.it 30번

OwlCJ·2022년 1월 28일
0

wecode

목록 보기
5/10

위코드 1주차가 오늘로 막을 내린다. 시간이 너무나 빠르게 지나가서 오늘이 금요일인지도 모르고 있었는데 😓 금방 JavaScript 1주차가 끝나버렸다. Repl.it에서 많은 과제를 해결했지만 그 중에서도 가장 인상 깊었던 JS 30번 문제는 기록해두려고 한다.✍🏻

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,
}

과제 내용은 위와 같고 설명전에 나의 풀이는 다음과 같다.

GetExamResult 코드

const getExamResult = (scores, requiredClasses) => {
  const resultScores = {};

  const scoreBoard = {
    '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 transScore = scores[key];
    resultScores[key] = scoreBoard[transScore];
  }
  
  for (let i = 0; i < requiredClasses.length; i++) {
    let subject = requiredClasses[i];
    
    if (!resultScores[subject]) {
      resultScores[subject] = 0;
    }
  }
  return resultScores;
}

GetExamResult 풀이

문제를 정리하면 다음 2가지를 요구하고 있다.

  • scores라는 등급이 들어간 객체를 제공해주고 해당 등급에 알맞은 점수로 변환해주어야 한다.
  • requiredClasses 라는 새로 들어가야할 과목을 알려주는 배열이 주어지고 해당 과목이 있다면 패스하고 없다면 새 키로 넣어준 후에 Value로 0을 넣어주면 된다.

그럼 처음에 scores에서 Value부분을 어떻게 점수로 변환해주는 문제부터 해결해야 하는데 처음엔 Switch문을 생각해냈다. 그렇지만 코드가 상당히 길어지고 결국 if문과 같이 굉장히 수많은 조건들을 매칭해보고 True인 부분에서 변환이 되기 때문에 굉장히 비효율적인 것 같다고 생각했다. 좀 더 효율적인 방법이 있지 않을까?

그러던 중에 객체라는것이 결국은 키 값을 통해서 밸류값을 보여주는 1차 변환 이라는 생각이 들어 그럼 객체를 두개 사용하여 2차 변환을 하면, 숫자 점수로 바꾸어주는 scoreBoard라는 객체를 선언하고 그 객체의 키 값이 결국은 scores의 밸류값이 되게 연결을 시키면 별도의 변수 선언, 반복문 등을 사용하여 변환해 줄 필요없이 한번에

과목명 -> 영어 점수 -> 수학 점수

가 가능하지 않을까 라는 생각을 하게 됬다. 과거 C언어를 공부할 때의 2차 포인터 같은 느낌이다. 결론은 이런 도출 과정을 통해 구현한 로직은 위와 같다. 만들어 놓고보니 꽤나 간단하게 보이지만 맨 땅에서 생각하는데 생각보다 많은 시간이 걸렸다.

문제는 그보다 배 이상의 시간은 return 값을 해주지 않고 그걸 찾는데 사용했다.😨 문제에서 요구한 것은 해당 함수가 실행되어 최종완성된 객체를 반환받는 것이었는데 정작 로직에만 몰두하다보니 리턴을 안 해주고 잊어버리는 실수를 했다. 문제를 찾으려고 RunJS를 계속 돌려봐도 돌아온 것은 정답과 같은 객체 뿐이어서 멘붕에 빠졌지만 결국 리턴의 부재는 멘토님께 여쭤보고나서 해결이 되었다. 본인의 간단한 실수들은 정말 스스로 찾기가 어려운 것 같다.😥

결론

여전히 어려울 것 같지만 역시 문제를 푸는데에는 다음 요건부터 천천히 살펴보는 습관을 길러야할 것 같다.

  • 해당 함수의 입력값의 타입과 값은 무엇인가
  • 큰 문제를 해결할 때는 세부 로직으로 나누어 구현할 것
  • 함수가 원하는 결과값을 제대로 리턴하고 있는가
profile
ios 개발자를 목표로 성장중입니다 🧐

0개의 댓글