Coplit Basic이 이렇게 어려웠었나....?😅
IAT 예상기출위주로 다시 풀어보는데...의외로 오래 걸렸다.
자신감이 점점 떨어져 가운데...복습복습복습한다...!


Coplit Pratice 🥊🥊

1. convertArrayToObject

주어진 배열을 제일 아래 콘솔과 같이 객체에 담아 리턴한다.
빈 배열과 빈 객체를 생성하여 순회하면서 추가한다.
forEach를 중첩해서 쓰는 건 보기좋지 않아서 for-of로 순회하였다.
키워드 🗝: forEach, for...of

function transformEmployeeData(array) {
  let res = [];
  let obj = {};
  array.forEach(item => {
    for(const a of item) {
      obj[a[0]] = a[1];
    }
    res.push(obj);
    obj = {};
  })
  return res;
}

let arr = [
  [['firstName', 'Joe'], ['lastName', 'Blow'], ['age', 42], ['role', 'clerk']],
  [
    ['firstName', 'Mary'],
    ['lastName', 'Jenkins'],
    ['age', 36],
    ['role', 'manager']
  ]
];

console.log(transformEmployeeData(arr));
// [
//   { firstName: 'Joe', lastName: 'Blow', age: 42, role: 'clerk' },
//   { firstName: 'Mary', lastName: 'Jenkins', age: 36, role: 'manager' }
// ];

2. convertObjectToArray

배열 리턴은 대부분 map으로 깔끔하게 해결할 수 있다.
Object.keys로 key값만 배열로 받아서, map을 사용할 수 있게 한다.
이후 map으로 [key, value]쌍으로 리턴해준다.
map이 원래 배열로 리턴하므로 [ [], [], [] ] 와 같이 리턴된다.
키워드 🗝: Object.keys, map

function convertObjectToArray(obj) {
  return Object.keys(obj).map(k => [k, obj[k]])
}

var obj = {
  name: 'Holly',
  age: 35,
  role: 'producer'
};
console.log(convertObjectToArray(obj));
// [['name', 'Holly'], ['age', 35], ['role', 'producer']];

3. convertScoreToGradeWithPlusAndMinus

이걸 깔끔하게 구현하는 걸 자주 고민하는데 쉽지가 않다...
그나마 괜찮은 방법은 ['A','B','C'...'F'] 배열을 생성해서 가져오는 것이다.
그거나 이거나 별 차이가 없다. 구현은 간단해서 설명은 생략한다.

function convertScoreToGradeWithPlusAndMinus(score) {
  if (score > 100 || score < 0) return `INVALID SCORE`;
  if (score === 100) return 'A+';
  if (score <= 60) return 'F';
  let grade;
  let dec = score % 10;
  score >= 90 ? grade = 'A' :
  score >= 80 ? grade = 'B' :
  score >= 70 ? grade = 'C' : grade = 'D';
  if (dec >= 0 && dec <= 2) {
    grade += '-';
  } else if (dec >= 8 && dec <= 9) {
    grade += '+';
  }
  return grade;
}
console.log(convertScoreToGradeWithPlusAndMinus(99)); // A+
console.log(convertScoreToGradeWithPlusAndMinus(81)); // B-
console.log(convertScoreToGradeWithPlusAndMinus(66)); // D
console.log(convertScoreToGradeWithPlusAndMinus(59)); // F

4. findShortestWordAmongMixedElements

배열에서 가장 짧은 문자열을 리턴한다.
string만 필터링하여, 길이오름차순으로 정렬 후 0번째 인덱스를 리턴한다.
키워드 🗝: filter sort

function findShortestWordAmongMixedElements(arr) { 
  return arr.filter(val => typeof val === 'string').sort((a, b) => a.length - b.length)[0]
}

var output = findShortestWordAmongMixedElements([4, 'two', 2, 'three']);
console.log(output); // --> 'two'

5. letterCapitalize

코플릿에 없어서 구글링으로 문제를 가져왔다. (오프라인 수강 전용인가보다.)
space기준으로 분리해서 첫번째값만 대문자로 만들고 다시 붙인다.
키워드 🗝: split, map, join

function letterCapitalize(str) { 
  return str.split(' ').map(word => word.slice(0, 1).toUpperCase() + word.slice(1)).join(' ')
}

console.log(letterCapitalize("hello world from codestates"))
console.log(letterCapitalize("hello"))

6. sumDigits

양수이면 각 숫자를 더하고, 음수면 첫번째 숫자는 음수, 나머진 양수로 더한다.
문자열 그대로 해도 되지만, 배열로 만들면 고차함수를 활용할 수 있다.
키워드 🗝: split, reduce, +

function sumDigits(num) {
  let numArr = num.toString().split('');
  if(num >= 0) {
    return numArr.reduce((acc, cur) => acc + +cur, 0);
  } else {
    return numArr.slice(2).reduce((acc, cur) => acc + +cur, -numArr[1])
  }
}


var output = sumDigits(1148);
console.log(output); // --> 14

var output = sumDigits(-316);
console.log(output); // --> 4

7. modulo

아..이 문제 너무 고생했다.
이전에 풀었던 방식이 너무 복잡해서 recursion으로 바꾸었다.
기준은 modulo(num1 - num2, num2)이다.
두 수의 차를 num1에 계속 주고, num2보다 작아지면 num1을 리턴한다.
나머지는 주어진 조건에 따라 예외처리를 한다.
if만 계속 적는 거보다 아래처럼 정리하는게 보기 좋았다.
키워드 🗝: recursion

function modulo(num1, num2) {
  if(num2 === 0 || isNaN(num1) || isNaN(num2)) return NaN;
  return (
    num1 < 0 ? -modulo(-num1, num2) :
    num2 < 0 ? modulo(num1, -num2) :
    num1 < num2 ? num1 : modulo(num1 - num2, num2)
  );
}

console.log(modulo(25, NaN)); // NaN
console.log(modulo(25, 4)); // 1
console.log(modulo(-4, 2)); // 0

다 정리하고 커밋하는 습관을 가집시다!!! 🙇🏻‍♂️🙇🏻‍♂️🙇🏻‍♂️