알고리즘

    프로그래머스 코딩테스트 연습 - 카드 뭉치 JavaScript

    이번 문제는 순서대로 접근하며 해당 케이스가 가능한지 확인하는 문제로, 분기가 갈릴 수 있으므로 이를 놓치지 않는 게 중요하다고 생각하였다. function solution(cards1, cards2, goal) { const dfs = (idx1, idx2, goalIdx) => { if(goalIdx === goal.length) { return true; } if(cards1[idx1] === goal[goalIdx]) { if(cards2[idx2] === goal[goalIdx]) { return dfs(idx1 + 1, idx2, goalIdx + 1) || dfs(idx1, idx2 + 1, goalIdx + 1); } else { return dfs(idx1 + 1, idx2, goalId..

    프로그래머스 코딩테스트 연습 - 숫자 변환하기 JavaScript

    처음에는 DFS 방법으로 문제에 접근하였다. function solution(x, y, n) { let minTry = 1000000; const dfs = (num, tryCount) => { if(num > y) { return; } else if(num === y) { if(minTry > tryCount) { minTry = tryCount; } return; } dfs(num + n, tryCount + 1); dfs(num * 2, tryCount + 1); dfs(num * 3, tryCount + 1); } dfs(x, 0); return minTry === 1000000 ? -1 : minTry; } 하지만, 시간초과 문제가 발생하였다. 문제를 다시 생각해보니, 최단거리를 찾는 것과 유사..

    프로그래머스 코딩테스트 연습 - 뒤에 있는 큰 수 찾기 JavaScript

    function solution(numbers) { const answer = []; for(let i = 0; i numbers[i]) { tmp = numbers[j]; break; } } answer.push(tmp); } return answer; } 일단, 맨 처음에 가장 간단한 방법으로 구현했다. 하지만, 역시 시간 초과 문제가 발생하였다. 스택을 사용하여 해결할 수 있다는 조언을 듣고, 다음과 같이 코드를 수정하여 문제를 해결하였다. 값이 증가하는 추세와 하락하는 추세일 때를 구분하여 코드를 작성한다. functi..

    프로그래머스 코딩테스트 연습 - 마법의 엘리베이터 JavaScript

    function solution(storey) { let answer = parseInt(storey); const counting = (num, count) => { console.log(num, count); if(num count + num) { answer = count + num; } if(answer > count + 10 - num + 1) { answer = count + 10 - num + 1; // 10으로 만든 뒤 -10 } return; } const down = parseInt(num % 10); counting(parseInt(num / 10) + 1, count + 10 - down); // 자리 수 올림 counting(parseInt(nu..

    프로그래머스 코딩테스트 연습 - 문자열 나누기 JavaScript

    function solution(s) { let answer = 0; let first = ""; let same = 0; let notSame = 0; for(let i = 0; i 0) { answer++; } return answer; } 문제를 해결하는 데 있어서 헷갈렸던 부분은 첫 문자와 같은 문자 수와 다른..

    프로그래머스 코딩테스트 연습 - 가장 가까운 같은 글자 JavaScript

    function solution(s) { const answer = []; const obj = {}; s.split("").forEach((el, idx) => { if(obj[el] === undefined) { answer.push(-1); } else { answer.push(idx - obj[el]); } obj[el] = idx; }) return answer; } 비교적 쉬운 문제였지만, 고려해야할 점이 있었다. 객체로 각 문자가 등장한 최신의 인덱스를 계산하였는데, 해당 문자의 인덱스를 계산하는 과정에서 오류가 있었다. 0이나 undefined은 모두 falsy이므로, 조건문에서 거짓으로 처리되어버리는 문제가 있었다. 따라서, 0을 인덱스로 가질 때 문제가 발생했었다. 정확히 undefin..

    프로그래머스 코딩테스트 연습 - 할인 행사 JavaScript

    const checkValid = (wantObj, discountObj) => { for(let key in wantObj) { if(wantObj[key] > (discountObj[key] || 0)) { return false; } } return true; } function solution(want, number, discount) { let answer = 0; const wantObj = {}; for(let i = 0; i < want.length; i++) { wantObj[want[i]] = number[i]; } const discountObj = {}; for(let i = 0; i

    프로그래머스 코딩테스트 연습 - 명예의 전당 (1) JavaScript

    function solution(k, score) { const answer = []; let legend = []; for(let i of score) { if(legend.length a - b); if(legend[0] < i) { legend[0] = i; } } answer.push(Math.min(...legend)); } return answer; } 가장 낮은 숫자의 점수를 매번 새로운 점수와 비교하여 가장 높은 최상위 점수 k를 유지하는 것이 중요했던 문제였다. 힙정렬을 통해서 값이 매번 들어올 때 정렬해주는 알고리즘을 구현했으면 더 좋았겠지만, 간단하게 구현하였다.