시행착오 1
-> 그래프를 행렬그래프를 통해서 풀어보자
class Solution {
static int count = 0;
public long solution(int[] a, int[][] edges) {
int[][] map = new int[a.length][a.length];
for(int i = 0 ; i < edges.length ; i++) {
map[edges[i][0]][edges[i][1]] = 1;
map[edges[i][1]][edges[i][0]] = 1;
}
for(int i = 0 ; i <edges.length ; i++){
logic(edges[0][1],a,map);
}
for(int i = 0 ; i < a.length;i++){
if(a[i] != 0){
return -1;
}
}
return count;
}
public long logic(int src, int[] weights, int[][] map){
for(int i = 0 ; i < map.length ; i++){
if(i != src && map[src][i] == 1){
int nextSrc = i;
map[src][nextSrc] = 0;
map[nextSrc][src] = 0;
long leafItem = logic(nextSrc, weights, map);
weights[src] += leafItem;
count+= leafItem;
weights[nextSrc] = 0;
}
}
return weights[src];
}
}
메모리 초과가 엄청나다..
사유 : 방향 그래프라서, 행렬 그래프로 넣게되면 무방향 그래프가 되므로, 작성함
이걸 어떻게 해결할까
시행착오 2.
Node 객체를 만들어서, 연결하고, 각 객체를 이동하면서 dfs 를 이용, 마지막 방문하는 노드부터 숫자를 더하는 방식으로 계산해보았다.
메모리 초과는 안된다.
메모리 초과 해결 방안
1. 연결하는 부분에 메모리를 쓰지 말아보자 -> node 의 생성을 한번만 가능하도록 처리하자
2.행렬 그래프는 사용하지 말자
시간초과가 엄청난다
다음 방식은 어떤 방식으로 해야하나
import java.util.*;
class Solution {
int count = 0;
class Node {
int node;
int weight;
boolean visit;
List<Node> children;
public Node(int node, int weight) {
this.node = node;
this.weight = weight;
this.visit = false;
this.children = new ArrayList<>();
}
public boolean isVisit(){
return this.visit;
}
public Node connectNode(List<Node> nodes, int[][] edges){
for(int i=0 ; i < edges.length ; i++){
if(edges[i][0] == this.node){
this.children.add(nodes.get(edges[i][1]));
}
if(edges[i][1] == this.node){
this.children.add(nodes.get(edges[i][0]));
}
}
return this;
}
public void visit(){
this.visit = true;
}
}
public long solution(int[] a, int[][] edges) {
int answer = 0;
List<Node> nodes = new ArrayList<>(a.length);
for(int i = 0 ; i < a.length ; i++){
Node node = new Node(i, a[i]);
nodes.add(node);
}
for(Node node : nodes){
node.connectNode(nodes, edges);
}
Node startNode = nodes.get(0);
this.dfs(startNode);
if(startNode.weight != 0) return -1;
return count;
}
public void dfs(Node startNode){
if(startNode.isVisit()){
return;
}
startNode.visit();
List<Node> children = startNode.children;
for(Node node : children){
if(node.isVisit()){
continue;
}
dfs(node);
count += node.weight;
startNode.weight += node.weight;
node.weight = 0;
}
}
}'JAVA 기본 > 코딩테스트 문제' 카테고리의 다른 글
| 프로그래머스-등굣길 (0) | 2022.09.11 |
|---|---|
| 프로그래머스-최댓값과 최솟값 (0) | 2022.09.10 |
| 프로그래머스-나머지가 1이 되는 수 찾기 (0) | 2022.09.10 |