목록전체 글 (74)
JS' 공부흔적
1차원 배열의 경우는 스프레드 연산자를 통해서 아래와 같이 배열을 새로 복사할 수 있었다. let arr=[1,2,3]; let arr2=[...arr]; arr2.push(4); arr2[1]=10; // 두 배열이 다르게 출력됨 console.log(arr); // [ 1, 2, 3 ] console.log(arr2); // [ 1, 10, 3, 4 ] 스프레드 연산자를 통한 복사는 사실 얕은 복사이다. 얕은 복사는 한 단계까지만 복사한다. 항상 배열이나 객체가 생성이 되기 때문에 그 자체는 다른 것으로 평가되지만, 그 내부에 중첩되어있는 요소들은 같은 것으로 평가된다. 따라서 2차원 배열의 경우에는 의도한 대로 복사되지 않는 것을 확인할 수 있다. 2차원 배열을 깊은 복사하고 싶다면 아래와 같이 각..
2023년의 첫 번째 글 !! 프로그래머스의 경우, 입출력을 상관하지 않고 함수만 작성해주면 되었지만 백준에서는 입출력을 직접 해줘야한다. 프론트엔드 직군을 준비하면서 자바스크립트로 코딩테스트를 준비한다면 백준에서 node.js를 선택해야하는데, 이때 입력값을 받는 과정이 꽤 복잡하다. 2가지 방법이 있는데 fs 모듈을 사용하는 방법과 readline을 사용하는 방법이다. readline은 시간초과가 날 때가 있다고 하니 이 글에서는 fs 모듈을 사용하는 방법에 대해 작성한다. 우선, 예제 입력으로는 아래 입력을 사용하겠다. 참고로 백준 1260번 문제이다. https://www.acmicpc.net/problem/1260 example.txt 파일을 생성하여 아래 입력값을 붙여준다. 4 5 1 1 2 ..
자바스크립트에는 딱 2차원 배열이라는 개념이 없다. 즉, let arr = [][]; 와 같은 선언이 불가능하다. 그래서 배열 안에 배열을 중첩하는 식으로 2차원 배열을 비슷하게 만들어줘야 한다. 이때 Array.from() 이라는 메서드를 사용한다. 이 메서드는 문자열, set, map, 배열 등의 각 요소를 얕게 복사하여 새로운 배열을 만들어주는 역할을 한다. 예를 들면 아래와 같이 동작한다. console.log(Array.from('apple')); // [ 'a', 'p', 'p', 'l', 'e' ] console.log(Array.from(new Set(['foo', 2]))); // [ 'foo', 2 ] from의 두 번째 인자에는 콜백 함수를 옵션으로 넣을 수 있다. 이 콜백 함수는 각..
JS에서는 charCodeAt과 fromCharCode 함수를 사용하여 아스키 코드를 변환한다. charCodeAt(idx) 해당 인덱스의 문자열을 아스키 코드 번호로 변환해준다. let str = "Hello World!"; // 1번 인덱스값인 e의 아스키 코드 번호 101이 출력된다. console.log(str.charCodeAt(1)); // 101 fromCharCode(num) 아스키 코드 번호 num에 해당하는 문자열을 나타낸다. console.log(String.fromCharCode(101)); // e console.log(String.fromCharCode(72, 101, 108, 108, 111)); // Hello
JS에서 문자열의 값을 대체하는 방법은 replace를 사용하는 것이다. 그러나 replace는 처음 발견한 문자에 대해서만 적용된다. 예를 들면 아래와 같다. let str = "Hello World!"; str = str.replace("l", "r"); console.log(str); // Herlo World! (첫 번째 l만 r로 대체된다!) 이를 해결하기 위해 replaceAll 함수가 있다면 정말 좋겠지만, JS에는 존재하지 않는다. 따라서 직접 유사하게 만들어야 하는데 정규식을 사용하여 문자열 전체에 대해 대체 작업을 수행하도록 하면 된다. let str = "Hello World!"; str = str.replace(/l/g, "r"); console.log(str); // Herro W..
배열 내의 중복된 값을 제거하기 위해서는 Set 객체를 활용하면 된다. Set은 ES6에서 등장한 새로운 데이터 object이다. Set은 Unique한 값만 저장할 수 있기 때문에 아래와 같이 활용하면 된다. let arr = [1,2,2,3,3,3,4,4,5,5,5]; let setObj = new Set(arr); // Set 객체를 생성하여 arr를 넣어주면 유일한 값을 가지는 객체가 된다. let uniqueArr = [...setObj]; // 이 Set 객체 내의 값을 배열에 복사해주면 유일한 값을 가지는 배열이 만들어진다. console.log(uniqueArr); // [1,2,3,4,5]
splice 함수에 대해 그때그때 찾아보기만 하다가 잘 기억하지 못 하게 되면서 아예 직접 정리를 하기로 결심했다. splice 함수 배열의 기존 요소를 삭제하거나 추가하여 배열의 내용을 변경할 때 사용한다. splice의 형태는 아래와 같다. array.splice(start, deleteCount,item1, item2, ...); start는 배열의 변경을 시작할 인덱스이다. 배열의 길이보다 크거나 같은 값이라면 그냥 무시된다. start가 음수라면 배열의 끝에서부터 요소를 센다. 예를 들어 -1이라면, 배열의 가장 끝 요소를 가리킨다. 만약 음수일 때, 절대값이 배열의 길이보다 크다면 0으로 설정된다. deleteCount는 배열에서 제거할 요소의 수이다. 이를 생략하거나 start부터 배열 끝까..
배열에서 두 요소를 서로 바꾸고 싶을 경우 직접 구현을 해야한다. 가장 기본적인 방법은 tmp 변수를 사용하는 것인데 아래와 같다. const arr=[1,2,3,4,5]; let tmp=arr[1]; arr[1]=arr[2]; arr[2]=tmp; console.log(arr); // [1,3,2,4,5] 만약 두 요소만이 아닌 좀 더 자유도가 높게 위치를 변경하고 싶다면 구조 분해 할당을 사용하면 된다. 구조 분해 할당은 배열이나 객체의 속성을 해체해서 그 값을 개별 변수에 담을 수 있게 하는 Javascript의 표현식이다. 구조 분해 할당을 사용하면 아래와 같이 쓸 수 있다. const arr=[1,2,3,4,5]; [arr[1], arr[2]] = [arr[2], arr[1]]; console...
JS에서 배열을 오름차순 정렬을 하기 위해서는 sort() 함수를 쓰면 된다. 그러나 아래와 같은 문제가 발생한다. const arr=[1, 10, 3, 2]; arr.sort(); console.log(arr); // [ 1, 10, 2, 3 ] 우리가 원하는 결과는 [1, 2, 3, 10] 인데 이상한 결과가 출력된다. 이 문제를 해결하기 위해서는 sort() 안에 compareFunction을 사용해야한다. compareFunction은 정렬 순서를 정의하는 함수이다. 이를 사용하지 않게 되면, 배열 내의 원소들이 문자열로 취급되기 때문에 유니코드 값 순서대로 정렬된다. 따라서 위와 같은 결과가 발생한 것이다. compareFunction은 2개의 배열 원소를 파라미터로 입력 받는다. 예를 들어, ..
맨날 C++로 알고리즘 문제를 풀다가 요즘 JS로 문제를 풀고 있다. JS의 함수를 사용하여 문자열 뒤집기를 알아보자. "Hello World!" 라는 문자열이 있다고 하자. 우선 reverse() 함수를 사용하면 되는데 이를 사용하기 위해서는 문자열을 배열 형태로 만들어야 한다. 따라서 문자 하나씩 배열에 넣기 위해 split() 함수를 사용한다. const str = "Hello World!"; str.split(''); /* [ 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' ] */ 그 후에 reverse() 함수를 써주게 되면 아래와 같다. str.split('').reverse(); /* [ '!', 'd', 'l', 'r', 'o', ..