IT/Front-End

[JS] 코딩테스트 입문

KimCookieYa 2023. 8. 18. 02:58

배경

React.js 프론트엔드 개발자에 대한 길을 열어두게 되면서 자바스크립트 코딩테스트를 준비할 필요성을 느꼈다. 요즘 많은 프론트엔드 직군의 코딩테스트에 JS가 요구되기 때문에 크래프톤 정글 코치님들도 코테를 아예 JS로 준비할 것을 권장하셨다. 그래서 문제를 풀어보면서 익숙해지는 중인데... 어려운 건 아니지만, "번거롭다".

 

입력

JS 코테의 가장 번거로운 부분이 바로 "입력"이다. <input> 태그로 입력을 받는 웹 개발과는 달리 콘솔 입력을 받기 위해서는 "fs"와 "readline"이라는 별도의 라이브러리를 호출해야 한다. JS의 태생이 일반 개발 언어가 아니라 웹 개발 언어임을 고려하면 이해할 수 있는 부분이지만... 그래도 번거롭다. Node.js 에서 입력을 받기 위해서는 라이브러리를 호출해야 한다고 한다.

 

fs

const fs = require('fs');
const input = fs.readFileSync(0).toString().trim().split('\n');

한번에 테스트케이스의 모든 입력을 받는 코드이다. 벌써부터 번거롭다. Python이면, input() 이면 끝난다.

 

readline

const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', (line) => {
  data.push(line);
  // data = line.split(' ').map((el) => parseInt(el));
});

rl.on('close', () => {
  console.log(Number(data[0]) + Number(data[1]));
  reader.close();
  process.exit();
});

readline은 더 번거롭다. 이걸 외워서 코딩테스트를 칠 생각을 하니 벌써부터 어지럽다. 하아..

 

출력

출력은 웹 개발과 똑같이 console.log()로 찍으면 된다.

 

Number

// string을 Number로 변환하려면
const result = Number(data);

// string[]을 Number[]로 변환하려면
const result = datalist.map(Number);

 

반복문

배열 datalist에 대해 map과 forEach 메서드를 사용해서 배열의 각 요소에 대해 어떤 함수를 실행할 수 있게 해준다. 같은 기능을 수행하는 것 같지만, 두 메서드 사이에는 중요한 차이점이 있다.

 

  • map: 배열의 각 요소에 주어진 함수를 적용한 후 그 결과로 새로운 배열을 반환한다. 원본 배열을 수정되지 않는다.
  • forEach: 배열의 각 요소에 대하여 주어진 함수를 실행하지만 값을 반환하지 않는다. 정확히는 undefined를 반환한다. 주로 배열을 순회하면서 어떤 동작을 수행하는 데 사용된다.

* 중요한 사실은 map과 forEach는 엄연히 for 루프와는 다르다는 것이다.

* 콜백 함수를 실행하기 때문에, for에서 반복을 스킵하고 종료할 수 있는 'continue'와 'break'는 사용할 수 없다.

* forEach에서 현재 반복을 스킵하려면 'return' 문을 사용하여 현재의 콜백 함수를 즉시 종료할 수 있다.

* forEach에서 'break'는 쓸 수 없다. for문으로 바꾸는 수 밖에 없다.

 

const numbers = [1, 2, 3, 4, 5];

numbers.forEach(num => {
  if (num === 3) {
    return;  // 3일 때 현재 반복을 스킵합니다.
  }
  console.log(num);
});

// 출력: 1, 2, 4, 5

 

Math

Python에서 기본 숫자 함수들이 Math 객체에 담겨있다.

 

  • Math.abs();
  • Math.ceil();
  • Math.floor();
  • Math.round();
  • Math.max([]);
  • Math.pow(x, y); // x ^ y
  • Math.sqrt(x);
  • Math.random(); // 0 <= n < 1