[프로그래머스] 타겟 넘버 - Java

2025. 4. 24. 21:40·프로그래머스 알고리즘/Java

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

 

프로그래머스

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

programmers.co.kr

 

 

⭐️ 중요 포인트

DFS로 풀면 풀리는 간단한 문제였다. 다만 

        ret += recursion(idx + 1, sum + sNumbers[idx]);
        ret += recursion(idx + 1, sum - sNumbers[idx]);

이 부분에서 조금 해맸다. 처음에 조합 가능한 모든 경우의 수를 찾는 줄 알았다. 그래서 저 부분을 for문으로 감싸서 특정 숫자를 더하거나 빼지 않는 부분까지 포함되어있다.

다시 말하면 순서를 지키며 뒤에 숫자를 건너뛸 수도 있다...

그림 그려가며 풀어보기!..

 

class Solution {
    
    static int cnt;
    static int[] sNumbers;
    static int sTarget;
    static int answer;
    
    static void init(int[] numbers, int target) {
        answer = 0;
        cnt = 0;
        sNumbers = numbers;
        sTarget = target;
    }
    
    static int recursion(int idx, int sum) {
        
        if (idx == sNumbers.length) {
            if (sum == sTarget) {
                return 1;
            }
            return 0;
        }
        
        int ret = 0;
        
        ret += recursion(idx + 1, sum + sNumbers[idx]);
        ret += recursion(idx + 1, sum - sNumbers[idx]);
        
        return ret;
    }
    
    public int solution(int[] numbers, int target) {
        init(numbers, target);
        
        answer = recursion(0, 0);
        
        return answer;
    }
}

 

 

<잘못짠 코드 + gpt 도움 받아서 완성해서 해결은 되지만 매우 비효율적인 코드>

-> 이렇게 해도 풀리긴 풀린다 다만, 쓸데없이 중복되는 반복되는 경우(ex. 1, 2, 4, 5)를 거르지 못하고 모든 경우의 수 중에서 5개를 선택한 것 중에 target에 도달한 것만 1로 반환하기 때문에 속도가 많이 느리고, 문제의 의도와 다르게 풀린다.

class Solution {
    
    static int cnt;
    static int[] sNumbers;
    static int sTarget;
    static int answer;
    
    static void init(int[] numbers, int target) {
        answer = 0;
        cnt = 0;
        sNumbers = numbers;
        sTarget = target;
    }
    
    static int recursion(int idx, int sum, int usedCount) {
    if (usedCount == sNumbers.length) {
        if (sum == sTarget) {
            return 1;
        }
        return 0;
    }

    int ret = 0;

    for (int i = idx; i < sNumbers.length; i++) {
        ret += recursion(i + 1, sum + sNumbers[i], usedCount + 1);
        ret += recursion(i + 1, sum - sNumbers[i], usedCount + 1);
    }

    return ret;
}
    
    public int solution(int[] numbers, int target) {
        init(numbers, target);
        
        answer = recursion(0, 0, 0);
        
        return answer;
    }
}

 

 

'프로그래머스 알고리즘 > Java' 카테고리의 다른 글

[프로그래머스] 단어 변환 - Java  (0) 2025.04.25
[프로그래머스] 게임 맵 최단거리 - Java  (0) 2025.04.25
[프로그래머스] 큰 수 만들기 - Java  (0) 2025.04.24
[프로그래머스] 프로세스 - Java  (0) 2025.04.24
[프로그래머스] 베스트앨범 - Java  (0) 2025.04.23
'프로그래머스 알고리즘/Java' 카테고리의 다른 글
  • [프로그래머스] 단어 변환 - Java
  • [프로그래머스] 게임 맵 최단거리 - Java
  • [프로그래머스] 큰 수 만들기 - Java
  • [프로그래머스] 프로세스 - Java
리버🐦‍🔥
리버🐦‍🔥
개발새발 개발일기
  • 리버🐦‍🔥
    개발도 개발새발
    리버🐦‍🔥
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 백준 알고리즘
        • Python
        • Java
      • 프로그래머스 알고리즘
        • Python
        • Swift
        • Java
      • 코드트리 알고리즘
        • Python
      • Spring boot
        • 스프링 부트 3 백엔드 개발자 되기(자바편)
      • SwiftUI
      • UIKit
      • Programming Language
        • Swift
        • Java
      • 공부해야될 것
        • iOS
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    ios
    프로그래머스
    uikit
    깊이 우선 탐색
    스프링 부트 3 백앤드 개발자 되기 : 자바편
    Python
    UITextView
    ci/cd
    스프링 부트
    스위프트
    문자열
    Java
    Swift
    큐
    자바
    스프링 부트 3 백엔드 개발자 되기 : 자바편
    백앤드 개발자
    programmers
    코드베이스
    너비 우선 탐색
    그래프
    애너테이션
    데이터베이스
    파이썬
    백준
    구현
    그리디 알고리즘
    스프링 부트 3
    Code-based
    Baekjoon
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
리버🐦‍🔥
[프로그래머스] 타겟 넘버 - Java
상단으로

티스토리툴바