백준 2346 메모리 초과...

렐루·2024년 1월 31일
0

백준

목록 보기
1/1
post-thumbnail

아래의 코드는 백준 문제를 자바스크립트로 푼 코드입니다..
하루종일 풀었는데 메모리 초과라는 결과를 받았네요 ㅠㅜ

const input = ["5", "3 2 1 -3 -1"];

원형 양방향 연결 리스트를 이용한 문제풀이
문제를 잘 읽자
코드를 하루종일 작성했는데... 메모리 초과라니..
const fs = require("fs");
const input = fs.readFileSync("/dev/stdin").toString().trim().split("\n");
const Node = function (data) {
  this.data = data;
  this.prev = null;
  this.next = null;
};
const CurrleLinkedListClass = class {
  constructor() {
    // 삭제가 진행시에 사용가능
    this.poninter = null;
    this.size = 0;
  }
  movePointer() {
    this.poninter = this.poninter.next;
  }

  append(data) {
    let node = new Node(data),
      prev,
      next;
    if (this.poninter != null) {
      prev = this.poninter;
      if (this.size === 1) {
        prev.prev = node;
        prev.next = node;
        node.prev = prev;
        node.next = prev;
      } else {
        next = prev.next;
        prev.next = node;
        node.prev = prev;
        node.next = next;
        next.prev = node;
      }
    }
    this.poninter = node;
    this.size++;
  }

  remove(index) {
    const isPositive = index > 0;
    let count = isPositive ? 1 : 0,
      prev,
      next,
      returnData;

    if (this.size === 0) {
      return false;
    }
    if (this.size === 1) {
      returnData = this.poninter.data;
      this.poninter.data = null;
      this.size = 0;
      return returnData;
    }
    while (index !== "0" && +index !== count) {
      // 여기서는 카운트 올려주면서 next로 이동시키기
      if (isPositive) {
        this.poninter = this.poninter.next;
        count++;
      } else {
        this.poninter = this.poninter.prev;
        count--;
      }
    }
    prev = this.poninter.prev;
    next = this.poninter.next;

    returnData = this.poninter.data;
    delete this.poninter;
    this.poninter = next;
    prev.next = next;
    next.prev = prev;
    this.size--;

    return returnData;
  }
};
const myCurrleLinkedList = new CurrleLinkedListClass();
const insideNumList = input[1].split(" ");
let resultString = "";
for (let i = 1; i <= input[0]; i++) {
  myCurrleLinkedList.append(i);
}
myCurrleLinkedList.movePointer();
// 삭제하는 코드 작성
let indexNum = myCurrleLinkedList.remove("0");
resultString += indexNum;
for (let i = 0; i < input[0] - 1; i++) {
  indexNum = myCurrleLinkedList.remove(insideNumList[indexNum - 1]);
  resultString += ` ${indexNum}`;
}

console.log(resultString);

확인해보니까 다른 분들도 같은 어려움을 겪었던거 같은데 확실히 백준의 다른 문제들과 훨씬 적은 양의 메모리를 허용하고 있는 것을 확인할 수 있었습니다...

4메가 밖에 안준다니... 사실 저게 얼마큼의 양인지는 잘 모릅니다 ㅎ 그렇지만 아래 사진에서 비슷한 문제에 할당해주는 메모리만 봐도 차이가 250배 이상 나는 것을 볼 수 있습니다..

그럼 문제를 자바스크립트로 푸는 것은 깔끔하게 포기!! 하고
제 코드는 얼만큼의 메모리를 사용하는지 궁금해졌습니다.

찾아보니까 이런 주옥같은 포스팅이 있었습니다.
https://systorage.tistory.com/entry/Nodejs-nodejs%EC%97%90%EC%84%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%82%AC%EC%9A%A9%EB%9F%89%EC%9D%84-%ED%99%95%EC%9D%B8%ED%95%98%EB%8A%94-%EB%B0%A9%EB%B2%95

블로그의 코드를 긁어서 한번 사용해봅시다.

const used1 = process.memoryUsage().heapUsed / 1024 / 1024;
console.log(`${Math.round(used1 * 100) / 100} MB의 메모리를 사용중입니다.`);

오잉 얼마 안쓰는거 같은데 왜죠...?
이러면 0.05만 줄이면 가능하다는 말일까요...?

근데 생각해보니까 제 코드는 파일을 읽어오고 분리하는 코드를 스킵했네요..

파일 하나 만들어서 불러와볼까요 그럼?


확실히 좀더 쓰긴 합니다.

파일 불러오는 코드는 아무 파일이나 만든 다음(파일 확장자는 txt) 우클릭 해서 파일 경로를 위의 코드 경로에 바꿔서 넣음 됩니다.

백준에서 제시한 테스트 케이스는 몇 자 안되는데 1000자까지 가능하니 만약에 천자 다 불러오면 4메가는 그냥 넘겠네요 ㅜㅜ

다른 문제처럼 400까지만 열어줘도 너끈할 것 같은데 말이죠 ㅜㅠ.

나중에 다른 언어도 같이 공부하게 되면 도전해보겠습니다.
읽어주셔서 감사합니다!

profile
프론트 공부중입니다!

0개의 댓글