dfs(7)
-
[Array, DFS] Word Search
board라는 2차원 배열로 매트릭스가 주어지고, word라는 글자가 sequential하게 이어질 수 있는지 여부를 리턴하는 문제 DFS를 하면서 해당하는 word가 나오면 하나씩 substring하는 방식으로 풀어보았다 일단 dfs함수는 board와 i,j라는 위치, 남은 word인 remain을 인자로 받는다. remain이 더이상 남아있지 않으면 true, 있으면 false를 리턴한다. 모든 요소에 대해 검사를 진행할것인데, 검사가 진행된 board는 - 로 바꿔준다 이후 해당 char에 인접한 동서남북을 각각 dfs하여 remain[0]이 없는 경우는 바로 false를 리턴해주고 나머지는 true로 진행한다.
2021.04.06 -
[Tree, DFS] Path Sum III
트리에서 특정 sum을 만들어 낼 수 있는 연속된 부분집합을 찾아라 약간 헷갈렸는데, dfs와 재귀를 별개로 사용하면 된다. 하나의 노드에서 dfs를 실행하는데, 그게 모든 node가 root가 되어 실행되어야 한다. 그렇기 때문에 dfs는 원래대로 해준다. 이때 오해하지 말아야 할 점이, 같은 root에서 시작한다고 하더라도 조건을 만족하는 답은 여러개 있을수 있으므로, left와 right를 leaf까지 dfs돌려줘야 한다. 최종적으로는 특정 root를 기준으로 나온 count들을 전부 합하면 된다.
2021.04.06 -
[DFS] Number of Islands
1을 섬, 0을 물이라고 할때 섬의 갯수를 구하라는 문제이다 섬끼리는 adjacent되어 있다 예시로 설명을 해보자면, 이렇게 동서남북이 물에 의해 끊기지 않는 덩어리의 갯수를 구하라는 뜻이다. 이러한 문제는 DFS로 풀어낼 수 있다. DFS는 기본적으로 stack을 하나 두고, 방문전 node들을 모두 false로 둔다 이후 방문한 node에 대해 true로 바꾸고, 방문한 node와 인접한 node들을 모두 stack에 담는다. stack 에 담긴 node에 하나씩 접근하는데, 이때 node의 로직처리를 스택의 순서대로 한다. 예시를 들어보자면 다음과 같다. DFS를 하면 해당 그래프는 우측상단의 순서대로 순회가 될 텐데, 그 과정에서 stack과 array의 변화를 일부 살펴보면 아래와 같다. 방문..
2021.04.06 -
[Tree] Validate Binary Search Tree
tree가 valid한지 판단하라는 것인데, 이 트리의 valid함은 left, right 트리가 크기대로 잘 정렬되어있냐의 여부이다 경계값을 제거하고, helper함수에 대해 root가 min보다 작은 value를 가졌거나, max보다 큰 value를 가진 경우에 false를 리턴해주면 된다.
2021.04.05 -
[Tree] Flatten Binary Tree to Linked List
트리가 주어지면 이를 Linked-List로 바꾸는 문제이다. 조건에 따라 right node는 next node가 되고, previous는 null이 된다. convertToList라는 함수를 제외하고 보자. Tree니까 재귀를 떠올리고. root가 주어지면, root의 left와 right를 flat하게 만든 후, null- root - left subtree - right subtree 형태로 붙이면된다. 이때 left와 right의 관계를 재귀로 처리해준다. 이제 convertToList를 살펴보면, right가 있는 경우, left.right가 null이 될대까지 모든 left node를 거슬러 내려간다 예컨데 left의 node가 3개라면, first.right는 Loop가 세번 돌아야 존재할..
2021.03.29 -
[Tree] Binary Tree Right Side View
right 노드들만 배열로 만들어 리턴하라는 문제다 BST에서 right노드는 부모노드보다 큰 value를 가진 애들일테다 처음엔 이렇게 간단한 로직만 생각했었는데, level을 고려하지 못했다는 사실을 깨달았다 이전 level에 따른 traverse와 동일하게 args를 설정하면 된다 새로운 level에 도달하면 일단 node의 value를 넣어주되, right node가 있는 경우에는 right node의 value를 push 없다면 left node를 push하는 것으로 설정한다 이러한 조건은 level과 length가 같은지를 체크함으로 설정한다 right node의 value가 이미 들어왔다면 해당 조건을 만족하지 못하므로 별도의 node입력 없이 끝날것이기 때문
2021.03.29