본문 바로가기

Algorithm/논리적사고(Logical Think)8

[ 논리적사고 ] - 재귀를 이용하여 부분 집합, 순열, 조합 구하기 📍 재귀를 이용하여 부분 집합, 순열, 조합 구하기 코딩테스트 문제를 풀다 보면 제목과 같이 부분집합(subSet), 순열(permutation), 조합(combination)을 구해야 하는일이 간혹 있다. 그때마다 코드를 구현하려니까 시간이 부족해서 다른 부분에 시간을 쏟지 못한 적이 있었다. 어떻게 구현해야 하는지 간단하게 알아보자. arr=[1, 2, 3, 4]로 예를 들어 나올 수 있는 경우의 수를 구해보는데, 모두 재귀(DFS)를 이용하여 구했다. 부분집합은 출력하는 모든 경우의 수를 구하고, 순열은 중복을 허용 / 허용하지 않고 일렬로 세우는 방법, 조합은 4개 중 2개를 뽑는 경우의 수로 가정해서 구했다. 이를 응용한 문제는 다음을 참고하자. 부분집합: 부분집합 구하기, 바둑이 승차, 최대점.. 2021. 10. 1.
[ 논리적사고 ] - 누적 값이 point보다 높은지 낮은지 비교하고 추가하기 📍 누적 값이 point보다 높은지 낮은지 비교하고 추가하기 제목은 거창하게 작성했지만, 내용은 쉬운 글이다. 이진 탐색의 결정 알고리즘 문제를 풀면서 작은 skill(?)을 남겨 놓고 싶어 작성했다. 예를 들어, 현재까지 누적된 sum=6이고, 다음 x값을 누적할 때 point보다 높으면 continue하고, 높지 않으면 포함시키는 방법을 작성하고 싶다면 어떻게 작성할까? 다음과 같이 작성할 수 있다. let arr = [1, 3, 2, 5, 1, 1, 1]; let point = 10; let sum=0; for (let x of arr){ if(sum+x>point)continue else sum+=x; } 이를 응용해서 currentTime에 songTime값을 누적할 때 만약, 다음 songTi.. 2021. 9. 8.
[ 논리적사고 ] - 배열 중간에 있는 값을 맨 앞으로 옮기기 📍 배열 중간에 있는 값을 맨 앞으로 옮기기 배열 중간에 있는 값을 맨 앞으로 옮길 때는 2가지의 방법이 있다. 한번 코드로 살펴보자. 1. temp로 target을 빼내는 방법: target이 몇 번째 index에 있는지 찾는다. -> temp에 저장한다. -> 한 칸씩 뒤로 미룬다. -> 맨 앞에 temp값을 넣는다. 2. splice방법: target이 몇 번째 index에 있는지 착는다 -> temp변수에 splice 값을 넣는다. -> 맨 앞에 unshift()한다. let arr = [2, 3, 1, 5, 6]; let target = 1; // target이 arr의 몇 번째 idx에 위치해있는지 찾기 let pos=-1; for (let i=0; i=1; i--){ arr[pos] = ar.. 2021. 9. 3.
[ 자바스크립트(JavaScript) ] 2차원 행렬 sort하기 📍 2차원 행렬 sort 2차원 행렬 각각의 두 값을 더해서 오름차순 / 내림차순으로 sort 하고 싶을 때 다음과 같이 작성할 수 있다. 만약, `arr[0]`끼리 같은 값이면 `arr[1]`을 비교하는 조건이 더해질땐 다음과 같이 사용 할 수 있다. const arr = [ [6, 6], [2, 2], [4, 3], [4, 5], [10, 3], ] // 오름차순 arr.sort((a, b) => a[0] + a[1] - (b[0] + b[1])) console.log(arr) 👉🏽 [ [ 2, 2 ], [ 4, 3 ], [ 4, 5 ], [ 6, 6 ], [ 10, 3 ] ] // 내림차순 arr.sort((a, b) => b[0] + b[1] - (a[0] + a[1])) console.log(a.. 2021. 8. 20.
[ 논리적사고 ] - string함수 사용하지 않고 자연수 거꾸로 뒤집기 📍 string함수 사용하지 않고 자연수 거꾸로 뒤집기 let n = 23; let sum = 0; // do - while문 do{ sum = sum * 10 + n % 10; n = Math.floor(n / 10); }while(n); console.log(sum) 👉🏽 32 // while문 while(n){ sum = sum * 10 + n % 10; n = Math.floor(n/10); } 2021. 8. 20.