내일배움캠프 Node.js 본캠프 70일차

김선우·2024년 11월 18일
post-thumbnail

알고리즘 문제 풀어보기

모음 사전

문제 설명

사전에 알파벳 모음 'A', 'E', 'I', 'O', 'U'만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 "A"이고, 그다음은 "AA"이며, 마지막 단어는 "UUUUU"입니다.

단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.

제한사항

word의 길이는 1 이상 5 이하입니다.
word는 알파벳 대문자 'A', 'E', 'I', 'O', 'U'로만 이루어져 있습니다.

풀이 코드

풀이 과정


문제의 사전은 해당 규칙을 통해 다음 문자가 바뀌는 것을 알 수 있다.

  • AAAAA가 AAAAE로 바뀌는데 필요한 수는 1이다.
  • AAAA가 AAAE로 바뀌는데 필요한 수는 6이다.(AAAA = 4번째, AAAE = 10번째, AAAI = 16번째)
  • AAA가 AAE로 바뀌는데 필요한 수는 31이다.(AAA = 3번째, AAE = 34번째)
    => 이 규칙을 배열로 나타내면.
const plus = [?, ?, ?, 1*5+1, 1];
const plus = [?, ?, 6*5+1, 6, 1];
const plus = [?, 31*5+1, 31, 6, 1];
const plus = [156*5+1, 156, 31, 6, 1];
const plus = [781, 156, 31, 6, 1];

위와 같은 값이 나오게 된다.

  • 따라서 바뀌기전 자리값+배열값을 해주면 바뀐 자리의 값이 나오게 된다.
    ex) AAE의 자리값 = 3(AAA의 자리값) + 31(배열값) = 34

해당 배열을 이용해 문제를 풀어보면 word의 길이만큼 반복하는 반복문을 만들어주고 indexOf를 이용해 각 자리의 몇번째 요소인지 탐색해준다.
n번째 요소는 그 앞 요소(n-1)값에 maxNums값을 곱해준 만큼 경우의 수를 가지므로 해당 값을 answer에 더해준다.

기술 면접 공부

7. 깊은 복사와 얕은 복사의 차이는 무엇이고 JS에서 각각을 구현하는 방법은 어떻게 되는지 설명해주세요.

  • 우선 JS는 원시 값참조 값이라는 두가지 데이터 타입의 값이 존재한다.
    • 원시 값 : 기본 자료형(단순한 데이터).
      • 변수에 저장하면 변수의 메모리 공간실제 데이터 값이 저장.
        => 할당된 변수를 조작하려고 하면 저장된 실제값이 조작됨.
      • Number, String, Boolean, Null, Undefined 등.
    • 참조 값 : 여러 자료형으로 구성되는 메모리에 저장된 객체.
      • 변수에 저장하면 독립적인 메모리 공간에 값을 저장하고 변수에 저장된 메모리 공간의 참조(위치 값)을 저장하게 됨.
        => 할당된 변수를 조작하는 것은 객체 자체를 조작하는 것이 아닌 해당 객체의 참조를 조작하는 것.
      • Object, Symbol 등.

얕은 복사

  • 객체를 복사할 때 원래 값과 복사된 값이 같은 참조를 가리키고 있는 것.
    => 객체의 참조 값 복사
  • 객체안에 객체가 있을 경우 한개의 객체라도 원본 객체를 참조하고 있으면 얕은 복사라고 함.

방법

Array.prototype.slice()
  • 대표적인 예.
  • start와 end를 설정하지 않으면 기존 배열을 전체 얕은 복사.
const original = ['a',2,true,4,"hi"];
const copy = original.slice(); 

console.log(JSON.stringify(original) === JSON.stringify(copy)); // true 

copy.push(10); 

console.log(JSON.stringify(original) === JSON.stringify(copy));// false

console.log(original); // [ 'a', 2, true, 4, 'hi' ]
console.log(copy); // [ 'a', 2, true, 4, 'hi', 10 ]
Object.assign(생성할 객체, 복사할 객체)
  • 첫 번째 인자로 빈 객체를 넣어주고 두 번째 인자로 복사할 객체를 넣어주면 됨.
const object = {  
  a: "a",  
  number: {    
    one: 1,    
    two: 2,  
  },
}; 

const copy = Object.assign({}, object); 

copy.number.one = 3; 

console.log(object === copy); // false
console.log(object.number.one  === copy.number.one); // true
Spread 연산자(전개 연산자)
const object = {
  a: "a",
  number: {
    one: 1,
    two: 2,  
  },
}; 

const copy = {...object} 

copy.number.one = 3; 

console.log(object === copy); // false
console.log(object.number.one  === copy.number.one); // true

깊은 복사

  • 객체 안에 객체가 있을 경우에도 원본과의 참조가 완전히 끊어진 객체.
    => 객체의 실제 값 복사.

방법

JSON.parse && JSON.stringify
  • JSON.stringify()는 객체를 json 문자열로 변환하는데 이 과정에서 원본 객체와의 참조가 모두 끊어짐.
    이후  JSON.parse()를 이용해 다시 원래 객체(자바스크립트 객체)로 만들어줌.
  • 가장 간단하고 쉬운 방법이지만 다른 방법에 비해 느리고 객체가 function일 경우, undefined로 처리한다는 것이 단점임.
const object = {  
  a: "a",  
  number: {    
    one: 1,    
    two: 2,  
  },  
  arr: [1, 2, [3, 4]],
}; 

const copy = JSON.parse(JSON.stringify(object)); 

copy.number.one = 3;
copy.arr[2].push(5); 

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false

console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }
재귀 함수를 구현한 복사
  • 복잡함.
const object = {  
  a: "a",  
  number: {    
    one: 1,   
    two: 2,  
  },  
  arr: [1, 2, [3, 4]],
}; 

function deepCopy(object) {   
  if (object === null || typeof object !== "object") { 
    return object; 
  }  
  // 객체인지 배열인지 판단  
  const copy = Array.isArray(object) ? [] : {};
  
  for (let key of Object.keys(object)) { 
    copy[key] = deepCopy(object[key]);  
  }   
  
  return copy;
  
} 

const copy = deepCopy(object); 

copy.number.one = 3;
copy.arr[2].push(5);

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false 

console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }
Lodash 라이브러리 사용
  • 설치를 해서 일반적인 개발에는 효율적이고 더 쉽고 안전하게 깊은 복사를 할 수 있음.
    • 코딩테스트에서는 사용할 수 없음.
const deepCopy = require("lodash.clonedeep") 

const object = {  
  a: "a",  
  number: {    
    one: 1,   
    two: 2,  
  },  
  arr: [1, 2, [3, 4]],
}; 

const copy = deepCopy(object); 

copy.number.one = 3;
copy.arr[2].push(5); 

console.log(object === copy); // false
console.log(object.number.one === copy.number.one); // false
console.log(object.arr === copy.arr); // false 

console.log(object); // { a: 'a', number: { one: 1, two: 2 }, arr: [ 1, 2, [ 3, 4 ] ] }
console.log(copy); // { a: 'a', number: { one: 3, two: 2 }, arr: [ 1, 2, [ 3, 4, 5 ] ] }

최종프로젝트

본격적으로 코드를 구현하기에 앞서 베이스를 제작했다.
migration과 쿼리 부분 한명, 로그인/회원가입 한명, 서버 구동파트 한명, 패킷부분 한명으로 나눠서 했고, 내가 서버 구동 파트여서 해당 부분 코드를 작성했다.
아마 내일 서로 맡은 부분을 합쳐보고 잘 되면 바로 기능구현으로 넘어갈 것 같다.

0개의 댓글