728x90
DFS랑 BFS가 뭔지 까먹어서 다시 찾아봤다!! 이건 정리해놔야지
대충 자료구조를 트리에 맞춰두고, 거기에 맞게 탐색하는 방법이다.
그러니까 문제에서 주어진 number들을 계산사는걸 어케어케 트리로 잘 생각할 수 있어야 하는거다
40분만에 겨우풀었다.. 미들러 문제 목표는 30분내로 푸는거라 많이 부족한것같다 더 노력해야지,,,,,,,,,,,,,,,
숫자가 리스트(vector)로 주어지고, 순서를 바꾸지 않고 덧셈과 뺄셈을 적절히 조합하여 target과 같은 결과를 내도록 하는 경우의 수를 찾는 문제였다.
이걸 어떻게 tree로 봐야하는지 고민하느라 시간이 많이걸렸는데 내 결론은 이거였다 (틀릴수도 있지만,,,)
만약 숫자 리스트가 [4,1,2,1] 이면
이런 모양의 트리를 생각한다
그러면 DFS로 한줄씩 탐색해서 root일 때 최종 sum 결과들을 모은다.
이것들 중 target과 같은게 몇개인지 세면 된다! (BFS로는 안될것같다,, 아마,,?)
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;
void DFS(vector<int> numbers, int level, int sum, vector<int> &result){
// level : tree 전체의 레벨, level은 0부터 시작
// 2진트리니까 왼쪽, 오른쪽만 확인하면됨
// 지금이 오른쪽이면 자기한테 -붙이기!
int now_level = level - numbers.size() + 1;
if(now_level == level){
// numbers size가 1일때, 마지막레벨
// 더이상 확인할게 없음
// sum에 앞에것들이 누적되어서 들어왔었음!
int leftsum = sum + numbers[0];
int rightsum = sum - numbers[0];
result.push_back(leftsum);
result.push_back(rightsum);
return;
}
vector<int> subtree = numbers;
subtree.erase(subtree.begin()); // 지금 자기자신인 [0]은 sub tree에서 삭제!
int now = numbers[0];
// 왼쪽
int leftsum = sum + now;
DFS(subtree, level, leftsum, result);
// 오른쪽
int rightsum = sum - now;
DFS(subtree, level, rightsum, result);
}
int solution(vector<int> numbers, int target) {
int answer = 0;
// level이 numbers.size만큼 있는 이진트리
// 각 레벨 i에는 numbers[i]가 + - + -순서로,,,
int level = numbers.size();
vector<int> dfs_result;
DFS(numbers, level, 0, dfs_result);
for(int i =0; i<dfs_result.size(); i++){
if(dfs_result[i] == target){
answer++;
}
}
return answer;
}
이게맞겠지,,,
일단 풀렸으니까 됐다
DFS랑 BFS나 복습해야겠다.
728x90
'코테준비 > 하루한개도전~' 카테고리의 다른 글
99클럽 코테 스터디 : 깊이/너비 우선탐색(DFS/BFS) - 게임 맵 최단거리 (1) | 2024.06.03 |
---|---|
99클럽 코테 스터디 7일차 TIL : 깊이/너비 우선탐색(DFS/BFS) - 퍼즐 조각 채우기 (챌린저) (0) | 2024.05.30 |
99클럽 코테 스터디 6일차 TIL : 완전탐색 - 소수찾기 (2) | 2024.05.29 |
99클럽 코테 스터디 5일차 TIL : 완전탐색 - 카펫 (0) | 2024.05.28 |
99클럽 코테 스터디 4일차 TIL : 정렬 - H-index (2) | 2024.05.27 |