Algorithm

알고리즘 스터디 (231003)

Jinmidnight 2023. 10. 4. 22:43

코딩테스트 최신 출제 경향

- 2~5시간 가량의 시간을 주어 여러 개의 정해진 알고리즘 문제들을 풀도록 함

- 구현, DFS/BFS(탐색), 탐욕 알고리즘 유형이 출제 빈도가 높은 편

 

코딩테스트 준비방법

- 알고리즘 유형별로 이론 및 핵심 문제를 10개 이상 풀어보기

- 대표적인 알고리즘 유형: 정렬, DFS/BFS, 구현, 완전 탐색, 탐욕 알고리즘

- 원하는 기업의 기출(혹은 유사한) 문제 풀기

 

알고리즘 설계 Tip

- Javascript를 기준으로 1억 번의 연산을 처리하기 위해 1~5초 가량의 시간이 소요됨

- 코딩 테스트 문제에서 시간 제한은 통상 1~5초 가량이다

- 문제에 명시되어 있지 않은 경우 대략 5초 정도라고 생각

- 시간제한이 1초인 문제를 만났을때, 일반적인 기준음 다음과 같다

  • N의 범위가 500인 경우: 시간 복잡도가 O(N^3)인 알고리즘을 설계하면 문제를 풀 수 있다
  • N의 범위가 2,000인 경우: 시간 복잡도가 O(N^2) 인 알고리즘을 설계하면 문제를 풀 수 있다.
  • N의 범위가 100,000인 경우: 시간 복잡도가 O(NlogN) 인 알고리즘을 설계하면 문제를 풀 수 있다.
  • N의 범위가 10,000,000인 경우: 시간 복잡도가 O(N)인 알고리즘을 설계하면 문제를 풀 수 있다.

 

Javascript 빠른 출력

- JavaScript로 코딩 테스트 문제를 풀 때, 출력 과정만으로 시간 초과를 받을 때가 있다

- 출력 시간을 단축하기 위해 다음과 같은 방법을 유용하게 사용할 수 있다

let answer = '';

/*
여러 출력 결과를 한 줄에 하나씩 출력할 때 매 번 console.log()를 실행하지 않고,
하나의 문자열에 결과를 저장해서 한꺼번에 출력하는 것이 대개 더 빠르게 수행됩니다
*/
for (let i = 1; i <= 100; i++) {
  answer += i + '\n'; // 문자열로 변환하여 기록
}

console.log(answer);

 

Javascript 기본 입력: fs 모듈

- 입력 데이터가 텍스트 파일 형태로 주어지는 경우, 파일 시스템 모듈을 사용한다

- 기능: 전체 텍스트를 읽어 온 뒤에, 줄바꿈 기호를 기준으로 구분하여 리스트로 변환하기

// readline 모듈보다는 fs를 이용해 파일 전체를 읽어 들여 처리하기
let fs = require('fs');
let input = fs.readFileSync('/dev/stdin').toString().split('\n');
// let input = fs.readFileSync('input.txt').toString().split('\n');

console.log(input);

 

Javascript 기본 입력: readline 모듈

- 한 줄씩 입력을 받아서, 처리하여 정답을 출력할 때는 readline 모듈을 사용할 수 있다

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

let input = [];
rl.on('line', function(line) {
  // 콘솔 입력 창에서 줄바꿈(Enter)를 입력할 때마다 호출
  input.push(line);
}).on('close', function() {
  // 콘솔 입력 창에서 Ctrl + C 혹은 Ctrl + D를 입력하면 호출(입력의 종료)
  console.log(input);
  process.exit();
});

 

Javascript 문법: Number와 String 형태 변환

/*
Int -> String
*/
let a = "777";
let b = Number(a);
console.log(b); // 777

/*
String -> Int
*/
let a = 777;
let b = String(a);
console.log(b); // "777

 

Javascript 문법: Array.prototype.reduce()

- 배열의 모든 원소에 대해 특정한 연산을 순차적으로 적용할 때 reduce()를 사용한다

/*
reduce() 메서드는 배열의 각 요소에 대해 reducer 함수를 실행한 뒤에 하나의 결과를 반환합니다.
reducer의 형태: (accumulator, currentValue) => (반환값)
- 배열의 각 원소를 하나씩 확인하며, 각 원소는 currentValue에 해당합니다.
- 반환값은 그 이후의 원소에 대하여 accumulator에 저장됩니다.
*/
let data = [5, 2, 9, 8, 4];

// minValue 구하기 예제
let minValue = data.reduce((a, b) => Math.min(a, b));
console.log(minValue); // 2

// 원소의 합계 구하기 예제
let summary = data.reduce((a, b) => a + b);
console.log(summary); // 28

 

Javascript 문법: 배열 초기화 방법

// 직접 값을 설정하여 초기화
let arr = [8, 1, 4, 5, 7];

// 길이가 5이고 모든 원소의 값이 0인 배열 초기화
let arr = new Array(5).fill(0);

 

Javascript 문법: 집합 자료형

let mySet = new Set(); // 집합 객체 생성

// 여러 개의 원소 삽입
mySet.add(3);
mySet.add(5);
mySet.add(7);
mySet.add(3);

console.log(`원소의 개수: ${mySet.size}`); // 3
console.log(`원소 7을 포함하고 있는가? ${mySet.has(7)}`); // true

// 원소 5 제거
mySet.delete(5);

// 원소를 하나씩 출력
for (let item of mySet) console.log(item);

 

Javascript 문법: 소수점 아래 특정 자리에서 반올림

// 특정 실수에 대하여 toFixed()를 이용해 소수점 아래 둘째 자리까지 출력
let x = 123.456;
console.log(x.toFixed(2)); // 123.46

 

Javascript 문법: Escape Sequence

- 예약 문자 혹은 특수 문자를 출력하기 위하여 이스케이프 시퀀스를 사용할 수 있다

 

시퀀스 문자
 \t
\\ 역 슬래시
\" 큰 따옴표
\' 작은 따옴표