Checkpoint1

Slack에 CheckPoint1 이라는 과제가 올라왔다...!
마지막 문제를 빼고는 어려운 편이 아니었지만...?
고차함수를 활용하는 연습용으로 삼아서...해결해보았다!👏🏻


1. billTotal

뭐 단순하게...팁 15%, 세금 9.5% 더해주면 된다고 한다 :)

function billTotal(subtotal) {
  return (subtotal * 1.15 + subtotal * 0.095)
}
billTotal(10.00); // => 12.45

2. getFullName

함수 아래 케이스에 맞게 name값에 접근하여 fullName을 만든다.
하나하나 따로 뽑기보다는 value를 배열로 받아서 합치는게 편하다 :)

function getFullName(obj) {
  return Object.values(obj.name).join(' ')
}

var person = {
  name : {
    first : "Alyssa",
    middle: "P.",
    last: "Hacker"
  },
  age : 26
};
getFullName(person); //"Alyssa P. Hacker"

var personB = {
  name: {
    first: "Ben",
    last: "Bitdiddle"
  },
  age: 34
};
getFullName(personB); //"Ben Bitdiddle"

3. longestName

people배열에서 2번처럼 fullName을 받아서, 가장 긴 이름을 리턴해야 한다.
2번에서 만들었던 getFullName을 활용하면 아주 간단하다.
각 객체를 돌면서 getFullName을 적용시키고, 정렬 후에 가장 앞을 가져온다.

var people = [
  {name: {first: "Alyssa", middle: "P.", last: "Hacker"}, age: 26},
  {name: {first: "Ben", last: "Bitdiddle"}, age: 34},
  {name: {first: "Eva", middle: "Lu", last: "Ator"}, age: 40},
  {name: {first: "Lem", middle: "E.", last: "Tweakit"}, age: 45},
  {name: {first: "Louis", last: "Reasoner"}, age: 21}
];

function getFullName(obj) {
  return Object.values(obj.name).join(' ')
}

function longestName(people) {
  return people.map(val => getFullName(val)).sort().shift();
}

longestName(people); //"Alyssa P. Hacker"

4. hammingDistance

해밍...학교에서 배웠던 기억이 살...짝 난다.(해밍코드?)
for반복문으로 해결하면 아주 직관적이지만, 고차함수를 사용해보자!
아래는 풀기위한 간단한 로직이다.

strArr[0][0] !== strArr[1][0] count++
strArr[0][1] !== strArr[1][1] count++
strArr[0][2] !== strArr[1][2] count++
strArr[0][3] !== strArr[1][3] count++
strArr[0][4] !== strArr[1][4] count++

위를 잘 참고하여...구현해본다!
각각 비교하면서 다른 값을 배열에 담아 개수를 리턴한다.

function hammingDistance(strArr) {
  return strArr[0].split('').filter((char, i) => char !== strArr[1][i]).length;
}

hammingDistance(["coder", "codec"]); // => 1
hammingDistance(["10011", "10100"]); // => 3
hammingDistance(["helloworld", "worldhello"]); // => 8
console.log(hammingDistance(["coder", "codec"]))

5. range

Coplit에서 비슷하게 풀었었다.
이번에도 역시 고차함수를 활용해본다.
배열을 다 완성 후에 인덱스+시작값으로 배열을 채운다.

function range(start, end) {
  return Array((end - start >= 0) ? (end - start) : 0).fill().map((val, i) => i+start)
}

range(0, 4); // => [0, 1, 2, 3]
range(2, 7); // => [2, 3, 4, 5, 6]
range(10, 10); // => []
range(10, 2); // => []

6. offLineMinimum

먼저 로직을 적어놓고 구현하였다.

1. 5를 집어넣는다.
2. 4를 집어넣어서 정렬.
3. 6을 집어넣어서 정렬.
4. E를 발견하면, 앞에 값 빈 배열에 푸쉬. // 현배열 : [5, 6]. 빈배열: [4]
5. 1을 집어넣고 정렬.
6. 7을 집어넣고 정렬. // 현배열 : [1, 5, 6, 7].
7. E를 발견하면, 앞에 값 빈 배열에 푸쉬. 현배열: [5, 6, 7]. 빈배열: [4, 1]

'E'와 같은지 아닌지에 따라 분리해서 작성하면 된다.
이해만 하고 나면 그렇게 어렵지 않지만, 그게 어려운거다...ㅎㅎㅎ

function offLineMinimum(strArr) {
  const container = [];
  const resultArr = [];
  strArr.forEach(char => char !== 'E' ? container.push(char) && container.sort() : resultArr.push(container.shift()));
  return resultArr.join(',');
}

offLineMinimum(["1","2","E","E","3"]);
offLineMinimum(["4","E","1","E","2","E","3","E"]);
offLineMinimum(["5","4","6","E","1","7","E","E","3","2"])