01_transformFirstAndLast

이 문제의 목적은 "배열의 요소를 잘 조회하여, 새로운 객체에 할당할 수 있는가"를 묻는 문제입니다.

객체의 할당에 대해서 제대로 이해를 하고 계시지 못하다면, 아마 여기에서 큰 어려움을 겪으셨을 것으로 예상됩니다. 객체의 할당에 대해서 복습하시기 바랍니다. 객체[키] = 값 이렇게 적으면 새로운 객체의 속성이 할당 되는 것을 잊지 마세요 😎

function transformFirstAndLast(arr) {
  let obj = {}
  if (arr.length === 0){
    return obj
  } else {
		let firstIndex = 0 // 배열의 첫 요소의 index는 0
	  let lastIndex = arr.length - 1 // 배열의 마지막 요소의 index는 arr.length - 1

		obj[arr[firstIndex]] = arr[lastIndex]
    // 배열의 첫 요소를 key로 하고, 배열의 마지막 요소를 value로 하는 새로운 obj 속성의 할당

		return obj
  }
}

02_computeWhenDouble

고등학교 수열에서 자주 나오는 복리 연산에 대해서 이해하고 계시다면, 어려운 문제는 아니였을 것으로 생각됩니다. 저는 While을 한 번 써봤습니다. 원금이 2 (1의 두배)가 되기 전 까지 반복문을 실행을 하고, 원금은 1회만 넣었을 때를 가정하고 풀어야 합니다. 하나 차이로 통과가 되지 않는 분들은 반복문의 특성에 대해서 조금 더 고민을 하실 필요가 있다고 생각합니다.

function computeWhenDouble(interestRate) {
  let principal = 1;
  let count = 0
  while (principal < 2){
    count++
    // console.log("count", count, "principal", principal);
		principal = principal + (principal * (interestRate / 100));
		// console.log("count", count, "principal", principal);
		// console.log("-------------------------------------);
		// 헷갈린다면 콘솔을 찍어봅시다.
  }
  return count;
  // TODO: 여기에 코드를 작성합니다.
}

03_powerOfTwo

function powerOfTwo(num) { 
  let final = num;
  while (final > 1) {
    final = final / 2;
  }
  // 2의 거듭제곱?
  // 2, 4, 8, 16, 32... 2로만 곱해진 값
  // 2로 반복해서 곱한 값이 num인가?
  // 2의 거듭제곱은 2로 반복해서 나누면 정확하게 1로 나누어 떨어질 것이다.

  if (final === 1){
    return true;
  } else {
    return false;
  }  // 어떻게 더 짧게 쓸 수 있나요?
  // TODO: 여기에 코드를 작성합니다.
}

// function powerOfTwo(num) {
//   if (num === 1) {
//     return true;
//   } // 1은 2의 0승으로 2의 거듭제곱이다.

//   if (num % 2) {
//     return false;
//   } // 2로 나누었을 때, 0이 나오지 않으면 무조건 2의 거듭제곱이 아니다.

//   // 2의 거듭제곱?
//   // 2, 4, 8, 16, 32... 2로만 곱해진 값
//   // 2로 반복해서 곱한 값이 num인가?
//   // 2로 반복해서 곱했을 때, num과 같은 값이 나오는 경우, 거듭제곱이라고 볼 수 있다.

//   let powered = 2;
//   while (powered < num) {
//     powered = powered * 2;
//   }

//   return powered === num;
// }

06_letterCapitalize

이 문제를 푸는데 어려운 점은 빈칸이 하나가 아닌 여러번이 있을 수 있다는 것에 있습니다. 운 좋게도 이번에는 split join 을 활용하면 쉽게 풀 수 있었습니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/66adfe68-c97f-4515-af89-eb0a3400df26/_2020-09-15__12.50.06.png

whitespace가 6개인 string에 split을 사용해보면, 총 7개의 빈 스트링으로 나눠지는 것을 보실 수 있습니다. whitespace를 기준으로 나누려고 해보니 이렇게 되었네요. 이 결과가 뭔가 특별해보인다면, 아래의 결과는 어떤가요? 특별한가요? 결국 , 를 기준으로 나누었을 뿐입니다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/126a6daf-ce11-47fb-b1aa-5ed5e41f12b0/_2020-09-15__12.51.49.png

그래서 레퍼런스 코드를 보면 split를 적극적으로 활용한 모습을 보실 수 있습니다. 빈 스트링만 제외하면 문제가 비교적 깔끔하게 풀리니까요. (blahblah.length === 0 인 경우) 첫 글자만 대문자로 바꾼 새로운 문자열을 배열에 추가해주는 모습입니다.

function letterCapitalize(str) {
  let words = str.split(' '); // 단어와 빈 스트링으로 구분 가능 => 문제를 단순하게 변경

  for (let i = 0; i < words.length; i++) {
    if (words[i].length > 0) { // 빈 스트링만 제외
      words[i] = words[i][0].toUpperCase() + words[i].substr(1); // 첫 글자만 대문자로 바꾼 새로운 문자열
    }
  }

  str = words.join(' ');
  return str;
}

split join 과 같은 편리한 내장 메소드 (built-in method)를 사용하지 않은 풀이 방식도 참고 부탁 드립니다. 있는 메소드를 활용하지 않고 for문으로만 짜는 코드가 늘 좋은 코드는 아닙니다만, 좋은 수련 방법인 것은 사실입니다! ASCII 코드를 활용한 풀이라 어려울 수 있지만, 언젠가는 이 ASCII 코드나 유니코드와 씨름하는 날이 오실겁니다 🙂

07_convertListToObject

// 2차원 배열(배열을 요소로 갖는 배열)을 입력받아 
// 각 배열을 이용해 만든 객체를 리턴해야 합니다.

// 각 배열을 이용해 : arr[i]의 첫 번째 요소를 키, 두 번째 요소를 값으로 하는 객체를 리턴해야 합니다.
function convertListToObject(arr) {
  if (arr.length === 0) {
    return {};
  }

  const obj = {};

  for (let i = 0; i < arr.length; i += 1){
    const key = arr[i][0];
    const value = arr[i][1];

    if (typeof obj[key] !== 'undefined' || arr[i].length === 0) {
      continue;
    }

    obj[key] = value;
  }
  return obj
}

// function convertListToObject(arr) {
//   let result = {};

//   for (let i = 0; i < arr.length; i++) {
//     if (arr[i].length > 0 && result[arr[i][0]] === undefined) {
//       result[arr[i][0]] = arr[i][1];
//     }
//   }

//   return result;
// }