[LeetCode][JS] 테스트를 위한 TreeNode 인스턴스 생성
저는 LeetCode 알고리즘 문제를 풀 때 문제를 로컬에서 코드 작성 후 테스트 케이스를 통과하는 경우 LeetCode 사이트에 붙여 넣어 확인하곤 했습니다. BinaryTree 문제 같은 경우, 테스트 케이스는 리스트로 주어지지만 코드를 작성할 때는 TreeNode 인스턴스를 이용해서 해결을 해야합니다.
리스트로 된 테스트 케이스[칼럼 1]를 TreeNode를 이용해서 [컬럼 2]처럼 인스턴스를 생성하고 [컬럼 3]처럼 되어야지 테스트가 가능합니다.
테스트 케이스 | TreeNode 인스턴스 생성 | TreeNode 인스턴스 결과 |
[2,1,3,null,null,0,1] | const tree = new TreeNode(2); tree.left = new TreeNode(1); tree.left.left = null; tree.left.right = null; tree.right = new TreeNode(3); tree.right.left = new TreeNode(0); tree.right.right = new TreeNode(1); |
TreeNode { val: 2, left: TreeNode { val: 1, left: null, right: null }, right: TreeNode { val: 3, left: TreeNode { val: 0, left: null, right: null }, right: TreeNode { val: 1, left: null, right: null } } } |
매번 리스트를 TreeNode로 변경함에 있어서 불편함을 느껴 LeetCode에서 코딩을 하곤 했는데, 문제의 난이도가 어려워질수록 LeetCode에서 직접 코드를 작성하고 테스트하는 것에 대한 불편함이 더 커져서 아예 TreeNode를 만드는 모듈을 생성하였습니다!
🌳 Binary Tree를 위한 Tree 생성 모듈 만들기
TreeNode 인스턴스 생성 함수
TreeNode 인스턴스를 생성하는 함수는 LeetCode에서 문제 화면 우측 코드 작성하는 부분 최상단에 주석으로 알려주고 있습니다.
function TreeNode(val, left, right) {
this.val = val === undefined ? 0 : val;
this.left = left === undefined ? null : left;
this.right = right === undefined ? null : right;
}
Tree 생성 함수
TreeNode를 이용해서 전달받은 리스트를 원하는 형식으로 만들어야 합니다. 위에 테이블처럼 left, right에 TreeNode 인스턴스를 생성해서 넣어줘야 합니다. 트리의 깊이는 테스트 케이스마다 다르기 때문에 반복문을 통해서 동적으로 트리를 생성할 수 있도록 해야 했고, 이터레이터를 이용해서 리스트의 다음 값을 갖고 와서 TreeNode를 인스턴스를 생성하고 넣어줬습니다.
function createTreeNode(root) {
if (!root) return null;
const values = root[Symbol.iterator]();
const tree = new TreeNode(values.next().value);
const queue = new Set().add(tree);
for (const node of queue) {
for (const position of ["left", "right"]) {
const value = values.next().value;
if (value != null) queue.add((node[position] = new TreeNode(value)));
}
}
return tree;
}
전체 코드
function TreeNode(val, left, right) {
this.val = val === undefined ? 0 : val;
this.left = left === undefined ? null : left;
this.right = right === undefined ? null : right;
}
function createTreeNode(root) {
if (!root) return null;
const values = root[Symbol.iterator]();
const tree = new TreeNode(values.next().value);
const queue = new Set().add(tree);
for (const node of queue) {
for (const position of ["left", "right"]) {
const value = values.next().value;
if (value != null) queue.add((node[position] = new TreeNode(value)));
}
}
return tree;
}
module.exports = { createTreeNode };
🌳 테스트 코드에서의 활용
만든 TreeNode 생성 모듈을 추가하여 테스트를 진행하도록 하였습니다. 아무래도 LeetCode에서 실행되어야 하는 설루션 함수에 직접 사용하기에는 LeetCode에서는 필요 없는 부분이기 때문에 테스트 코드 실행 시 설정하였습니다.
아래는 문제를 해결하는 솔루션 함수가 정의되었다는 가정하에 LeetCode 2331번 문제를 테스트하는 테스트 코드입니다.
// 문제 해결하는 솔루션 함수 추가
const solution = require("../../leetcode/2331");
// TreeNode 생성하는 모듈 추가
const { createTreeNode } = require("../../utils/TreeNode");
// 테스트
describe("Evaluate Boolean Binary Tree", () => {
test("#1", () => {
expect(solution(createTreeNode([2, 1, 3, null, null, 0, 1]))).toEqual(true);
});
test("#2", () => {
expect(solution(createTreeNode([0]))).toEqual(false);
});
});
결론
아무래도 매번 LeetCode에서 코드를 작성하고 해결하는데 중간 테스트해 보는 것에 불편함을 느꼈는데, TreeNode를 만드는 모듈을 생성함으로써 로컬에서도 코드를 작성하고 테스트해 볼 수 있어서 알고리즘을 해결하는데 좀 더 수월해졌습니다. 🙂