0_ch4n
기계쟁이\n개발자
0_ch4n
0chn.xxx@gmail.com @0ch._.n
전체 방문자
오늘
어제

공지사항

  • All (282)
    • 🖥 CS (21)
      • 네트워크 (12)
      • 운영체제 (3)
      • 자료구조 (2)
      • Web (4)
    • 🧠 Algorithm (185)
      • [C] BOJ (93)
      • [JAVA] Programmers (91)
    • 📚 Study (69)
      • HTML&CSS (19)
      • MySQL (11)
      • JAVA (22)
      • Servlet&JSP (8)
      • Thymeleaf (2)
      • Spring (5)
      • JPA (2)
    • 📖 Book (1)
    • 📃 Certification (6)
      • 정보처리기사 (6)

인기 글

최근 글

최근 댓글

태그

  • 카카오
  • 코테
  • java
  • Programmers
  • 자바
  • kakao
  • CSS
  • 코딩테스트
  • til
  • 프로그래머스

블로그 메뉴

  • 홈
  • 태그
  • 방명록

티스토리

hELLO · Designed By 정상우.
0_ch4n

기계쟁이\n개발자

[43165번] 타겟 넘버
🧠 Algorithm/[JAVA] Programmers

[43165번] 타겟 넘버

2022. 7. 15. 17:34
반응형

깊이/너비 우선 탐색(DFS/BFS)

 

✔️ 문제 설명

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 함수를 작성해주세요.

 

더보기

✔️ 입출력 예

입출력 예 #1

문제 예시와 같습니다.

 

입출력 예 #2

+4+1-2+1 = 4
+4-1+2-1 = 4
  • 총 2가지 방법이 있으므로, 2를 return 합니다.

 

✔️ 제한 사항

  • 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
  • 각 숫자는 1 이상 50 이하인 자연수입니다.
  • 타겟 넘버는 1 이상 1000 이하인 자연수입니다.

 

✔️ 코드 구상

numbers를 각 자리마다 +, - 두 가지 경우를 가지에 대한 모든 경우를 구하면 된다.

재귀를 이용한 DFS에서 +와 -로 재귀를 태워 모든 경우를 구하고 그 식의 합을 리스트로 받는다.

그 이후엔 간단하게 합과 target이 같은걸 카운트하면 된다.

 

✔️ 코드

import java.util.*;

class Solution {
    public int solution(int[] numbers, int target) {
        int answer = 0;
        List<Integer> list = new ArrayList<>();

        dfs(list, numbers, target, new int[numbers.length], 0, new boolean[numbers.length]);

        answer = (int) list.stream().filter(i -> i == target).count();

        return answer;
    }

    public void dfs(List<Integer> list, int[] numbers, int target, int[] expression, int index, boolean[] visited) {
        if(index == numbers.length) {
            list.add(Arrays.stream(expression).sum());
            return;
        }

        if(!visited[index]) {
            visited[index] = true;
            expression[index] = numbers[index];
            dfs(list, numbers, target, expression, index + 1, visited);
            expression[index] = -numbers[index];
            dfs(list, numbers, target, expression, index + 1, visited);
            visited[index] = false;
        }
    }
}

 

📄 원문

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

반응형
저작자표시 (새창열림)

'🧠 Algorithm > [JAVA] Programmers' 카테고리의 다른 글

[42578번] 위장  (0) 2022.07.18
[17687번] n진수 게임  (0) 2022.07.16
[42747번] H-Index  (0) 2022.07.14
[42584번] 주식가격  (0) 2022.07.13
[76502번] 괄호 회전하기  (0) 2022.07.12
    0_ch4n
    0_ch4n
    while(true) { study(); }

    티스토리툴바