Recent Posts
Recent Comments
Link
«   2025/02   »
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
Tags
more
Archives
Today
Total
관리 메뉴

개발자공부일기

프로그래머스 문제:타켓 넘버 본문

TIL(Today I Learned)

프로그래머스 문제:타켓 넘버

JavaCPP 2025. 1. 23. 20:58

 

 

https://school.programmers.co.kr/learn/courses/30/lessons/43165

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

function solution(numbers, target) {
  // 최종 결과를 저장할 변수, 초기값 0으로 설정
  let answer = 0;

  // 깊이 우선 탐색(DFS) 재귀 함수 정의
  const dfs = (index, sum) => {
    // 배열의 모든 원소를 탐색했을 때 
    if (index === numbers.length) {
      // 현재 합계가 target과 정확히 일치하면
      if (sum === target) answer++;
      // 더 이상 탐색할 원소 없으므로 종료
      return;
    }

    // 첫 번째 재귀 호출: 현재 숫자를 더하는 경우
    // 인덱스 1 증가, 현재 숫자를 sum에 더함
    dfs(index + 1, sum + numbers[index]);

    // 두 번째 재귀 호출: 현재 숫자를 빼는 경우
    // 인덱스 1 증가, 현재 숫자를 sum에서 뺌
    dfs(index + 1, sum - numbers[index]);
  };

  // 초기 인덱스 0, 초기 합계 0으로 DFS 시작
  dfs(0, 0);

  // 타겟 합을 만들 수 있는 총 경우의 수 반환
  return answer;
}

 

카테고리를 보니까 깊이/너비 우선탐색 알고리즘이길래 그걸 써야하는가보다 하고 써봤다.

 

배열의 첫번째 숫자부터 -/+인 경우의수 2개로 시작해서 첫번째가 -일때 두번째가 -/+인 경우의수, 첫번째가 +일때 두번째가 -/+인 경우의수 그러니까 O(2^n)의 시간복잡도를 갖는다.

 

예시:[1,1,1,1,1]일때

 

첫번째 숫자까지

+1

-1

 

두번째 숫자까지

+1-1

+1+1

 

-1+1

-1-1

 

....

이런식으로 합을 찾고 그 합이 타겟넘버라면 answer을 1 증가시킨다.

'TIL(Today I Learned)' 카테고리의 다른 글

프로세스와 스레드, 컨텍스트 스위칭  (0) 2025.01.27
패킷에 헤더 붙여서 전송하기  (0) 2025.01.24
oneof  (0) 2025.01.22
게임 서버 아키텍처  (0) 2025.01.20
운영체제  (0) 2025.01.15