알고리즘 12

프로그래머스 Lv.1 | 키패드 누르기 (JavaScript)

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr 알고리즘 문제를 풀 때면 항상 다음과 같은 순서를 따른다. 1) 입출력 예시를 보면서 구체적인 예시를 통해 일반적인 법칙을 찾는다. 2) 일반적인 법칙을 코드로 옮긴다. 아래는 문제를 풀 때 적은 노트를 캡처한 화면이다. 1. 입력값인 numbers 배열을 number 값에 따라 "L" 또는 "R"로 리턴한다. 2. 2, 5, 8, 0 값의 경우, 현재 왼손과 오른손의 위치 정보에 따라 더 가까운 손으로 입력을 해야 하기에 '현재 손의 위치 정보'를 변수로 만들어 갱신해 준다. 3. 어느 손이 더 가까운지 알..

프로그래머스 Lv.1 | 기사단원의 무기 (JavaScript)

프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 💡 접근 방식: 1. 1부터 number까지의 배열을 만들고, 각 숫자의 약수의 개수를 구한다. 2. limit보다 큰 요소가 있는지 체크한 후, 있다면 해당 요소를 power로 갈음한다. 3. reduce로 최종 합계를 구한다. 이 문제의 핵심은 '약수의 개수를 구하기'라고 생각한다. 약수란 모름지기 나눠서 떨어지는 수가 있느냐가 관건이기에 나머지가 0이 되는 수를 찾아야 한다. 모듈로(%) 연산을 쓰면 간단히 해결할 수 있다. 약수를 구하는 3가지 방식이 있다. 첫번째: 1부터 number까지 모든 수를 나눠..

프로그래머스 Lv.1 | 과일장수 (JavaScript)

