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

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

알고리즘 문제 풀어보기

k진수에서 소수 개수 구하기

문제 설명

양의 정수 n이 주어집니다. 이 숫자를 k진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다.

- 0P0처럼 소수 양쪽에 0이 있는 경우
- P0처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
- 0P처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
- P처럼 소수 양쪽에 아무것도 없는 경우
- 단, P는 각 자릿수에 0을 포함하지 않는 소수입니다.

예를 들어, 101은 P가 될 수 없습니다.
예를 들어, 437674을 3진수로 바꾸면 211020101011입니다. 여기서 찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이 있으며, 총 3개입니다. (211, 2, 11을 k진법으로 보았을 때가 아닌, 10진법으로 보았을 때 소수여야 한다는 점에 주의합니다.) 211은 P0 형태에서 찾을 수 있으며, 2는 0P0에서, 11은 0P에서 찾을 수 있습니다.

정수 n과 k가 매개변수로 주어집니다. n을 k진수로 바꿨을 때, 변환된 수 안에서 찾을 수 있는 위 조건에 맞는 소수의 개수를 return 하도록 solution 함수를 완성해 주세요.

제한사항

1 ≤ n ≤ 1,000,000
3 ≤ k ≤ 10

풀이 코드

function isPrimeNumber(number) {
    if (number <= 1) {
      return false;
    }
    for (var i = 2; i <= Math.sqrt(number); i++) {
      if (number % i === 0) {
        return false;
      }
    }
    return true;
  }
  
  function solution(n, k) {
    var answer = 0;
    var num = n.toString(k);
    var numArr = num.split("0");
  
    for (var i = 0; i < numArr.length; i++) {
      if (isPrimeNumber(Number(numArr[i]))) {
        answer++;
      }
    }
  
    return answer;
  }

풀이 과정

소수를 판별하는 함수 isPrimeNumber을 만든다.
1. n을 k진수로 변환한다.
2. 변환한 숫자를 0을 기준으로 나눠 배열에 저장한다.
3. 해당 숫자가 소수면 answer++한다.

기술 면접 공부

[Language - Javascript]

3. async/await 이란 무엇인지 설명해주세요.

  • ES2017(ECMAScript 8)부터 추가된 자바스크립트의 비동기 처리 방식 중 하나이다.
  • 사용시 비동기 코드를 동기 코드처럼 작성할 수 있어, 가독성이 좋아지고 에러 처리가 간단해진다.

async

  • 함수 앞에 붙여서 해당 함수가 비동기 함수임을 나타냄.

  • async 함수 안에서 await 키워드를 사용하면 해당 비동기 작업이 완료될 때까지 코드 실행을 일시 중지하고 결과를 기다린 다음, 해당 결과를 반환한다.

  • 예제

async function getData() {
  const response = await fetch('/api');
  const data = await response.json();
  return data;
}
  • async 함수 getData를 정의하고, fetch 함수를 사용하여 URL에서 데이터를 가져오고, 해당 데이터를 JSON으로 파싱하는 작업을 비동기적으로 수행.
  • await를 사용하여 fetch와 json() 메서드를 기다리고, 데이터를 반환

await

  • 비동기 함수의 실행 결과를 기다리는 키워드.

  • 예제

async function getData() {
  try {
    const response = await fetch('/api');
    const data = await response.json();
    return data;
  } catch (error) {
    console.error(error);
  }
}
출처: https://trustmitt.tistory.com/85 [kohigowild:티스토리]
  • Promise 객체가 완료될 때까지 코드 실행을 일시 중지하므로, try-catch 블록 안에서 사용하여 에러 처리를 할 수 있다.
  • fetch에서 네트워크 에러가 발생할 경우, await 이후의 코드는 실행되지 않으며, catch 블록으로 제어가 넘어가 에러를 처리할 수 있다.

4. Hoisting이란 무엇인지 설명해주세요.

  • 단어 뜻 : 끌어올리기, 들어올려 나르기.
    => 스크립트 내 변수와 함수의 선언 순서에 상관없이 순서가 '끌어올려'진 듯한 현상.
    => 물리적으로 '끌어올려'지는 것이 아니라 자바스크립트 엔진이 먼저 전체 코드를 한번 스캔 후 실행 컨텍스트에 미리 기록해놓기 때문에 해당 현상이 발생한다.

함수 호이스팅

  • 예시
test();

function test() {
  document.writeln("Hoisting");
}

test();
  • 코드가 함수를 실행하는 test()코드보다 아래에 작성되었으므로 이론적으로 생각하면 맨 첫째줄 test()는 작동하지 않아야함.
    => 자바스크립트는 함수를 Hoisting하므로 첫째줄 test()코드도 정상 작동함.

변수 호이스팅

  • var
    • 선언, 초기화만 된채로 호이스팅, 할당은 호이스팅 되지 않음.
console.log(name); // undefined
var name = "James";
console.log(name); //James
  • const, let
console.log(name); // ReferenceError
const name = "James";

console.log(name); // ReferenceError
let name = "James";
  • 변수 선언 이전 라인에 해당 변수를 출력하는 코드를 작성한 경우 참조 오류 발생.
    => 오류는 발생했지만 호이스팅에 예외가 되는 것은 아님.
  • TDZ(Temporal Dead Zone)
    • 위의 예제에서 console.log(name)에서 에러가 발생했으므로 호이스팅이 안되는 것으로 보일 수 있다.
      => 호이스팅이 안되는 것이 아니라 호이스팅 되었지만 접근만못하게 된 것이라 이해하면 좋다.
    • console.log(name)가 작성된 라인, 해당 zone을 일시적으로 죽은 구역이라고 이해하면 된다.
      => 'name'의 선언문이 나오기 전까지는 'name'에 접근할 수 없다는 말이 된다.

최종 프로젝트

ERD Diagram, 패킷 명세서를 작성했다. 사용할 클라이언트는 MORPG로 정해졌다.
다른 두분의 팀원은 무언가 개인 사정과 건강상태로 인해 팀 프로젝트가 아닌 개인 과제쪽으로 이동하신 것 같다.. 그럼 조편성 이전에 정해주지...

0개의 댓글