https://school.programmers.co.kr/learn/courses/30/lessons/43165
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이
방법1. DFS : Stack 이용
data(number 배열의 값)과 idx(number 배열의 인덱스)를 가진 Node 클래스를 이용하여 Stack으로 DFS 코드를 짰다.
import java.util.*;
class Solution {
static class Node {
int data;
int idx;
Node(int data, int idx) {
this.data = data;
this.idx = idx;
}
}
public int solution(int[] numbers, int target) {
int answer = 0;
answer = DFS(numbers, target);
return answer;
}
public static int DFS(int[] numbers, int target) {
int answer = 0;
Stack<Node> s = new Stack<>();
s.push(new Node(numbers[0], 0));
s.push(new Node(-numbers[0], 0));
while(!s.isEmpty()) {
Node curr = s.pop();
if(curr.idx >= numbers.length-1) {
if(curr.data == target) answer ++;
continue;
}
int pos = curr.data+numbers[curr.idx+1];
int neg = curr.data-numbers[curr.idx+1];
s.push(new Node(pos, curr.idx+1));
s.push(new Node(neg, curr.idx+1));
}
return answer;
}
}
방법 2. DFS : 재귀함수 사용
위와 마찬가지로 data와 idx를 넘겨주는 재귀함수를 이용하여 DFS 코드를 짰다.
import java.util.*;
class Solution {
static int answer;
static int target;
static int[] numbers;
public int solution(int[] numbers, int target) {
answer = 0;
Solution.numbers = numbers;
Solution.target = target;
DFS(numbers[0], 0);
DFS(-numbers[0], 0);
return answer;
}
public static void DFS(int data, int idx) {
int pos = data+numbers[idx+1];
int neg = data-numbers[idx+1];
if(idx+1 >= numbers.length-1) {
if(pos == target) answer++;
if(neg == target) answer++;
return;
}
DFS(pos, idx+1);
DFS(neg, idx+1);
}
}
회고
BFS 코드는 시간초과가 나서 쓰지 않았다.
처음 썼던 코드는 HashMap을 이용한 코드였는데, 제대로 된 탐색이 되지 않은 점이 문제였던 것 같다.
감을 잘 못잡아서 모든 경우를 어떻게 다 돌리지? 라는 생각을 많이 했는데 역시나 그래프 탐색이었다. DP문제로 푸는 건줄 알고 많이 고생했는데 프로그래머스에서 AI로 코드를 분석해주는 기능이 생겨서 그것을 통해 알아냈다. 괜찮은 기능인 것 같다. GPT를 돌려도 제대로 된 답변을 받기 어려운데 해당 문제를 학습한 AI를 제공받음으로써 더 나은 방법을 알 수 있다는 점이 좋았다. 게다가 한 문제에 10회나 AI를 사용할 수 있고, 학습을 통해 문제 추천해주는 기능이 정말 좋은 것 같다. 나같은 코테 초보자에게는 어떻게 해야하는지 막막한 경우가 많은데 이 점이 학습자들을 실력향상의 길로 이끌어줄 거라 생각한다. 하지만 몇몇 문제는 AI가 지원되지 않아 아쉽다. 더 많이 풀어서 데이터를 쌓아야 하는건가? ㅋㅋ 데이터를 쌓아드리기 위해 열심히 해야겠다.
import java.util.*;
class Solution {
public int solution(int[] numbers, int target) {
int answer = 0;
HashMap<Integer, Integer> map = new HashMap<>();
int sum = 0;
for(int i: numbers) {
if(map.containsKey(i)) map.put(i, map.get(i)+1);
else map.put(i, 1);
sum += i;
}
if(sum == target) {
answer = 1;
return answer;
}
Arrays.sort(numbers);
boolean[] visited = new boolean[numbers.length];
for(int i=0; i<numbers.length; i++) {
if(!visited[i]) {
visited[i] = true;
int idx = 0;
while(sum != target) {
sum = 0;
for(int j=0; j<numbers.length; j++) {
if(visited[j]) {
sum -= numbers[j];
} else {
sum += numbers[j];
}
}
if(sum == target) {
int times = map.get(numbers[idx]);
answer += times;
break;
}
idx ++;
if(idx == numbers.length) break;
}
}
}
return answer;
}
}
'코딩테스트' 카테고리의 다른 글
[백준] '머리 톡톡' 1241번 - Java (1) | 2024.09.14 |
---|---|
[프로그래머스] Lv2. k진수에서 소수 개수 구하기 - Java (0) | 2024.09.13 |
[백준] 2212번 '센서' - Java (4) | 2024.09.06 |
[백준] 1052번 '물병' - Java (0) | 2024.08.27 |
[백준] 1111번 'IQ TEST' - Java (0) | 2024.08.26 |