오늘 할일
1. LeetCode
2. 인프라 강의
3. 세모봉 개발
4. 매일 토익
5. 소웨공 공부
오늘 한일
1. LeetCode
class Solution {
private int hit_count=0;
private int target_sum;
private Queue<TreeNode> queue=new LinkedList<>();
private void DFS(TreeNode node, int current_sum){
if(node==null){
return;
}
if(node.left!=null)
queue.add(node.left);
if(node.right!=null)
queue.add(node.right);
current_sum+=node.val;
if(current_sum==target_sum)
this.hit_count++;
DFS(node.left, current_sum);
DFS(node.right, current_sum);//분리필요. node.val=3, current_sum=0인 경우 2개 발생
}
public int pathSum(TreeNode root, int targetSum) {
this.target_sum=targetSum;
this.DFS(root, 0);
while(!queue.isEmpty()){
this.DFS(queue.remove(), 0);
}
return this.hit_count;
}
}
여러 상태를 출력하여 체크해본 결과 1,2,3,4,5 이진트리에서 노드 3이 두번 체크되고 있는 것을 확인할 수 있었다.
이 과정에서 DFS의 순회 방식에서 문제가 있음을 발견, 코드를 전부 지우고 처음부터 시작하며 모든 node의 val값을 출력하게끔하여 본래의 순환을 먼저 확인하였다. 기존의 과정은 DFS과정에서 left와 right에서 새로 탐색하는 결과도 포함하기 위해 DFS를 4번 호출하였는데 이가 화근이었다. 기본적인 DFS순회를 건들기보다 DFS순회를 그대로 활용하며 어떻게 처리해야할지를 고안했다. 그 결과 DFS함수를 두개 만들어서 처리해보았다. 첫 DFS는 순회를 진행하며 모든 노드를 Queue에 넣는다. 두번쨰 DFS는 Quque의 값을 빼어 일반 DFS를 진행한다.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private int hit_count=0;
private int target_sum;
private Queue<TreeNode> queue=new LinkedList();
private void DFS(TreeNode node, long current_sum){
if(node==null)
return;
if(node.left!=null)
queue.add(node.left);
if(node.right!=null)
queue.add(node.right);
current_sum+=node.val;
if(current_sum==this.target_sum)
this.hit_count++;
DFS(node.left, current_sum);
DFS(node.right, current_sum);
}
private void DFS2(TreeNode node, int current_sum){
if(node==null)
return;
current_sum+=node.val;
if(current_sum==this.target_sum)
this.hit_count++;
DFS2(node.left, current_sum);
DFS2(node.right, current_sum);
}
public int pathSum(TreeNode root, int targetSum) {
this.target_sum=targetSum;
this.DFS(root, 0);
while(!queue.isEmpty()){
this.DFS2(queue.remove(), 0);
}
return this.hit_count;
}
}
그 결과 상당한 발전이 있었다. 새롭게 맞이한 테스트케이스를 보면 큰수의 연산으로 오버플로우를 일으키는 방식의 케이스이다. 이 케이스는 잘못되었는데, 문제에 기재된 node값의 제한이 0~1000이기 때문이다.
타입을 long으로 바꾸어 해결하였다.
2. 매일 토익
3. 인프라 강의