이 문제의 목적은 "배열의 요소를 잘 조회하여, 새로운 객체에 할당할 수 있는가"를 묻는 문제입니다.
객체의 할당에 대해서 제대로 이해를 하고 계시지 못하다면, 아마 여기에서 큰 어려움을 겪으셨을 것으로 예상됩니다. 객체의 할당에 대해서 복습하시기 바랍니다. 객체[키] = 값
이렇게 적으면 새로운 객체의 속성이 할당 되는 것을 잊지 마세요 😎
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
}
}
고등학교 수열에서 자주 나오는 복리 연산에 대해서 이해하고 계시다면, 어려운 문제는 아니였을 것으로 생각됩니다. 저는 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: 여기에 코드를 작성합니다.
}
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;
// }
이 문제를 푸는데 어려운 점은 빈칸이 하나가 아닌 여러번이 있을 수 있다는 것에 있습니다. 운 좋게도 이번에는 split
join
을 활용하면 쉽게 풀 수 있었습니다.
whitespace가 6개인 string에 split을 사용해보면, 총 7개의 빈 스트링으로 나눠지는 것을 보실 수 있습니다. whitespace를 기준으로 나누려고 해보니 이렇게 되었네요. 이 결과가 뭔가 특별해보인다면, 아래의 결과는 어떤가요? 특별한가요? 결국 ,
를 기준으로 나누었을 뿐입니다.
그래서 레퍼런스 코드를 보면 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 코드나 유니코드와 씨름하는 날이 오실겁니다 🙂
// 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;
// }