[백준 node.js] 1920번 수 찾기 (이진탐색) feat - 시간 초과, 메모리 초과

2022. 2. 9. 17:37·지난 글 모음
반응형

1920번 수 찾기

레벨: 실버 4

언어: JavaScript


문제풀러가기

문제설명

N개의 정수 A[1], A[2], …, A[N]이 주어져 있을 때, 이 안에 X라는 정수가 존재하는지 알아내는 프로그램을 작성하시오.

입력값

첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들이 A안에 존재하는지 알아내면 된다. 모든 정수의 범위는 -231 보다 크거나 같고 231보다 작다.

출력값

M개의 줄에 답을 출력한다. 존재하면 1을, 존재하지 않으면 0을 출력한다.

📑풀이 과정

이 문제는 이진탐색으로 문제를 풀 수 있다.

처음에는 includes() 함수로 포함되어 있는지 탐색했고 당연하게도 시간 초과가 나왔다.
includes() 함수의 시간복잡도는 O(n)이다. 선형으로 탐색한다는 말인데
N 과 M이 최대값으로 들어오게 된다면 모든 탐색하는데 10,000,000,000번이 걸릴 것이다.

그래서 이진탐색으로 문제를 풀었다.
이진탐색을 하기 위해서 처음 들어오는 N의 정수들을 정렬한다. 그리고 이진탐색을 구현하면된다.

📋풀이 코드

const fs = require("fs");
const filePath = process.platform === "linux" ? "/dev/stdin" : "./input.txt";
let input = fs.readFileSync(filePath).toString().trim().split("\n");
const A = input[1].split(" ").map((el) => +el);
const B = input[3].split(" ").map((el) => +el);

solution(A, B);
function solution(N, M) {
  N = N.sort((a, b) => a - b);
  let answer = [];
  M.forEach((el) => {
    let high = N.length - 1;
    let low = 0;
    let find = false; 
    while (low <= high) {
      let mid = Math.floor((high + low) / 2);

      if (el > N[mid]) {
        low = mid + 1;
      } else if (el < N[mid]) {
        high = mid - 1;
      } else {
        find = true;
        break;
      }
    }
    if(find){
        answer.push(1);
    }else{
        answer.push(0);
      }
  });
  console.log(answer.join('\n'))
}

메모리 초과 문제

이진탐색으로 문제를 풀고 제출 했는데 메모리 초과가 발생했다.

아래 처럼 하나 검사할 때 마다 1과 0을 출력하니 메모리 초과가 발생하였다.
그래서 위 풀이 코드와 같이 answer 배열에 저쟝 후 answer을 join하여 출력하니 해결되었다.
메모리 초과가 발생한 이유를 정확히는 모르겠어서 다 공부하고 내용을 추가하겠다.

 

 

메모리 초과가 발생한 코드
console.log(answer ? "1" : "0");

메모리 초과가 해결된 코드
console.log(answer.join('\n'))


반응형

'지난 글 모음' 카테고리의 다른 글

[SW 정글] 4기 시험, 면접 후기 feat - 합격!  (5) 2022.02.13
[백준 node.js] 2805번 나무자르기 이진탐색  (0) 2022.02.10
[백준 node.js] 1181번 단어 정렬 javascript  (1) 2022.02.09
[백준 node.js] 2292번 벌집 javascript  (0) 2022.02.08
[백준 node.js] 1259번 팰린드 롬수 javascript  (0) 2022.02.07
'지난 글 모음' 카테고리의 다른 글
  • [SW 정글] 4기 시험, 면접 후기 feat - 합격!
  • [백준 node.js] 2805번 나무자르기 이진탐색
  • [백준 node.js] 1181번 단어 정렬 javascript
  • [백준 node.js] 2292번 벌집 javascript
코딩하자영아
코딩하자영아
코딩공부내용 정리
  • 코딩하자영아
    코드치고 무게치고
    코딩하자영아
  • 전체
    오늘
    어제
    • 분류 전체보기 (84)
      • 개발 (3)
      • 지난 글 모음 (81)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    PINTOS
    정글sw
    React
    sw 정글
    Spring
    회원가입
    코딩테스트
    리액트
    프로그래머스
    html input
    HTML
    python
    Express
    dfsbfs
    Coding Test
    conding test
    javascript
    sw정글사관학교
    malloc-lab
    템플릿 문자열
    목록 창 만들기
    JavaScrpit
    자바스크립트
    SW정글
    사용자 정의 객체
    회원가입 폼
    자바스크립트 문자열 변수
    node.js
    백준
    onChange
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
코딩하자영아
[백준 node.js] 1920번 수 찾기 (이진탐색) feat - 시간 초과, 메모리 초과
상단으로

티스토리툴바