본문 바로가기
백준 알고리즘/기타

[JS] 알고리즘 문제 풀이 용 자바스크립트 문법 (업데이트 중)

by 웅대 2024. 6. 1.
728x90
반응형

평소에 웹 개발을 하며 자바스크립트는 자주 사용했지만 이번 코테에 자바스크립트를 쓰려고 하니 생소한 부분이 있어서 코테용 자바스크립트 문법을 정리해보려고 한다.

 

입출력

입력은 기본적으로 fs 모듈의 readFileSync를 사용한다.

 

그리고 입력 양 끝에 공백 혹은 newline이 있을 때를 대비해서 trim()을 붙이는게 좋다.

 

하지만 주로 파일을 읽을 때 사용하는 것이라서 알고리즘 문제 풀이를 위해서 적절한 타입으로 변환해야 한다. 

 

1. 문자열 입력

const fs = require("fs");
const input = fs.readFileSync(0).toString().trim();

2. 숫자 입력

const fs = require("fs");
const input = Number(fs.readFileSync(0).toString().trim());

3. 여러 줄 입력
newline으로 split

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

3. 여러 줄의 숫자 입력
문자열을 split으로 분리하고 map으로 Number로 변환

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

4. 구조 분해 할당
지금까지는 배열에 저장하였는데 이를 바로 변수로 받을 수도 있다.

const fs = require('fs');
const [ a, b ] = fs.readFileSync(0).toString().trim().split('\n').map((item)=>Number(item));

 

연산

1. 소숫점 반올림

 

실수의 소숫점을 고정할 수 있다.

만약 toFixed(2)라고 한다면 소숫점 세 번째 자리에서 반올림하여 소숫점을 두 자리로 고정한다.

 

const a = 1.236
console.log(a.toFixed(1))
console.log(a.toFixed(2))

 

출력

1.2
1.24

 

2. 합계

자바스크립트는 기본적으로 sum과 같은 합계를 구하는 내장 함수가 없다.

 

대신 reduce를 사용해서 합계를 구현할 수 있다.

arr= [1, 2 ,3];
const sum = arr.reduce((acc, num) => acc+num);

 

reduce를 사용해서 모든 요소를 곱하는 것도 가능하다.

arr= [1, 2 ,3];
const sum = arr.reduce((acc, num) => acc*num);

 

두 번째 인자로 초기값을 넣어줄 수도 있다.

3. 평균

역시 reduce를 사용해서 구할 수 있다.

arr= [1, 2 ,3];
const sum = arr.reduce((acc, num) => acc*num);
const average = sum/arr.length

 

배열 

1. 2차원 배열 입력 

const fs = require('fs')

const input = fs.readFileSync(0).toString().trim().split('\n')
const arr = input.map((temp)=>temp.split(' ').map(Number))

 

newline을 기준으로 split 하고 그 배열을 돌면서 다시 한 번 공백을 기준으로 split하면 된다.

 

2. 2차원 배열 생성

N x N 크기의 2차원 배열의 모든 값을 0으로 초기화하여 생성해보자.

let arr = Array(n).fill(0).map((item)=>Array(n).fill(0))

3. 2차원 배열 깊은 복사

map을 통해 원본 2차열 배열을 돌면서 전개 연산자를 통해 새로운 배열을 만들어주면 된다.

const temp = arr.map((item)=>[...item])

 자료구조

1. Map

자바스크립트의 Map은 key-value 쌍을 저장할 수 있는 자료구조로 삽입, 조회, 삭제, 키 존재 여부를 파악할 때의 시간 복잡도가 O(1)이다. 

1. 생성
const map = new Map()

2. 삽입
map.set("key", "value")

3. 조회 
map.get("key")

4. 삭제
map.delete("key")

5. 키 존재 여부
map.has("key")

 

2. Set

자바스크립트의 Set은 중복된 값을 허용하지 않는 자료구조로 삽입, 조회, 삭제, 키 존재 여부를 파악할 때의 시간 복잡도가 O(1)이다. 

1. 생성
const map = new Set()

2. 삽입
set.add("value")

3. 조회 
set.has("value")

4. 삭제
set.delete("delete")

5. 키 존재 여부
map.has("key")

 

정렬

자바스크립트에서는 sort 메소드를 사용하여 배열을 정렬할 수 있다.

 

그런데 기본적으로 sort는 내부 요소들을 문자열로 변환하는 과정이 있기 때문에 정수 배열의 경우 원하는 결과를 얻지 못할 수 있다.

 

이 때 정렬 기준을 콜백 함수로 넣어주면 된다.

 

1. 오름차순

const arr = [1, 2, 3, 7, 54]
arr.sort((a, b)=>a-b)

 

2. 내림차순

const arr = [1, 2, 3, 7, 54]
arr.sort((a, b)=>b-a)

 

다만 문자열들의 배열을 사전 순으로 정렬해야 한다면 위와 같은 방식으로 할 수 없다.

 

문자열들을 사전 순으로 정렬할 때는 비교 연산자를 사용해야 한다.

 

1. 사전 순 오름차순

const arr = ['f', 'a', 'c', 'd', 'e']
arr.sort((a, b)=>{
	if (a > b){
    	return 1;
    }
    else {
    	return -1;
    }
}
)

 

2. 사전 순 내림차순

const arr = ['f', 'a', 'c', 'd', 'e']
arr.sort((a, b)=>{
	if (a < b){
    	return 1;
    }
    else {
    	return -1;
    }
}
)

 

아스키 코드 변환

문자 -> 아스키 코드 변환 (charCodeAt)

'A'.charCodeAt();

 

아스키 코드 -> 문자 변환 (fromCharCode)

 

String.fromCharCode(97)

 

 

문자열 순회

"abc"라는 문자열을 순회하면서 각 문자들을 출력해보자.

 

for, of 사용

const s = "abc";
for (let char of s){
	console.log(char);
}

 

배열로 변환 후 배열 순회

const s = "abc";
[...s].forEach((char)=>{
	console.log(char);
});

 

문자열 문자 찾기

문자가 처음으로 등장하는 인덱스

"abcdcba".indexOf('a');

 

문자가 마지막으로 등장하는 인덱스

"abcdcba".lastIndexOf('a');
728x90
반응형

댓글