지난주부터 몸풀기로 하루에 한 문제씩 코딩 테스트 연습 문제를 풀고 있다. 간단한 TIL을 매일 노션에 정리하고 있는데 블로그에 공유하고 싶은 내용이 있으면 간간히 포스팅을 해보려고 한다. usechatgpt init success 문제 설명은 다음의 링크로 갈음한다. 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 내 풀이function solution(k, m, score) { score.sort((a, b) => b - a); const repeat = parseInt(score.length / m); let sum = 0; for (let i = m -..

[JavaScript] 경우의 수 구하기 (순열, 조합, 중복순열, 중복조합)

1. 순열 (Permutation) 서로 다른 n개의 원소 중에서 r개를 중복 없이 골라 순서에 상관있게 나열하는 경우의 수 (nPr) 예제) [A, B, C, D, E]로 이뤄진 5장의 카드가 있을 때, 이 5장의 카드 중 3장을 선택하여 나열하려고 한다. 이때, 순서를 생각하며 3장을 선택하는 모든 경우의 수를 나열하시오. 5P3 = 5! / (5-3)! = 5*4*3 = 60 🔽 for loop로 구현 function permutationLoop(list) { const result = []; for (let i = 0; i < list.length; i++) { for (let j = 0; j < list.length; j++) { for (let k = 0; k < list.length; k++..

[알고리즘] 애너그램 걸러내기

Map과 Set을 공부하면서 모던 JavaScript 튜토리얼의 과제 중에 애너그램을 걸러내는 문제가 있었다. 애너그램이란 단어나 문장을 구성하고 있는 문자의 순서를 바꾸어 다른 단어나 문장을 만드는 것이다. 다음은 한국어에서 음절 단위의 애너그램 예시이다. 국왕 - 왕국 미개 - 개미 방배역 - 배방역 피노키오 - 키노피오 영어에서는 stressed - desserts, permission to dance - stories on pandemic 등이 애너그램이다. 문제: 애너그램으로 만든 단어를 걸러내어 한 단어만 남기는 함수 aclean(arr)를 작성하세요. // 예시 const arr = ["nap", "teachers", "cheaters", "PAN", "ear", "era", "hectare..

[알고리즘] 인접 행렬(adjacency matrix) 길찾기

지난 목요일부터 4일째 자료구조(스택, 큐, 트리, 그래프)를 배우면서 아침부터 밤까지 내내 알고리즘 문제만 들여보고 있으니 머리가 과포화 상태다 ㅋㅋㅋ 금요일 정규 시간에 못 푼 문제들(태반...)을 주말 동안 붙잡고 늘어지느라 주말에 해야 할 다른 일들을 하나도 못했다. 😭 아직 열어보지도 못한 advanced 문제들이 남아있다는 것이 함정... 지금 본다고 알 것 같지도 않은 게 더 함정... 이번 포스팅에서는 그래프를 이용한 알고리즘 문제 중 하나였던 길찾기 문제를 셀프 크리틱해보려 한다. 알고리즘 문제에서 많이 등장하는 길찾기 패턴 문제를 처음으로 어떻게 다뤄야 하는지 알게 된 것이 이번 자료구조/알고리즘 유닛의 최대 성과였다. 💡 그래프의 각 정점을 순회할 수 있는 DFS, BFS 두 가지 방..

[알고리즘] 괄호쌍 문제

워낙 유명한 문제라 간략하게 입출력만 써보자면, 입력: string 타입의 문자열 출력: 입력의 문자열 내의 모든 괄호가 짝이 맞는지 여부에 대한 boolean 타입 🔽 입출력 예시 let output = balancedBrackets('[](){}'); console.log(output); // --> true output = balancedBrackets('[({})]'); console.log(output); // --> true let output3 = balancedBrackets('[(]{)}'); console.log(output3); // --> false 🔽 첫번째 문제 풀이 - switch 문으로 개별 케이스 나눔 switch 문으로 써서 풀긴 했는데, 사실 위의 3가지 경우는 여는 괄..

[알고리즘] 2 x n 보드 타일링과 피보나치 수열

문제: 세로 길이 2, 가로 길이 n인 2 x n 보드가 있다. 2 x 1 크기의 타일을 가지고 이 보드를 채우는 모든 경우의 수를 리턴하시오. 입력: number 타입의 1 이상의 자연수 출력: number 타입 주의사항: 타일을 가로, 세로 어느 방향으로 놓아도 상관없다. 위의 타일링 문제를 작게 쪼개 보면 다음 그림과 같이 왼쪽 첫 시작을 세로로 타일 한 장을 놓을지, 가로로 타일 두 장을 놓을지에 따라 두 가지의 경우 밖에 나오지 않는다. 전자의 경우 그 다음은 가로가 n-1인 보드를 채우는 경우의 수가 되고, 후자의 경우 그 다음은 가로가 n-2인 보드를 채우는 경우의 수가 된다. 따라서 가로 길이가 n인 보드를 채우는 모든 경우의 수는 가로 길이가 n-1인 경우의 수와 가로 길이가 n-2인 경..

[알고리즘] 하노이의 탑 - 재귀

'하노이의 탑' 이해하기 '하노이의 탑' 문제를 이해하고 문제 해결을 위한 핵심 통찰을 살핀 뒤 코드로 작성합니다. 이후 탑의 개수에 따른 총 이동 횟수를 구하는 일반항까지 수학적으로 유도합니다. shoark7.github.io 💡 재귀 문제의 핵심 1. 문제 정의: 재귀 함수의 입출력값 정의 2. 문제를 작게 만들어 해결하기 3. 작게 쪼갠 문제를 재귀식으로 표현하기 4. 재귀식을 그대로 코드로 구현 function _move(N, start, to) { return console.log(`${N}번 원반을 ${start}에서 ${to}로 이동시킨다`); } function hanoi(N, start, to, via) { if (N === 1) _move(1, start, to); else { hano..

스크랩 2022.12.24

[알고리즘] modulo 구현

앞선 포스팅에서 얘기한 것처럼 부트캠프에서 매일 하루에 한 문제씩 알고리즘 문제를 풀게 하면서 하루 일과를 시작한다. (a.k.a. Daily Coding) 이제까지 문제를 딱 보고 pseudo code를 하나도 적지 않고 바로 푼 문제도 있고, 1, 2, 3 번호를 매겨가며 pseudo code를 적은 다음 푼 문제도 있지만 어...? 하고 2초 간 얼었던 문제는 어제가 처음이었다. 나눗셈(/)과 나머지(%) 연산자를 사용하지 않고 두 수의 나머지를 구하는 함수를 작성하는 것 잠시 삼천포를 건널테니 이 포스팅을 읽는 여러분도 위의 함수를 어떻게 짤 지 한 번 생각해 보시면 좋겠다. 개인적으로 부트캠프에서 이제까지 했던 과제 중 가장 인상적인 과제를 꼽으라면 두 가지를 들 수 있겠다. (섹션이 끝날 때마..