ygreenb
yellowgreenblue
ygreenb
전체 방문자
오늘
어제
  • TIL (130)
    • Algorithm & Data Structure (70)
      • 이론 (4)
      • 프로그래머스 (54)
      • 백준 (12)
    • JAVA (4)
    • Android Studio (9)
    • Database (1)
    • WEB (25)
      • HTML+CSS (7)
      • Javascript (5)
      • React (11)
      • Django (1)
      • Node.js (1)
    • Computer Vision (13)
    • Git (8)

블로그 메뉴

  • HOME
  • TAG
  • GITHUB

공지사항

인기 글

태그

  • java
  • BFS
  • git bash
  • sort
  • entrySet
  • reactjs
  • HashMap
  • Arrays.sort()
  • PriorityQueue
  • git
  • React
  • compareTo()
  • 스택/큐
  • 코틀린
  • 프로그래머스 Lv.2
  • Android
  • 백준
  • 깃
  • kotiln
  • Comparator
  • dfs
  • 해시
  • DP
  • 프로그래머스
  • Queue
  • getOrDefault
  • 안드로이드
  • greedy
  • stack
  • 깃허브

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ygreenb

yellowgreenblue

Algorithm & Data Structure/프로그래머스

[Java] 프로그래머스 Lv.2 : 타겟 넘버

2022. 3. 16. 13:46

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

 

코딩테스트 연습 - 타겟 넘버

n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수

programmers.co.kr

 

풀이

DFS를 이용한 풀이

depth 변수 값을 통해 탐색 중인 트리의 깊이를 알 수 있다.

트리 끝에 도착했다면, 여태 계산한 result와 target 값을 비교한다.

class Solution {
    int count = 0;
    public int solution(int[] numbers, int target) {
        int answer = 0;
        dfs(numbers, 0, target, 0);
        answer = this.count;
        
        return answer;
    }
    public void dfs(int[] numbers, int depth, int target, int result){
        // 트리 끝이라면 target과 비교
        if(depth == numbers.length){ 
            if(result == target) this.count++;
            return;
        }
        // 덧셈과 뺄셈 각각 계산
        dfs(numbers, depth+1, target, result + numbers[depth]);
        dfs(numbers, depth+1, target, result - numbers[depth]);
    }
}

 

동적계획법(다이나믹)을 이용한 풀이

마지막 return문에서 dfs를 한 번 더 호출해서 분기를 만들어준다.

n이 numbers.length에 도달할 때 까지 다음 숫자가 음수인 경우와 양수인 dfs를 반복..

모든 경우의 수를 빠르게 찾을 수 있음..

class Solution {
    public int solution(int[] numbers, int target) {
        int answer = 0;
        answer = dfs(numbers, 0, 0, target);
        return answer;
    }
    int dfs(int[] numbers, int n, int sum, int target) {
        if(n == numbers.length) {
            if(sum == target) {
                return 1;
            }
            return 0;
        }
        return dfs(numbers, n + 1, sum + numbers[n], target) + dfs(numbers, n + 1, sum - numbers[n], target);
    }
}

 

 

BFS를 이용한 풀이

numbers에 있는 숫자를 더하거나 뺀 경우를 수평적으로 추가

stack에 모든 계산 결과가 담기게 되고 이후 target값과 비교해서 결과 출력

import java.util.ArrayList;
import java.util.Stack;
class Solution {
	public int solution(int[] numbers, int target) {
		int answer = 0;
		int stackNum = 0;
		int	nextNum = 0;
		
		ArrayList<Integer> list;
		Stack<Integer> stack = new Stack<Integer>();
		
		stack.push(numbers[0]);
		stack.push(numbers[0]*-1);
		
		for (int i = 1; i < numbers.length; i++) {
			nextNum = numbers[i];
			list = new ArrayList<Integer>();
				
			while(!stack.isEmpty()) {
				stackNum = stack.pop();
					
				list.add(stackNum+nextNum);
				list.add(stackNum+(nextNum*-1));
			}
				
			for (int j = 0; j < list.size(); j++) {
				stack.push(list.get(j));
			}
		} 
	    	
	    for (Integer sum : stack) {
	    	if(sum == target)
	    		answer++;
		}
	    return answer;
	}
}
저작자표시 (새창열림)

'Algorithm & Data Structure > 프로그래머스' 카테고리의 다른 글

[Java] 프로그래머스 : 문자열을 정수로 바꾸기(feat. String to Int)  (0) 2022.04.15
[Java] 프로그래머스 Lv.2 : 가장 큰 정사각형 찾기  (0) 2022.03.16
[Java] 프로그래머스 Lv.2 : 구명보트  (0) 2022.03.14
[Java] 프로그래머스 Lv.2 : 소수 찾기  (0) 2022.03.13
[Java] 프로그래머스 Lv.2 : 카펫  (0) 2022.03.13
    'Algorithm & Data Structure/프로그래머스' 카테고리의 다른 글
    • [Java] 프로그래머스 : 문자열을 정수로 바꾸기(feat. String to Int)
    • [Java] 프로그래머스 Lv.2 : 가장 큰 정사각형 찾기
    • [Java] 프로그래머스 Lv.2 : 구명보트
    • [Java] 프로그래머스 Lv.2 : 소수 찾기
    ygreenb
    ygreenb
    개발공부기록장

    티스토리툴바