코딩테스트 연습
leetcode 코딩테스트 연습 - 2666. Allow One Function Call (JavaScript)
이 문제는 클로저를 활용하여, 단 한 번만 호출되는 함수를 만드는 것이 목적이다. isCalled라는 변수를 사용하여 한 번 호출된 뒤에는 다시 호출될 수 없도록 문제를 해결하였다. var once = function(fn) { let isCalled = false; return function(...args){ if(!isCalled) { isCalled = true; return fn(...args); }else { return; } } }; 자바스크립트의 함수 특징을 사용한 문제였다.
leetcode 코딩테스트 연습 - 2637. Promise Time Limit (JavaScript)
이번 문제는 Promise를 사용하는 함수와 시간제한이 있을 때, 이 함수가 시간 제한 내에 실행이 끝나는지를 판별하는 코드를 작성해야 했다. setInterval을 사용하여 시간을 재고 이 시간이 끝나기 전에 성공하는지 실패하는지 확인하는 방법으로 코드를 작성하려고 했는데, 생각처럼 되지 않았고 결국 다른 사람의 힌트들을 보고 다음의 코드를 작성하였다. var timeLimit = function(fn, t) { return async function(...args) { const result = fn(...args); const checker = new Promise((resolve, reject) => { setTimeout(() => { reject("Time Limit Exceeded"); },..
leetcode 코딩테스트 연습 - 2621. Sleep (JavaScript)
/** * @param {number} millis */ async function sleep(millis) { return new Promise((resolve, reject) => { const timer = setTimeout(() => { resolve(millis); }, millis); }) } /** * let t = Date.now() * sleep(100).then(() => console.log(Date.now() - t)) // 100 */ leetcode의 문제들은 생각보다 다양한 것 같다. async 함수를 구현해야하는 코딩테스트 연습문제는 처음 접한 것 같다. 어려운 문제는 아니었지만, Promise를 반환하는 함수의 리마인드를 할 수 있었다.
leetcode 코딩테스트 연습 - 2722. Join Two Arrays by ID (JavaScript)
이번 문제는 객체를 값으로 가지는 두 배열을 합치는 문제였다. 객체의 id값은 유일해야 하고 양 배열에 id가 같으면, 이 객체를 합해야 하는 문제였다. 문제 접근 자체는 어렵지 않았지만, Time Limit Exceeded을 맞이해버렸다. /** * @param {Array} arr1 * @param {Array} arr2 * @return {Array} */ var join = function(arr1, arr2) { const answer = [...arr1]; const memo = {} for(let el of arr2) { if(el.id >= 0) { let pointer = null; if(memo[el.id] >= 0) { pointer = memo[el.id]; } else { for(..
leetcode 코딩테스트 연습 - 2624. Snail Traversal (JavaScript)
이번 문제는 Array의 prototype에 고차 함수를 직접 구현하는 문제였다. this가 호출한 배열을 가르킨다는 것을 이번 문제를 해결하면서 처음 알게되어 의미가 깊다. /** * @param {number} rowsCount * @param {number} colsCount * @return {Array} */ Array.prototype.snail = function(rowsCount, colsCount) { if(rowsCount * colsCount !== this.length) { return []; } const result = []; for(let i = 0; i < rowsCount; i++) { result.push([]); } let row = 0; let isAscending =..
leetcode 코딩테스트 연습 - 1844. Replace All Digits with Characters (JavaScript)
지금까지 프로그래머스를 이용하여 코딩테스트 문제를 풀어왔는데, 이번에는 leetcode를 이용하기로 하였다. 영어로 되어 있어 영어 공부를 할수도 있고, 문제가 다양하며 제출한 정답의 런타임이나 메모리 사용량도 알려주는 장점이 있는 플랫폼이다. 이번에 풀어본 문제는 간단한 문제로 아스키 코드를 이용한 문제였다. 자바스크립트에서 아스키 코드의 사용은 다소 생소하였기에 (C언어에서는 문자열이 숫자처럼 계산되었던 기억이 있다) 검색을 통해서 String.fromCharCode()나 char.charCodeAt() 과 같은 메서드를 알아내었다. /** * @param {string} s * @return {string} */ var replaceDigits = function(s) { let answer = "..
프로그래머스 코딩테스트 연습 - 롤케이크 자르기 JavaScript
이번 문제는 간단하게 생각하면, 이중 for문을 사용하여 계산할 수 있는 문제였다. 본질적으로 배열을 둘로 나누어 양 쪽의 값을 비교하는 문제였다. 따라서, 시간초과를 내지 않으며 문제를 해결하기 위해서 객체를 사용하여 배열의 데이터를 관리하였다. function solution(topping) { let answer = 0; const left = {}; let leftCount = 0; const right = {}; let rightCount = 0; topping.forEach(el => { if(!left[el]) { left[el] = 1; leftCount++; } else { left[el] += 1; } }); for(let t of topping) { if(right[t]) { righ..
프로그래머스 코딩테스트 연습 - 무인도 여행 JavaScript
이번 문제는 이차원 배열을 방문하면서, 연결된 유효한 값의 범위와 값을 구하는 문제이다. 기본적으로 dfs방식을 사용하였으며, 방문했는지 확인할 수 있는 값을 설정하여 문제를 해결하였다. function solution(maps) { // X는 바다, 숫자는 무인도 // 상하좌우로 연결된 무인도의 숫자의 합은 머물 수 있는 날짜 수 const answer = []; const checkValid = (x, y) => maps.length - 1 >= x && x >= 0 && maps[x].length - 1 >= y && y >= 0; const mapDfs = (visited, x, y) => { // x, y 방문 let sum = parseInt(maps[x][y]); visited[x][y] =..