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

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

알고리즘 문제 풀어보기

타겟 넘버

문제 설명

n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.

-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3

사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.

제한사항

주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
각 숫자는 1 이상 50 이하인 자연수입니다.
타겟 넘버는 1 이상 1000 이하인 자연수입니다.

풀이 코드

function solution(numbers, target) {
    var answer = 0;
    function dfs(index, sum) {
      if (index == numbers.length) {
        if (sum == target){
            answer++;
        }
        return;
      }
      dfs(index + 1, sum + numbers[index]);
      dfs(index + 1, sum - numbers[index]);
    }
    
    dfs(0, 0);
  
    return answer;
  }

풀이 과정

DFS알고리즘을 이용해 풀었다.
우선 DFS 재귀함수의 탈출 조건으로 index와 numbers.length가 같아지면 리턴하는 조건문을 만들고 해당 조건문 안에서 sum과 target값이 같아지면 answer에 1을 더해주는 조건문을 만든다.
이제 수행동작을 만들어 줘야 하는데 수행동작은

    1. (+) 연산자가 붙은 플러스하는 경우의 수
    1. (-) 연산자가 붙은 마이너스하는 경우의 수

가 된다.
1번 동작의 경우에는 누적 합계에 현재 인덱스 번째 숫자를 더해서 다음 dfs함수를 call해주고,
2번 동작의 경우에는 누적 합계에 현재 인덱스 번째 숫자를 빼서 다음 dfs함수를 call해줬다.

기술 면접 공부

[Language - Javascript]

1. var, let, const 에 대해 설명해주세요.

  • 세가지 방식이 모두 JS에서 사용하는 변수 선언 방식이다.
  • 예문을 들어서 차이점을 확인해보자.

var

var a = 5; 
console.log(a); // 5

var a = 10;
console.log(a); // 10

a = 15;
console.log(a); // 15
  • var의 경우 중복 선언재할당이 모두 가능하다.
  • 마지막에 할당된 값이 최종 변수의 값으로 저장된다.

function hello(){
    var a = 10;
    console.log(a);
}

hello(); // 10

console.log(a);  //ReferenceError: a is not defined
  • var은 함수 단위 스코프(function-level scope)이다.
  • var 변수가 선언된 함수 내부의 어디서든 참조가 가능하지만, 외부로는 참조가 불가능하다.
    또, 함수 내부에서 선언된 var은 지역변수로 간주하지만, 함수 외부에서 var이 선언되었다면 전역변수로 간주한다.

console.log(a);  // undefined :: 변수 선언 이전에 변수 참조 가능

var a  // 초기화

console.log(a);  // undefined

a = 10  // 할당

console.log(a);  // 10
  • var은 호이스팅이 발생한다.
  • 뒤에 선언된 변수 a 가 앞에 참조되어도 에러가 아닌 undefined가 호출된다.

let

let a = 5;
let a = 10;
cnosole.log(a); // SyntaxError: Identifier 'a' has already been declared
  • let의 경우 중복 선언이 불가능하다.
  • 중복 선언을 하게 되면 SyntaxError가 발생한다.
let a = 5;
console.log(a); // 5

a = 10;
console.log(a); // 10
  • 재할당은 let에서도 가능하다.

function hello() {
	let a = 5;
    console.log(a); // 5
}

console.log(a); // ReferenceError: a is not defined
  • let 은 블록 단위 스코프(block-level scope)이다.
  • { }블록 내부에서 선언된 let 변수는 외부에서 참조되지 않는다.

console.log(a);  // ReferenceError :: 변수 선언 이전에 변수 참조 불가능

let a  // 초기화

console.log(a);  // undefined

a = 10  // 할당

consloe.log(a);  // 10
  • let 은 호이스팅이 발생하지만 다르게 작동한다.
  • 변수로 선언 시 변수의 선언과 초기화 사이에 일시적으로 변수값을 참조할 수 없는 구간인 TDZ(Temporal Dead Zone)가 존재하기 때문에 벌어지는 현상이다.
    => 호이스팅이 발생하지만 값을 참조할 수 없기 때문에 동작하지 않는 것 처럼 보인다.

const

const a = 5;
const a = 10;
cnosole.log(a); // SyntaxError: Identifier 'a' has already been declared

ㅡㅡ

const a = 5;
console.log(a); // 5

a = 10;
console.log(a); // TypeError: Assignment to constant variable.
  • const는 상수를 선언하는 키워드이기 때문에 중복 선언재할당이 모두 불가능하다.
    => 처음 선언과 초기화를 하고 나면 다른 값을 재할당 할 수 없어진다.

function hello() {
	const a = 5;
    console.log(a); // 5
}

console.log(a); // ReferenceError: a is not defined
  • const 는 블록 단위 스코프(block-level scope)이다.
  • { }블록 내부에서 선언된 const 변수는 외부에서 참조되지 않는다.

console.log(a);  // ReferenceError :: 변수 선언 이전에 변수 참조 불가능

const a  // 초기화

console.log(a);  // undefined

a = 10  // 할당

consloe.log(a);  // 10
  • const 는 호이스팅이 발생하지만 다르게 작동한다.
  • 변수로 선언 시 변수의 선언과 초기화 사이에 일시적으로 변수값을 참조할 수 없는 구간인 TDZ(Temporal Dead Zone)가 존재하기 때문에 벌어지는 현상이다.
    => 호이스팅이 발생하지만 값을 참조할 수 없기 때문에 동작하지 않는 것 처럼 보인다.

정리

varletconst
중복 선언과 재할당중복 선언과 재할당 모두 o중복 선언 x 재할당 o중복 선언과 재할당 모두 x
스코프 범위함수 단위 스코프(function-level scope)블록 단위 스코프(block-level scope)블록 단위 스코프(block-level scope)
호이스팅발생발생하지만 값을 참조할 수 없음발생하지만 값을 참조할 수 없음

2. Promise란 무엇인지 설명해주세요.

Promise

  • 어떤 작업에 관한 상태 정보를 가지고있는 객체.
  • 작업의 결과가 promise객체에 저장됨.
    • promise객체를 보면 작업이 성공했는지, 실패했는지 알 수 있음.
  • 자바스크립트 비동기 처리에 사용되는 객체.
    • 비동기 처리 : 특정 코드의 실행이 완료될 때까지 기다리지 않고 다음 코드를 먼저 수행하는 자바스크립트의 특성.

3가지 상태

  • pending
    • 작업이 진행중임을 의미.
  • fulfilled
    • promise 객체가 fulfilled 상태가 되면 promise객체는 작업의 성공 결과도 가지게 됨.
  • rejected
    • promise 객체가 rejected 상태가 되면, promise객체는 작업의 실패 이유에 관한 정보도 가지게 됨.
  • pending 상태에서 한번 fulfilled 상태 또는 rejected 상태가 되면 다시 다른 상태를 가질 수 없음.

필요한 이유(사용 이유)

  • 비동기 작업을 순차적으로 실행하기 위해 사용.
  • callback 함수가 많아지면 callback 지옥에 빠져 가독성이 낮아짐.
    • 이때 callback 함수를 보기 좋게 하기 위해서 사용.

최종 프로젝트

팀원이 6명인데 어제부터 해서 아직 2명이 접속을 하지 않았다.
일단 Project Convention 등 프로젝트에 관한 내용은 내일 작성해보기로 하고 오늘은 Github Rules, Code Convention 등 개발환경과 그룹 규칙에 대한 것들을 작성했다.

0개의 댓글