본문 바로가기

알고리즘&코테

[코테 꿀팁] 시간 초과 발생 시 console.log 줄이기

코딩 테스트를 진행하다 보면 이상하게 시간 초과가 발생하는 일이 있습니다.

 

그럴 때 console.log()를 많이 사용했는지 확인해보아야 합니다.

 

출력이 많은 문제의 경우 console.log()를 많이 사용했을 때 시간 초과가 발생하는 경우가 있습니다.

 

예를 들어 백준의 28278번

// 시간 초과 코드
const input = require("fs")
  .readFileSync("dev/stdin")
  .toString()
  .trim()
  .split("\n");
const N = Number(input[0]);
const stk = [];
const cmd = {
  1: (x) => {
    stk.push(x);
  },
  2: () => {
    console.log(stk.length ? stk.pop() : -1);
  },
  3: () => {
    console.log(stk.length);
  },
  4: () => {
    console.log(stk.length ? 0 : 1);
  },
  5: () => {
    console.log(stk.length ? stk[stk.length - 1] : -1);
  },
};

for (let i = 1; i < input.length; i++) {
  const str = input[i];
  if (str[0] == 1) {
    const [_, x] = str.split(" ");
    cmd[1](Number(x));
  } else {
    cmd[str[0]]();
  }
}

코드 결과

 

// 맞은 코드
const input = require("fs")
  .readFileSync("dev/stdin")
  .toString()
  .trim()
  .split("\n");
const N = Number(input[0]);
const stk = [];
let ret = "";
const cmd = {
  1: (x) => {
    stk.push(x);
  },
  2: () => stk.length ? stk.pop() : -1,
  3: () => stk.length,
  4: () => stk.length ? 0 : 1,
  5: () => stk.length ? stk[stk.length - 1] : -1,
};

for (let i = 1; i < input.length; i++) {
  const str = input[i];
  if (str[0] == 1) {
    const [_, x] = str.split(" ");
    cmd[1](Number(x));
  } else {
    ret += cmd[str[0]]();
    ret += '\n';
  }
}

console.log(ret.trim());

코드 결과

큰 로직의 변경 없이 단순하게 ret이라는 문자열 변수를 두고 결과를 해당 변수에 저장해서 한 번에 출력하면 시간 초과 문제가 해결됩니다.

 

추가로 문자열 변수가 아니더라도 배열을 변수로 두고 join('\n')을 통해서 해결하는 방법도 있습니다.