일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- active blur
- 자바스크립트 논리합 연산자
- 모두의시간
- 자바스크립트 null 병합
- 자바스크립트 호이스팅
- 자바스크립트
- 자바스크립트 변수 호이스팅
- 리액트 쿼리
- 모던 자바스크립트 Deep Dive
- activeElement
- 자바스크립트 렉시컬스코프
- React Query
- AWS 로드밸런서
- 자바스크립트 중첩함수
- touchmove 이벤트
- 사파리 가상키보드
- Kafka
- EC2 HTTPS로 연결
- 로현 청춘의개발
- ios 크로스브라우징
- but requested an insecure XMLHttpRequest endpoint 'http://~~’. This request has been blocked; the content must be served over HTTPS.
- Purdue university
- net::R_SSL_PROTOCOL_ERROR
- 퍼듀대학교
- 자바스
- K-SW SQUARE
- refetchOnWindowFocus
- 자바스크립트 옵셔널 체이닝
- 리액트 가상키보드
- 자바스크립트 스코프 체인
- Today
- Total
개발 여행자, 현
[JavaScript] 프로그래머스 타겟넘버 (DFS, 재귀함수) 본문
[JavaScript] 프로그래머스 타겟넘버
문제
https://school.programmers.co.kr/learn/courses/30/lessons/43165#
n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.
-1+1+1+1+1 = 3
+1-1+1+1+1 = 3
+1+1-1+1+1 = 3
+1+1+1-1+1 = 3
+1+1+1+1-1 = 3
사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요.
제한사항
- 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
- 각 숫자는 1 이상 50 이하인 자연수입니다.
- 타겟 넘버는 1 이상 1000 이하인 자연수입니다.
문제풀이
처음엔 여러겹의 for문을 돌려 모든 경우의 수를 판단하려 했지만, 너무 복잡해지는 것 같아서 재귀 함수를 이용하여 DFS를 구현했다.
DFS/BFS 관련 정리글은 밑 링크에서 확인할 수 있다.
https://yeshyun.tistory.com/28
[JavaScript] 너비우선탐색(BFS) 깊이우선탐색(DFS)이란?
너비우선탐색(BFS) 깊이우선탐색(DFS) DFS(깊이우선탐색)이란? - 정점의 자식인 노드들을 먼저 탐색하는 방식 - 큐와 스택 1개씩 이용 const graph = { A: ["B", "C"], B: ["A", "D"], C: ["A", "G", "H", "I"], D: ["B", "E"
yeshyun.tistory.com
(아이패드가 현재 없어서 이면지에 끄적인 DFS 그래프..)
이 문제의 각 노드(숫자)는 다음 인덱스의 숫자가 (+)인 경우와 (-)인 경우 두 가지의 자식 노드를 가진다.
DFS 방법에 따라 모든 숫자가 (+)인 경우를 모두 탐색한 뒤, 다음 인덱스의 숫자가 (-)인 경우를 거꾸로 탐색한다.
코드는 다음과 같다.
function solution(numbers, target) {
let answer = 0;
function dfs_recursive(index, sum){
if (index === numbers.length){
if(sum === target) {
answer++;
}
return;
}
dfs_recursive(index + 1, sum + numbers[index]);
dfs_recursive(index + 1, sum - numbers[index]);
}
dfs_recursive(0,0)
return answer;
}
(+)의 자식 노드 탐색 → (-)의 자식 노드 탐색 순서로 과정이 진행되며
index 1이 (-)일 때의 자식 노드의 경우의 수 (+), (-) 를 모두 탐색하면 해당 함수가 종료된다.
재귀함수의 개념이 와닿지 않아서, 다른 분들의 코드를 참고하며 하나씩 이해해나갔다.
배열로 과정을 살펴보면
[+1, +1, +1, +1, +1]
[+1, +1, +1, +1, -1]
[+1, +1, +1, -1, +1]
[+1, +1, +1, -1, -1]
[+1, +1, -1, +1, +1]
.
.
.
추상적으로만 생각했을 때 확 와닿지 않았는데
배열로 하나씩 이해하니 어떻게 재귀함수가 진행되는지 이해할 수 있었다.
💡 느낀점
- 그래프 표현, 재귀함수, DFS/BFS 개념이 정립되지 않은 상태여서 문제를 보고 어떠한 방법으로 풀어야할지 감이 안잡혔다.
- 이번 문제풀이를 통해서 개념을 하나씩 정립했고, 계속해서 반복하다보면 언젠간 익숙해질 것이라고 믿는다.
- 알고리즘 이전에 자료구조의 개념을 확실히 다시 정립해야됨을 다시 한 번 느꼈다.
'알고리즘' 카테고리의 다른 글
[정렬 알고리즘] 버블정렬 (0) | 2023.04.17 |
---|---|
[정렬 알고리즘] 선택정렬 (0) | 2023.04.17 |
[JavaScript] 프로그래머스 게임 맵 최단거리 (BFS) (1) | 2022.11.14 |
[JavaScript] 너비우선탐색(BFS) 깊이우선탐색(DFS)이란? (0) | 2022.11.06 |
[프로그래머스/JavaScript] K번째 수 (feat. 나의 첫번째 알고리즘 문제) (0) | 2021.10.16 |