본문 바로가기

DFS27

[ 자바스크립트(JavaScript) ] section08 - 15 - 수들의 조합 📍 section08 - 15 - 수들의 조합 N개의 정수가 주어지면 그 숫자들 중 K개를 뽑는 조합의 합이 임의의 정수 M의 배수인 개수는 몇 개인지 출력하는 문제다. 예를 들면, 5개의 숫자 arr=[2, 4, 5, 8, 12]로 주어지면 3를 뽑는 조합의 합이 6의 배수인 값은 [2, 4, 12] (18), [ 4, 8, 12 ] (24)로 총 2개가 있다. 이 문제를 풀기 위해선 n개의 정수를 뽑는 모든 경우의 수(조합)를 구하고, 조합의 합을 m으로 나눈 나머지가 0인 값을 찾으면 된다. 조합을 구현하는 방법은 다음을 참고하자. 내가 문제를 풀 때는 DFS함수에 인자를 L, s만 넘기고 L===k일 때 reduce 함수를 이용하여 더했는데, 그것보단 DFS에 sum 인자를 하나 더 넘겨서 L이 .. 2021. 10. 5.
[ 논리적사고 ] - 재귀를 이용하여 부분 집합, 순열, 조합 구하기 📍 재귀를 이용하여 부분 집합, 순열, 조합 구하기 코딩테스트 문제를 풀다 보면 제목과 같이 부분집합(subSet), 순열(permutation), 조합(combination)을 구해야 하는일이 간혹 있다. 그때마다 코드를 구현하려니까 시간이 부족해서 다른 부분에 시간을 쏟지 못한 적이 있었다. 어떻게 구현해야 하는지 간단하게 알아보자. arr=[1, 2, 3, 4]로 예를 들어 나올 수 있는 경우의 수를 구해보는데, 모두 재귀(DFS)를 이용하여 구했다. 부분집합은 출력하는 모든 경우의 수를 구하고, 순열은 중복을 허용 / 허용하지 않고 일렬로 세우는 방법, 조합은 4개 중 2개를 뽑는 경우의 수로 가정해서 구했다. 이를 응용한 문제는 다음을 참고하자. 부분집합: 부분집합 구하기, 바둑이 승차, 최대점.. 2021. 10. 1.
[ 자바스크립트(JavaScript) ] section08 - 14 - 조합 구하기 📍 section08 - 14 - 조합 구하기 1부터 N까지 번호가 적힌 구슬이 있다. 이 중 M개를 뽑는 방법의 수를 출력하는 프로그램을 작성하세요 // 입력 4 2 // 출력 1 2 1 3 1 4 2 3 2 4 3 4 6 조합을 구하는 문제인데, 이전에 배웠던 순열과는 조금 다른 방식으로 풀어야 한다. 중복을 허용하지 않는 순열을 구현할 때 배웠던 것처럼 visited 배열로 재귀가 돌아올 때 visited[i]=0을 해주는 방법으로는 풀 수 없고 대신 반복문의 i값을 조금 다르게 i+1을 계속 넘겨줘야 한다. arr값이 따로 주어져있으면 i는 0부터 시작하는데, 이 문제는 arr이 주어져 있지 않고 현재 인덱스가 값으로 들어가므로 s 인자는 1로 초기화하여 넘긴다. let n = 4; let m =.. 2021. 9. 30.
[ 자바스크립트(JavaScript) ] section08 - 13 - 수열 추측하기 📍 section08 - 13 - 수열 추측하기 문제는 다음과 같다. 가장 윗줄에 1부터 N까지의 숫자가 한 개씩 적혀 있다. 파스칼의 삼각형을 예로 들어 N이 4이고 가장 윗 줄에 3 1 2 4가 있다고 할 때 다음 그림과 같이 그려진다. N과 가장 밑에 있는 숫자가 주어져 있을 때 가장 윗줄에 있는 숫자를 구하는 프로그램을 작성하시오. 여러 가지 답이 나오면 사전 순으로 가장 앞에 오는 것을 출력한다. // 입력 4 16 // 출력 3 1 2 4 문제만 보면 조금 어렵다고 생각했는데, 어떻게 풀어야 할지 순서를 나누니까 괜찮았다. 파스칼의 삼각형 공식을 알아야 하는데, 조합공식을 사용하면 파스칼 삼각형을 구할 때 처음부터 끝까지 두 항을 더해서 누적하는 불 필요한 계산을 하지 않아도 된다. 예를 들어.. 2021. 9. 29.
[ 자바스크립트(JavaScript) ] section08 - 12 - 조합의 경우 수(메모이제이션) 📍 section08 - 12 - 조합의 경우수 (메모이제이션) 다음 공식을 사용하여 재귀를 이용해 조합수를 구하는 프로그램을 작성하세요. 조합의 경우의 수를 구하는 문제는 n의 범위가 20정도 넘으면 메모이제이션으로 풀어야 한다. 왜냐하면 연산 시간이 오래 걸리기 때문이다. 메모이제이션을 하는 이유는 동일한 계산을 반복하지 않기 위함인데, 이전에 한창 지식인 답변 활동을 했을 때 피보나치 수열의 합계를 구하는 질문에서 답했었다. 문제에 주어진 공식으로 풀 때 메모이제이션을 적용하는 이유도 마찬가지다. 그런데 기존에 알던 공식을 사용해도 되는데 새로운 공식을 사용하는 이유는 뭘까?(이 공식을 나는 처음 봤다 😅 😅) 예를 들어 5[1, 2, 3, 4, 5]개 중 3개를 뽑는 경우의 수(5C3)를 구한다고.. 2021. 9. 28.