mirror of
https://github.com/krahets/hello-algo.git
synced 2026-11-11 00:11:00 +08:00
3991 lines
516 KiB
HTML
3991 lines
516 KiB
HTML
|
||
<!DOCTYPE html>
|
||
|
||
<html class="no-js" lang="ko">
|
||
<head>
|
||
<meta charset="utf-8"/>
|
||
<meta content="width=device-width,initial-scale=1" name="viewport"/>
|
||
<meta content="애니메이션으로 설명하고 클릭 한 번으로 실행하는 자료 구조와 알고리즘 입문서" name="description"/>
|
||
<meta content="krahets" name="author"/>
|
||
<link href="https://www.hello-algo.com/ko/chapter_backtracking/backtracking_algorithm/" rel="canonical"/>
|
||
<link href="../" rel="prev"/>
|
||
<link href="../permutations_problem/" rel="next"/>
|
||
<link href="/chapter_backtracking/backtracking_algorithm/" hreflang="zh" rel="alternate"/>
|
||
<link href="/zh-hant/chapter_backtracking/backtracking_algorithm/" hreflang="zh-Hant" rel="alternate"/>
|
||
<link href="/en/chapter_backtracking/backtracking_algorithm/" hreflang="en" rel="alternate"/>
|
||
<link href="/ja/chapter_backtracking/backtracking_algorithm/" hreflang="ja" rel="alternate"/>
|
||
<link href="/ru/chapter_backtracking/backtracking_algorithm/" hreflang="ru" rel="alternate"/>
|
||
<link href="/ko/chapter_backtracking/backtracking_algorithm/" hreflang="ko" rel="alternate"/>
|
||
<link href="../../assets/images/favicon.png" rel="icon"/>
|
||
<meta content="zensical-0.0.51" name="generator"/>
|
||
<title>13.1 백트래킹 알고리즘 - Hello 알고리즘</title>
|
||
<link href="../../assets/stylesheets/modern/main.62c9b9cc.min.css" rel="stylesheet"/>
|
||
<link href="../../assets/stylesheets/modern/palette.dfe2e883.min.css" rel="stylesheet"/>
|
||
|
||
|
||
<style>:root{--md-text-font:"Noto Sans KR";--md-code-font:"JetBrains Mono"}</style>
|
||
<link href="../../stylesheets/extra.css" rel="stylesheet"/>
|
||
<link href="../../stylesheets/animation_player.css" rel="stylesheet"/>
|
||
<script>__md_scope=new URL("../..",location),__md_scope.pathname.endsWith("/")||(__md_scope=new URL(__md_scope.pathname+"/",location)),__md_hash=e=>[...e].reduce(((e,t)=>(e<<5)-e+t.charCodeAt(0)),0),__md_get=(e,t=localStorage,_=__md_scope)=>JSON.parse(t.getItem(_.pathname+"."+e)),__md_set=(e,t,_=localStorage,a=__md_scope)=>{try{_.setItem(a.pathname+"."+e,JSON.stringify(t))}catch(e){}},document.documentElement.setAttribute("data-platform",navigator.platform)</script>
|
||
<script data-ha-shared-palette="1">
|
||
/* Share only the palette across language roots; other preferences stay scoped. */
|
||
(() => {
|
||
const get = __md_get;
|
||
const set = __md_set;
|
||
const shared = new URL("/", location);
|
||
__md_get = (key, storage = localStorage, scope = __md_scope) => {
|
||
if (key !== "__palette") return get(key, storage, scope);
|
||
let value = get(key, storage, shared);
|
||
// Adopt the current language's old preference only if none is shared yet.
|
||
if (value === null && scope.pathname !== shared.pathname) {
|
||
value = get(key, storage, scope);
|
||
if (value !== null) set(key, value, storage, shared);
|
||
}
|
||
return value;
|
||
};
|
||
__md_set = (key, value, storage = localStorage, scope = __md_scope) =>
|
||
set(key, value, storage, key === "__palette" ? shared : scope);
|
||
})();
|
||
</script>
|
||
<link href="/assets/figure-svg/css/abd17f77112eaa7224f372b6.css" rel="stylesheet"/><link href="/assets/figure-svg/css/9f909651eeceaf5c7dda140d.css" rel="stylesheet"/></head>
|
||
<body data-md-color-accent="teal" data-md-color-primary="white" data-md-color-scheme="default" dir="ltr">
|
||
<input autocomplete="off" class="md-toggle" data-md-toggle="drawer" id="__drawer" type="checkbox"/>
|
||
<input autocomplete="off" class="md-toggle" data-md-toggle="search" id="__search" type="checkbox"/>
|
||
<label aria-label="네비게이션" class="md-overlay" for="__drawer"></label>
|
||
<div data-md-component="skip">
|
||
<a class="md-skip" href="#131">
|
||
콘텐츠로 이동
|
||
</a>
|
||
</div>
|
||
<div data-md-component="announce">
|
||
<aside class="md-banner">
|
||
<div class="md-banner__inner md-grid md-typeset">
|
||
</div>
|
||
</aside>
|
||
</div>
|
||
<header class="md-header md-header--shadow" data-md-component="header">
|
||
<nav aria-label="상단/헤더" class="md-header__inner md-grid">
|
||
<a aria-label="Hello 알고리즘" class="md-header__button md-logo" data-md-component="logo" href="../.." title="Hello 알고리즘">
|
||
<img alt="Hello 알고리즘" src="../../assets/images/logo.svg"/>
|
||
</a>
|
||
<label aria-label="네비게이션" class="md-header__button md-icon" for="__drawer">
|
||
<svg class="lucide lucide-menu" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M4 5h16M4 12h16M4 19h16"></path></svg>
|
||
</label>
|
||
<div class="md-header__title" data-md-component="header-title">
|
||
<div class="md-header__ellipsis">
|
||
<div class="md-header__topic">
|
||
<span class="md-ellipsis">
|
||
Hello 알고리즘
|
||
</span>
|
||
</div>
|
||
<div class="md-header__topic" data-md-component="header-topic">
|
||
<span class="md-ellipsis">
|
||
|
||
13.1 백트래킹 알고리즘
|
||
|
||
</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<form class="md-header__option" data-md-component="palette">
|
||
<input aria-label="어두운 테마" class="md-option" data-md-color-accent="teal" data-md-color-media="none" data-md-color-primary="white" data-md-color-scheme="default" id="__palette_0" name="__palette" type="radio"/>
|
||
<label class="md-header__button md-icon" for="__palette_1" hidden="" title="어두운 테마">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M7.5 2c-1.79 1.15-3 3.18-3 5.5s1.21 4.35 3.03 5.5C4.46 13 2 10.54 2 7.5A5.5 5.5 0 0 1 7.5 2m11.57 1.5 1.43 1.43L4.93 20.5 3.5 19.07zm-6.18 2.43L11.41 5 9.97 6l.42-1.7L9 3.24l1.75-.12.58-1.65L12 3.1l1.73.03-1.35 1.13zm-3.3 3.61-1.16-.73-1.12.78.34-1.32-1.09-.83 1.36-.09.45-1.29.51 1.27 1.36.03-1.05.87zM19 13.5a5.5 5.5 0 0 1-5.5 5.5c-1.22 0-2.35-.4-3.26-1.07l7.69-7.69c.67.91 1.07 2.04 1.07 3.26m-4.4 6.58 2.77-1.15-.24 3.35zm4.33-2.7 1.15-2.77 2.2 2.54zm1.15-4.96-1.14-2.78 3.34.24zM9.63 18.93l2.77 1.15-2.53 2.19z"></path></svg>
|
||
</label>
|
||
<input aria-label="밝은 테마" class="md-option" data-md-color-accent="teal" data-md-color-media="none" data-md-color-primary="black" data-md-color-scheme="slate" id="__palette_1" name="__palette" type="radio"/>
|
||
<label class="md-header__button md-icon" for="__palette_0" hidden="" title="밝은 테마">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M7.5 2c-1.79 1.15-3 3.18-3 5.5s1.21 4.35 3.03 5.5C4.46 13 2 10.54 2 7.5A5.5 5.5 0 0 1 7.5 2m11.57 1.5 1.43 1.43L4.93 20.5 3.5 19.07zm-6.18 2.43L11.41 5 9.97 6l.42-1.7L9 3.24l1.75-.12.58-1.65L12 3.1l1.73.03-1.35 1.13zm-3.3 3.61-1.16-.73-1.12.78.34-1.32-1.09-.83 1.36-.09.45-1.29.51 1.27 1.36.03-1.05.87zM19 13.5a5.5 5.5 0 0 1-5.5 5.5c-1.22 0-2.35-.4-3.26-1.07l7.69-7.69c.67.91 1.07 2.04 1.07 3.26m-4.4 6.58 2.77-1.15-.24 3.35zm4.33-2.7 1.15-2.77 2.2 2.54zm1.15-4.96-1.14-2.78 3.34.24zM9.63 18.93l2.77 1.15-2.53 2.19z"></path></svg>
|
||
</label>
|
||
</form>
|
||
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
||
<div class="md-header__option">
|
||
<div class="md-select">
|
||
<button aria-label="언어설정" class="md-header__button md-icon">
|
||
<svg class="lucide lucide-languages" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m5 8 6 6M4 14l6-6 2-3M2 5h12M7 2h1M22 22l-5-10-5 10M14 18h6"></path></svg>
|
||
</button>
|
||
<div class="md-select__inner">
|
||
<ul class="md-select__list">
|
||
<li class="md-select__item">
|
||
<a class="md-select__link" href="/chapter_backtracking/backtracking_algorithm/" hreflang="zh">
|
||
简体中文
|
||
</a>
|
||
</li>
|
||
<li class="md-select__item">
|
||
<a class="md-select__link" href="/zh-hant/chapter_backtracking/backtracking_algorithm/" hreflang="zh-Hant">
|
||
繁體中文
|
||
</a>
|
||
</li>
|
||
<li class="md-select__item">
|
||
<a class="md-select__link" href="/en/chapter_backtracking/backtracking_algorithm/" hreflang="en">
|
||
English
|
||
</a>
|
||
</li>
|
||
<li class="md-select__item">
|
||
<a class="md-select__link" href="/ja/chapter_backtracking/backtracking_algorithm/" hreflang="ja">
|
||
日本語
|
||
</a>
|
||
</li>
|
||
<li class="md-select__item">
|
||
<a class="md-select__link" href="/ru/chapter_backtracking/backtracking_algorithm/" hreflang="ru">
|
||
Русский
|
||
</a>
|
||
</li>
|
||
<li class="md-select__item">
|
||
<a class="md-select__link" href="/ko/chapter_backtracking/backtracking_algorithm/" hreflang="ko">
|
||
한국어
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<label aria-label="검색" class="md-header__button md-icon" for="__search">
|
||
<svg class="lucide lucide-search" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m21 21-4.34-4.34"></path><circle cx="11" cy="11" r="8"></circle></svg>
|
||
</label>
|
||
<div aria-label="검색" class="md-search" data-md-component="search" role="dialog">
|
||
<button class="md-search__button" type="button">
|
||
검색
|
||
</button>
|
||
</div>
|
||
<div class="md-header__source">
|
||
<a class="md-source" data-md-component="source" href="https://github.com/krahets/hello-algo" title="저장소로 이동">
|
||
<div class="md-source__icon md-icon">
|
||
<svg viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2" fill="currentColor"></path></svg>
|
||
</div>
|
||
<div class="md-source__repository">
|
||
krahets/hello-algo
|
||
</div>
|
||
</a>
|
||
</div>
|
||
</nav>
|
||
</header>
|
||
<div class="md-container" data-md-component="container">
|
||
<main class="md-main" data-md-component="main">
|
||
<div class="md-main__inner md-grid">
|
||
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation">
|
||
<div class="md-sidebar__scrollwrap">
|
||
<div class="md-sidebar__inner">
|
||
<nav aria-label="네비게이션" class="md-nav md-nav--primary" data-md-level="0">
|
||
<label class="md-nav__title" for="__drawer">
|
||
<a aria-label="Hello 알고리즘" class="md-nav__button md-logo" data-md-component="logo" href="../.." title="Hello 알고리즘">
|
||
<img alt="Hello 알고리즘" src="../../assets/images/logo.svg"/>
|
||
</a>
|
||
Hello 알고리즘
|
||
</label>
|
||
<div class="md-nav__source">
|
||
<a class="md-source" data-md-component="source" href="https://github.com/krahets/hello-algo" title="저장소로 이동">
|
||
<div class="md-source__icon md-icon">
|
||
<svg viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2" fill="currentColor"></path></svg>
|
||
</div>
|
||
<div class="md-source__repository">
|
||
krahets/hello-algo
|
||
</div>
|
||
</a>
|
||
</div>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_1" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_hello_algo/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m13.13 22.19-1.63-3.83c1.57-.58 3.04-1.36 4.4-2.27zM5.64 12.5l-3.83-1.63 6.1-2.77C7 9.46 6.22 10.93 5.64 12.5M19.22 4c.28 0 .53 0 .74.05.17 1.39-.02 4.25-3.3 7.53-1.7 1.71-3.73 3.02-6.01 3.89l-2.15-2.1c.92-2.31 2.23-4.34 3.92-6.03C15.18 4.58 17.64 4 19.22 4m0-2c-1.98 0-4.98.69-8.22 3.93-2.19 2.19-3.5 4.6-4.35 6.71-.28.75-.09 1.57.46 2.13l2.13 2.12c.38.38.89.61 1.42.61.23 0 .47-.06.7-.15A19.1 19.1 0 0 0 18.07 13c5.66-5.66 3.54-10.61 3.54-10.61S20.7 2 19.22 2m-4.68 7.46c-.78-.78-.78-2.05 0-2.83s2.05-.78 2.83 0c.77.78.78 2.05 0 2.83s-2.05.78-2.83 0m-5.66 7.07-1.41-1.41zM6.24 22l3.64-3.64c-.34-.09-.67-.24-.97-.45L4.83 22zM2 22h1.41l4.77-4.76-1.42-1.41L2 20.59zm0-2.83 4.09-4.08c-.21-.3-.36-.62-.45-.97L2 17.76z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
머리말
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_1_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_1">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
머리말
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_2" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_preface/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M21 4H3a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2h18a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2M3 19V6h8v13zm18 0h-8V6h8zm-7-9.5h6V11h-6zm0 2.5h6v1.5h-6zm0 2.5h6V16h-6z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 0 장 들어가며
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_2" id="__nav_2_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_2_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_2">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 0 장 들어가며
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_preface/about_the_book/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
0.1 이 책에 대하여
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_preface/suggestions/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
0.2 이 책을 활용하는 방법
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_preface/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
0.3 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_3" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_introduction/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19 3H5c-1.1 0-2 .9-2 2v14c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2m0 16H5V5h14zM6.2 7.7h5v1.5h-5zm6.8 8.1h5v1.5h-5zm0-2.6h5v1.5h-5zM8 18h1.5v-2h2v-1.5h-2v-2H8v2H6V16h2zm6.1-7.1 1.4-1.4 1.4 1.4 1.1-1-1.4-1.4L18 7.1 16.9 6l-1.4 1.4L14.1 6 13 7.1l1.4 1.4L13 9.9z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 1 장 알고리즘과의 첫 만남
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_3_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_3">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 1 장 알고리즘과의 첫 만남
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_introduction/algorithms_are_everywhere/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
1.1 어디에나 있는 알고리즘
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_introduction/what_is_dsa/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
1.2 알고리즘이란 무엇인가
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_introduction/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
1.3 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_4" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_computational_complexity/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M6 2h12v6l-4 4 4 4v6H6v-6l4-4-4-4zm10 14.5-4-4-4 4V20h8zm-4-5 4-4V4H8v3.5zM10 6h4v.75l-2 2-2-2z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 2 장 복잡도 분석
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_4_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_4">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 2 장 복잡도 분석
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_computational_complexity/performance_evaluation/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
2.1 알고리즘 효율 평가
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_computational_complexity/iteration_and_recursion/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
2.2 반복과 재귀
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_computational_complexity/time_complexity/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
2.3 시간 복잡도
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_computational_complexity/space_complexity/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
2.4 공간 복잡도
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_computational_complexity/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
2.5 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_computational_complexity/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
2.6 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_5" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_data_structure/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M11 13.5v8H3v-8zm-2 2H5v4h4zM12 2l5.5 9h-11zm0 3.86L10.08 9h3.84zM17.5 13c2.5 0 4.5 2 4.5 4.5S20 22 17.5 22 13 20 13 17.5s2-4.5 4.5-4.5m0 2a2.5 2.5 0 0 0-2.5 2.5 2.5 2.5 0 0 0 2.5 2.5 2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-2.5-2.5"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 3 장 자료 구조
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_5_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_5">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 3 장 자료 구조
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_data_structure/classification_of_data_structure/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
3.1 자료 구조의 분류
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_data_structure/basic_data_types/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
3.2 기본 자료형
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_data_structure/number_encoding/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
3.3 수의 인코딩 *
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_data_structure/character_encoding/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
3.4 문자 인코딩 *
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_data_structure/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
3.5 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_data_structure/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
3.6 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_6" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M3 5v14h17V5zm4 2v2H5V7zm-2 6v-2h2v2zm0 2h2v2H5zm13 2H9v-2h9zm0-4H9v-2h9zm0-4H9V7h9z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 4 장 배열과 연결 리스트
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_6_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_6">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 4 장 배열과 연결 리스트
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/array/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
4.1 배열
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/linked_list/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
4.2 연결 리스트
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/list/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
4.3 리스트
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/ram_and_cache/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
4.4 메모리와 캐시 *
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
4.5 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_array_and_linkedlist/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
4.6 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_7" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_stack_and_queue/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17.36 20.2v-5.38h1.79V22H3v-7.18h1.8v5.38zM6.77 14.32l.37-1.76 8.79 1.85-.37 1.76zm1.16-4.21.76-1.61 8.14 3.78-.76 1.62zm2.26-3.99 1.15-1.38 6.9 5.76-1.15 1.37zm4.45-4.25L20 9.08l-1.44 1.07-5.36-7.21zM6.59 18.41v-1.8h8.98v1.8z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 5 장 스택과 큐
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_7_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_7">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 5 장 스택과 큐
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_stack_and_queue/stack/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
5.1 스택
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_stack_and_queue/queue/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
5.2 큐
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_stack_and_queue/deque/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
5.3 덱
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_stack_and_queue/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
5.4 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_stack_and_queue/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
5.5 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_8" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_hashing/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.3 17.89c1.32-2.1.7-4.89-1.41-6.21a4.52 4.52 0 0 0-6.21 1.41C10.36 15.2 11 18 13.09 19.3c1.47.92 3.33.92 4.8 0L21 22.39 22.39 21zm-2-.62c-.98.98-2.56.97-3.54 0-.97-.98-.97-2.56.01-3.54.97-.97 2.55-.97 3.53 0 .96.99.95 2.57-.03 3.54zM19 4H5a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h5.81a6.3 6.3 0 0 1-1.31-2H5v-4h4.18c.16-.71.43-1.39.82-2H5V8h6v2.81a6.3 6.3 0 0 1 2-1.31V8h6v2a6.499 6.499 0 0 1 2 2V6a2 2 0 0 0-2-2"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 6 장 해시 테이블
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_8_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_8">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 6 장 해시 테이블
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_hashing/hash_map/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
6.1 해시 테이블
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_hashing/hash_collision/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
6.2 해시 충돌
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_hashing/hash_algorithm/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
6.3 해시 알고리즘
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_hashing/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
6.4 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_hashing/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
6.5 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_9" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_tree/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19.5 17c-.14 0-.26 0-.39.04L17.5 13.8c.45-.45.75-1.09.75-1.8a2.5 2.5 0 0 0-2.5-2.5c-.14 0-.25 0-.4.04L13.74 6.3c.47-.46.76-1.09.76-1.8a2.5 2.5 0 0 0-5 0c0 .7.29 1.34.76 1.79L8.65 9.54c-.15-.04-.26-.04-.4-.04a2.5 2.5 0 0 0-2.5 2.5c0 .71.29 1.34.75 1.79l-1.61 3.25C4.76 17 4.64 17 4.5 17a2.5 2.5 0 0 0 0 5A2.5 2.5 0 0 0 7 19.5c0-.7-.29-1.34-.76-1.79l1.62-3.25c.14.04.26.04.39.04s.25 0 .38-.04l1.63 3.25c-.47.45-.76 1.09-.76 1.79a2.5 2.5 0 0 0 5 0A2.5 2.5 0 0 0 12 17c-.13 0-.26 0-.39.04L10 13.8c.45-.45.75-1.09.75-1.8 0-.7-.29-1.33-.75-1.79l1.61-3.25c.13.04.26.04.39.04s.26 0 .39-.04L14 10.21a2.5 2.5 0 0 0 1.75 4.29c.13 0 .25 0 .38-.04l1.63 3.25c-.47.45-.76 1.09-.76 1.79a2.5 2.5 0 0 0 5 0 2.5 2.5 0 0 0-2.5-2.5m-15 3.5c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1m8.5-1c0 .55-.45 1-1 1s-1-.45-1-1 .45-1 1-1 1 .45 1 1M7.25 12c0-.55.45-1 1-1s1 .45 1 1-.45 1-1 1-1-.45-1-1M11 4.5c0-.55.45-1 1-1s1 .45 1 1-.45 1-1 1-1-.45-1-1m3.75 7.5c0-.55.45-1 1-1s1 .45 1 1-.45 1-1 1-1-.45-1-1m4.75 8.5c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 7 장 트리
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_9_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_9">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 7 장 트리
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_tree/binary_tree/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
7.1 이진 트리
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_tree/binary_tree_traversal/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
7.2 이진 트리 순회
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_tree/array_representation_of_tree/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
7.3 이진 트리의 배열 표현
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_tree/binary_search_tree/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
7.4 이진 탐색 트리
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_tree/avl_tree/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
7.5 AVL 트리 *
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_tree/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
7.6 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_tree/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
7.7 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_10" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_heap/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M12 1a2.5 2.5 0 0 0-2.5 2.5A2.5 2.5 0 0 0 11 5.79V7H7a2 2 0 0 0-2 2v.71A2.5 2.5 0 0 0 3.5 12 2.5 2.5 0 0 0 5 14.29V15H4a2 2 0 0 0-2 2v1.21A2.5 2.5 0 0 0 .5 20.5 2.5 2.5 0 0 0 3 23a2.5 2.5 0 0 0 2.5-2.5A2.5 2.5 0 0 0 4 18.21V17h4v1.21a2.5 2.5 0 0 0-1.5 2.29A2.5 2.5 0 0 0 9 23a2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-1.5-2.29V17a2 2 0 0 0-2-2H7v-.71A2.5 2.5 0 0 0 8.5 12 2.5 2.5 0 0 0 7 9.71V9h10v.71A2.5 2.5 0 0 0 15.5 12a2.5 2.5 0 0 0 1.5 2.29V15h-1a2 2 0 0 0-2 2v1.21a2.5 2.5 0 0 0-1.5 2.29A2.5 2.5 0 0 0 15 23a2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-1.5-2.29V17h4v1.21a2.5 2.5 0 0 0-1.5 2.29A2.5 2.5 0 0 0 21 23a2.5 2.5 0 0 0 2.5-2.5 2.5 2.5 0 0 0-1.5-2.29V17a2 2 0 0 0-2-2h-1v-.71A2.5 2.5 0 0 0 20.5 12 2.5 2.5 0 0 0 19 9.71V9a2 2 0 0 0-2-2h-4V5.79a2.5 2.5 0 0 0 1.5-2.29A2.5 2.5 0 0 0 12 1m0 1.5a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1M6 11a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m12 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1M3 19.5a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m6 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m6 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1m6 0a1 1 0 0 1 1 1 1 1 0 0 1-1 1 1 1 0 0 1-1-1 1 1 0 0 1 1-1"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 8 장 힙
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_10_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_10">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 8 장 힙
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_heap/heap/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
8.1 힙
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_heap/build_heap/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
8.2 힙 구성 연산
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_heap/top_k/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
8.3 Top-k 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_heap/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
8.4 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_heap/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
8.5 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_11" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_graph/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12 5.37-.44-.06L6 14.9c.24.21.4.48.47.78h11.06c.07-.3.23-.57.47-.78l-5.56-9.59zM6.6 16.53l4.28 2.53c.29-.27.69-.43 1.12-.43s.83.16 1.12.43l4.28-2.53zM12 22a1.68 1.68 0 0 1-1.68-1.68l.09-.56-4.3-2.55c-.31.36-.76.58-1.27.58a1.68 1.68 0 0 1-1.68-1.68c0-.79.53-1.45 1.26-1.64V9.36c-.83-.11-1.47-.82-1.47-1.68A1.68 1.68 0 0 1 4.63 6c.55 0 1.03.26 1.34.66l4.41-2.53-.06-.45c0-.93.75-1.68 1.68-1.68s1.68.75 1.68 1.68l-.06.45 4.41 2.53c.31-.4.79-.66 1.34-.66a1.68 1.68 0 0 1 1.68 1.68c0 .86-.64 1.57-1.47 1.68v5.11c.73.19 1.26.85 1.26 1.64a1.68 1.68 0 0 1-1.68 1.68c-.51 0-.96-.22-1.27-.58l-4.3 2.55.09.56A1.68 1.68 0 0 1 12 22M10.8 4.86 6.3 7.44l.02.24c0 .71-.44 1.32-1.06 1.57l.03 5.25zm2.4 0 5.51 9.64.03-5.25c-.62-.25-1.06-.86-1.06-1.57l.02-.24z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 9 장 그래프
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_11_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_11">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 9 장 그래프
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_graph/graph/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
9.1 그래프
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_graph/graph_operations/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
9.2 그래프의 기본 연산
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_graph/graph_traversal/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
9.3 그래프 순회
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_graph/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
9.4 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_graph/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
9.5 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_12" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_searching/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m19.31 18.9 3.08 3.1L21 23.39l-3.12-3.07c-.69.43-1.51.68-2.38.68-2.5 0-4.5-2-4.5-4.5s2-4.5 4.5-4.5 4.5 2 4.5 4.5c0 .88-.25 1.71-.69 2.4m-3.81.1a2.5 2.5 0 0 0 0-5 2.5 2.5 0 0 0 0 5M21 4v2H3V4zM3 16v-2h6v2zm0-5V9h18v2h-2.03c-1.01-.63-2.2-1-3.47-1s-2.46.37-3.47 1z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 10 장 탐색
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_12" id="__nav_12_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_12_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_12">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 10 장 탐색
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_searching/binary_search/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
10.1 이진 탐색
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_searching/binary_search_insertion/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
10.2 이진 탐색으로 삽입 위치 찾기
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_searching/binary_search_edge/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
10.3 이진 탐색으로 경계 찾기
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_searching/replace_linear_by_hashing/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
10.4 해시를 이용한 최적화 전략
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_searching/searching_algorithm_revisited/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
10.5 탐색 알고리즘 다시 보기
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_searching/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
10.6 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_searching/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
10.7 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_13" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_sorting/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M19 17h3l-4 4-4-4h3V3h2M2 17h10v2H2M6 5v2H2V5m0 6h7v2H2z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 11 장 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_13_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_13">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 11 장 정렬
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/sorting_algorithm/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.1 정렬 알고리즘
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/selection_sort/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.2 선택 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/bubble_sort/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.3 버블 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/insertion_sort/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.4 삽입 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/quick_sort/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.5 퀵 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/merge_sort/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.6 병합 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/heap_sort/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.7 힙 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/bucket_sort/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.8 버킷 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/counting_sort/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.9 계수 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/radix_sort/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.10 기수 정렬
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.11 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_sorting/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
11.12 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_14" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_divide_and_conquer/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M17 7v2h5V7zM2 9v6h5V9zm10 0v2H9v2h3v2l3-3zm5 2v2h5v-2zm0 4v2h5v-2z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 12 장 분할 정복
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_14_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_14">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 12 장 분할 정복
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_divide_and_conquer/divide_and_conquer/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
12.1 분할 정복 알고리즘
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_divide_and_conquer/binary_search_recur/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
12.2 분할 정복 탐색 전략
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_divide_and_conquer/build_binary_tree_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
12.3 이진 트리 구성 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_divide_and_conquer/hanota_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
12.4 하노이의 탑 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_divide_and_conquer/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
12.5 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_divide_and_conquer/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
12.6 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
|
||
<input checked="" class="md-nav__toggle md-toggle" id="__nav_15" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M18 15a3 3 0 0 1 3 3 3 3 0 0 1-3 3 2.99 2.99 0 0 1-2.83-2H14v-2h1.17c.41-1.17 1.52-2 2.83-2m0 2a1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1m0-9a1.43 1.43 0 0 0 1.43-1.43 1.43 1.43 0 1 0-2.86 0A1.43 1.43 0 0 0 18 8m0-5.43a4 4 0 0 1 4 4C22 9.56 18 14 18 14s-4-4.44-4-7.43a4 4 0 0 1 4-4M8.83 17H10v2H8.83A2.99 2.99 0 0 1 6 21a3 3 0 0 1-3-3c0-1.31.83-2.42 2-2.83V14h2v1.17c.85.3 1.53.98 1.83 1.83M6 17a1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1M6 3a3 3 0 0 1 3 3c0 1.31-.83 2.42-2 2.83V10H5V8.83A2.99 2.99 0 0 1 3 6a3 3 0 0 1 3-3m0 2a1 1 0 0 0-1 1 1 1 0 0 0 1 1 1 1 0 0 0 1-1 1 1 0 0 0-1-1m5 14v-2h2v2zm-4-6H5v-2h2z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 13 장 백트래킹
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="true" aria-labelledby="__nav_15_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_15">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 13 장 백트래킹
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item md-nav__item--active">
|
||
<label class="md-nav__link md-nav__link--active" for="__toc">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
13.1 백트래킹 알고리즘
|
||
|
||
|
||
</span>
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
<a class="md-nav__link md-nav__link--active" href="././">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
13.1 백트래킹 알고리즘
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<nav aria-label="목차" class="md-nav md-nav--secondary">
|
||
<label class="md-nav__title" for="__toc">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
목차
|
||
</label>
|
||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1311">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.1 시도와 되돌리기
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1312">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.2 가지치기
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1313">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.3 기본 틀 코드
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1314">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.4 주요 용어
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1315">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.5 장점과 한계
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1316">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.6 대표적인 백트래킹 문제
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../permutations_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
13.2 모든 순열 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../subset_sum_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
13.3 부분 집합 합 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../n_queens_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
13.4 n-퀸 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
13.5 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
13.6 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_16" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_dynamic_programming/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M22 15h-2v3c0 1.11-.89 2-2 2h-3v2l-3-3 3-3v2h3v-3h-2l3-3zm0-11v4c0 1.1-.9 2-2 2H10v10c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h16c1.1 0 2 .9 2 2M4 8h4V4H4zm0 2v4h4v-4zm4 10v-4H4v4zm6-12V4h-4v4zm6-4h-4v4h4z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 14 장 동적 계획법
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_16" id="__nav_16_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_16_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_16">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 14 장 동적 계획법
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_dynamic_programming/intro_to_dynamic_programming/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
14.1 동적 계획법 첫걸음
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_dynamic_programming/dp_problem_features/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
14.2 동적 계획법 문제의 특성
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_dynamic_programming/dp_solution_pipeline/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
14.3 동적 계획법 문제 풀이 방법
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_dynamic_programming/knapsack_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
14.4 0-1 배낭 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_dynamic_programming/unbounded_knapsack_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
14.5 무한 배낭 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_dynamic_programming/edit_distance_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
14.6 편집 거리 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_dynamic_programming/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
14.7 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_dynamic_programming/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
14.8 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_17" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_greedy/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M13 3c3.88 0 7 3.14 7 7 0 2.8-1.63 5.19-4 6.31V21H9v-3H8c-1.11 0-2-.89-2-2v-3H4.5c-.42 0-.66-.5-.42-.81L6 9.66A7.003 7.003 0 0 1 13 3m0-2C8.41 1 4.61 4.42 4.06 8.9L2.5 11h-.03l-.02.03c-.55.76-.62 1.76-.19 2.59.36.69 1 1.17 1.74 1.32V16c0 1.85 1.28 3.42 3 3.87V23h11v-5.5c2.5-1.67 4-4.44 4-7.5 0-4.97-4.04-9-9-9m4 7.83c0 1.54-1.36 2.77-3.42 4.64L13 14l-.58-.53C10.36 11.6 9 10.37 9 8.83c0-1.2.96-2.19 2.16-2.2h.04c.69 0 1.35.31 1.8.83.45-.52 1.11-.83 1.8-.83 1.2-.01 2.2.96 2.2 2.16z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 15 장 탐욕
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_17" id="__nav_17_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_17_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_17">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 15 장 탐욕
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_greedy/greedy_algorithm/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
15.1 탐욕 알고리즘
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_greedy/fractional_knapsack_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
15.2 분할 가능한 배낭 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_greedy/max_capacity_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
15.3 최대 용량 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_greedy/max_product_cutting_problem/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
15.4 정수 분할의 최대 곱 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_greedy/summary/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
15.5 요약
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_greedy/exercises/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
15.6 연습 문제
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_18" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_appendix/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M11 18h2v-2h-2zm1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
제 16 장 부록
|
||
|
||
|
||
</span>
|
||
</a>
|
||
<label class="md-nav__link" for="__nav_18" id="__nav_18_label" tabindex="0">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
</label>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_18_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_18">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
제 16 장 부록
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_appendix/installation/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
16.1 프로그래밍 환경 설치
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_appendix/contribution/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
16.2 함께 만드는 책
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="../../chapter_appendix/terminology/">
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
16.3 용어집
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
<li class="md-nav__item md-nav__item--nested">
|
||
<input class="md-nav__toggle md-toggle" id="__nav_19" type="checkbox"/>
|
||
<div class="md-nav__link md-nav__container">
|
||
<a class="md-nav__link" href="../../chapter_reference/">
|
||
<svg viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M9 3v15h3V3zm3 2 4 13 3-1-4-13zM5 5v13h3V5zM3 19v2h18v-2z"></path></svg>
|
||
<span class="md-ellipsis">
|
||
|
||
|
||
참고 문헌
|
||
|
||
|
||
</span>
|
||
</a>
|
||
</div>
|
||
<nav aria-expanded="false" aria-labelledby="__nav_19_label" class="md-nav" data-md-level="1">
|
||
<label class="md-nav__title" for="__nav_19">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
|
||
|
||
참고 문헌
|
||
|
||
</label>
|
||
<ul class="md-nav__list" data-md-scrollfix="">
|
||
</ul>
|
||
</nav>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc">
|
||
<div class="md-sidebar__scrollwrap">
|
||
<input class="md-nav__toggle md-toggle" id="__toc" type="checkbox"/>
|
||
<div class="md-sidebar-button__wrapper">
|
||
<label class="md-sidebar-button" for="__toc"></label>
|
||
</div>
|
||
<div class="md-sidebar__inner">
|
||
<nav aria-label="목차" class="md-nav md-nav--secondary">
|
||
<label class="md-nav__title" for="__toc">
|
||
<span class="md-nav__icon md-icon"></span>
|
||
목차
|
||
</label>
|
||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix="">
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1311">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.1 시도와 되돌리기
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1312">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.2 가지치기
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1313">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.3 기본 틀 코드
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1314">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.4 주요 용어
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1315">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.5 장점과 한계
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
<li class="md-nav__item">
|
||
<a class="md-nav__link" href="#1316">
|
||
<span class="md-ellipsis">
|
||
<span class="md-typeset">
|
||
13.1.6 대표적인 백트래킹 문제
|
||
</span>
|
||
</span>
|
||
</a>
|
||
</li>
|
||
</ul>
|
||
</nav>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="md-content" data-md-component="content">
|
||
<article class="md-content__inner md-typeset">
|
||
<!-- Tags -->
|
||
<!-- Actions -->
|
||
<!-- Actions -->
|
||
<!-- Edit button -->
|
||
<a class="md-content__button md-icon" href="https://github.com/krahets/hello-algo/tree/main/ko/docs/chapter_backtracking/backtracking_algorithm.md" title="이 페이지를 편집">
|
||
<svg viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M441 58.9 453.1 71c9.4 9.4 9.4 24.6 0 33.9L424 134.1 377.9 88 407 58.9c9.4-9.4 24.6-9.4 33.9 0zM209.8 256.2 344 121.9l46.1 46.1-134.3 134.2c-2.9 2.9-6.5 5-10.4 6.1L186.9 325l16.7-58.5c1.1-3.9 3.2-7.5 6.1-10.4zM373.1 25 175.8 222.2c-8.7 8.7-15 19.4-18.3 31.1l-28.6 100c-2.4 8.4-.1 17.4 6.1 23.6s15.2 8.5 23.6 6.1l100-28.6c11.8-3.4 22.5-9.7 31.1-18.3L487 138.9c28.1-28.1 28.1-73.7 0-101.8L474.9 25c-28.1-28.1-73.7-28.1-101.8 0M88 64c-48.6 0-88 39.4-88 88v272c0 48.6 39.4 88 88 88h272c48.6 0 88-39.4 88-88V312c0-13.3-10.7-24-24-24s-24 10.7-24 24v112c0 22.1-17.9 40-40 40H88c-22.1 0-40-17.9-40-40V152c0-22.1 17.9-40 40-40h112c13.3 0 24-10.7 24-24s-10.7-24-24-24z" fill="currentColor"></path></svg>
|
||
</a>
|
||
<!-- View button -->
|
||
<!-- Page content -->
|
||
<h1 id="131">13.1 백트래킹 알고리즘<a class="headerlink" href="#131" title="고유 링크">¶</a></h1>
|
||
<p><u>백트래킹 알고리즘(backtracking algorithm)</u>은 모든 경우를 열거하여 문제를 푸는 방법이다. 초기 상태에서 출발하여 가능한 모든 해결 방법을 완전 탐색하고, 올바른 해를 만나면 기록한다. 해를 찾거나 가능한 선택을 모두 시도해도 찾을 수 없을 때까지 진행하는 것이 핵심이다.</p>
|
||
<p>백트래킹은 보통 '깊이 우선 탐색'으로 해 공간을 순회한다. '이진 트리' 장에서 전위, 중위, 후위 순회가 모두 깊이 우선 탐색이라고 설명했다. 이제 전위 순회를 이용한 백트래킹 문제를 만들어 작동 원리를 차근차근 알아보자.</p>
|
||
<div class="admonition question">
|
||
<p class="admonition-title">예제 1</p>
|
||
<p>이진 트리가 주어졌을 때 값이 <span class="arithmatex">\(7\)</span>인 모든 노드를 찾아 기록하고, 노드 리스트를 반환하라.</p>
|
||
</div>
|
||
<p>이 문제에서는 트리를 전위 순회하며 현재 노드의 값이 <span class="arithmatex">\(7\)</span>인지 확인하고, 맞으면 해당 노드의 값을 결과 리스트 <code>res</code>에 추가한다. 과정은 아래 그림(13-1)과 코드에 나타나 있다.</p>
|
||
<div class="tabbed-set tabbed-alternate" data-tabs="1:13"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio"/><input id="__tabbed_1_2" name="__tabbed_1" type="radio"/><input id="__tabbed_1_3" name="__tabbed_1" type="radio"/><input id="__tabbed_1_4" name="__tabbed_1" type="radio"/><input id="__tabbed_1_5" name="__tabbed_1" type="radio"/><input id="__tabbed_1_6" name="__tabbed_1" type="radio"/><input id="__tabbed_1_7" name="__tabbed_1" type="radio"/><input id="__tabbed_1_8" name="__tabbed_1" type="radio"/><input id="__tabbed_1_9" name="__tabbed_1" type="radio"/><input id="__tabbed_1_10" name="__tabbed_1" type="radio"/><input id="__tabbed_1_11" name="__tabbed_1" type="radio"/><input id="__tabbed_1_12" name="__tabbed_1" type="radio"/><input id="__tabbed_1_13" name="__tabbed_1" type="radio"/><div class="tabbed-labels"><label for="__tabbed_1_1">Python</label><label for="__tabbed_1_2">C++</label><label for="__tabbed_1_3">Java</label><label for="__tabbed_1_4">C#</label><label for="__tabbed_1_5">Go</label><label for="__tabbed_1_6">Swift</label><label for="__tabbed_1_7">JS</label><label for="__tabbed_1_8">TS</label><label for="__tabbed_1_9">Dart</label><label for="__tabbed_1_10">Rust</label><label for="__tabbed_1_11">C</label><label for="__tabbed_1_12">Kotlin</label><label for="__tabbed_1_13">Ruby</label></div>
|
||
<div class="tabbed-content">
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.py</span><pre><span></span><code><a href="#__codelineno-0-1" id="__codelineno-0-1" name="__codelineno-0-1"></a><span class="k">def</span><span class="w"> </span><span class="nf">pre_order</span><span class="p">(</span><span class="n">root</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">):</span>
|
||
<a href="#__codelineno-0-2" id="__codelineno-0-2" name="__codelineno-0-2"></a><span class="w"> </span><span class="sd">"""전위 순회: 예제 1"""</span>
|
||
<a href="#__codelineno-0-3" id="__codelineno-0-3" name="__codelineno-0-3"></a> <span class="k">if</span> <span class="n">root</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<a href="#__codelineno-0-4" id="__codelineno-0-4" name="__codelineno-0-4"></a> <span class="k">return</span>
|
||
<a href="#__codelineno-0-5" id="__codelineno-0-5" name="__codelineno-0-5"></a> <span class="k">if</span> <span class="n">root</span><span class="o">.</span><span class="n">val</span> <span class="o">==</span> <span class="mi">7</span><span class="p">:</span>
|
||
<a href="#__codelineno-0-6" id="__codelineno-0-6" name="__codelineno-0-6"></a> <span class="c1"># 해를 기록한다</span>
|
||
<a href="#__codelineno-0-7" id="__codelineno-0-7" name="__codelineno-0-7"></a> <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-0-8" id="__codelineno-0-8" name="__codelineno-0-8"></a> <span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-0-9" id="__codelineno-0-9" name="__codelineno-0-9"></a> <span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">right</span><span class="p">)</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.cpp</span><pre><span></span><code><a href="#__codelineno-1-1" id="__codelineno-1-1" name="__codelineno-1-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-1-2" id="__codelineno-1-2" name="__codelineno-1-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-1-3" id="__codelineno-1-3" name="__codelineno-1-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nb">nullptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-1-4" id="__codelineno-1-4" name="__codelineno-1-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-1-5" id="__codelineno-1-5" name="__codelineno-1-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-1-6" id="__codelineno-1-6" name="__codelineno-1-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-1-7" id="__codelineno-1-7" name="__codelineno-1-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-1-8" id="__codelineno-1-8" name="__codelineno-1-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-1-9" id="__codelineno-1-9" name="__codelineno-1-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-1-10" id="__codelineno-1-10" name="__codelineno-1-10"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-1-11" id="__codelineno-1-11" name="__codelineno-1-11"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-1-12" id="__codelineno-1-12" name="__codelineno-1-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.java</span><pre><span></span><code><a href="#__codelineno-2-1" id="__codelineno-2-1" name="__codelineno-2-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-2-2" id="__codelineno-2-2" name="__codelineno-2-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-2-3" id="__codelineno-2-3" name="__codelineno-2-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-2-4" id="__codelineno-2-4" name="__codelineno-2-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-2-5" id="__codelineno-2-5" name="__codelineno-2-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-2-6" id="__codelineno-2-6" name="__codelineno-2-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-2-7" id="__codelineno-2-7" name="__codelineno-2-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-2-8" id="__codelineno-2-8" name="__codelineno-2-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-2-9" id="__codelineno-2-9" name="__codelineno-2-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-2-10" id="__codelineno-2-10" name="__codelineno-2-10"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-2-11" id="__codelineno-2-11" name="__codelineno-2-11"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-2-12" id="__codelineno-2-12" name="__codelineno-2-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.cs</span><pre><span></span><code><a href="#__codelineno-3-1" id="__codelineno-3-1" name="__codelineno-3-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-3-2" id="__codelineno-3-2" name="__codelineno-3-2"></a><span class="k">void</span><span class="w"> </span><span class="nf">PreOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-3-3" id="__codelineno-3-3" name="__codelineno-3-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-3-4" id="__codelineno-3-4" name="__codelineno-3-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-3-5" id="__codelineno-3-5" name="__codelineno-3-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-3-6" id="__codelineno-3-6" name="__codelineno-3-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-3-7" id="__codelineno-3-7" name="__codelineno-3-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-3-8" id="__codelineno-3-8" name="__codelineno-3-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-3-9" id="__codelineno-3-9" name="__codelineno-3-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-3-10" id="__codelineno-3-10" name="__codelineno-3-10"></a><span class="w"> </span><span class="n">PreOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-3-11" id="__codelineno-3-11" name="__codelineno-3-11"></a><span class="w"> </span><span class="n">PreOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-3-12" id="__codelineno-3-12" name="__codelineno-3-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.go</span><pre><span></span><code><a href="#__codelineno-4-1" id="__codelineno-4-1" name="__codelineno-4-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-4-2" id="__codelineno-4-2" name="__codelineno-4-2"></a><span class="kd">func</span><span class="w"> </span><span class="nx">preOrderI</span><span class="p">(</span><span class="nx">root</span><span class="w"> </span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-4-3" id="__codelineno-4-3" name="__codelineno-4-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-4-4" id="__codelineno-4-4" name="__codelineno-4-4"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-4-5" id="__codelineno-4-5" name="__codelineno-4-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-4-6" id="__codelineno-4-6" name="__codelineno-4-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">Val</span><span class="p">).(</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-4-7" id="__codelineno-4-7" name="__codelineno-4-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-4-8" id="__codelineno-4-8" name="__codelineno-4-8"></a><span class="w"> </span><span class="o">*</span><span class="nx">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="o">*</span><span class="nx">res</span><span class="p">,</span><span class="w"> </span><span class="nx">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-4-9" id="__codelineno-4-9" name="__codelineno-4-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-4-10" id="__codelineno-4-10" name="__codelineno-4-10"></a><span class="w"> </span><span class="nx">preOrderI</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">Left</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-4-11" id="__codelineno-4-11" name="__codelineno-4-11"></a><span class="w"> </span><span class="nx">preOrderI</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">Right</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-4-12" id="__codelineno-4-12" name="__codelineno-4-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.swift</span><pre><span></span><code><a href="#__codelineno-5-1" id="__codelineno-5-1" name="__codelineno-5-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-5-2" id="__codelineno-5-2" name="__codelineno-5-2"></a><span class="kd">func</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode</span><span class="p">?)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-5-3" id="__codelineno-5-3" name="__codelineno-5-3"></a><span class="w"> </span><span class="k">guard</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">root</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-5-4" id="__codelineno-5-4" name="__codelineno-5-4"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-5-5" id="__codelineno-5-5" name="__codelineno-5-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-5-6" id="__codelineno-5-6" name="__codelineno-5-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-5-7" id="__codelineno-5-7" name="__codelineno-5-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-5-8" id="__codelineno-5-8" name="__codelineno-5-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-5-9" id="__codelineno-5-9" name="__codelineno-5-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-5-10" id="__codelineno-5-10" name="__codelineno-5-10"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="kr">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-5-11" id="__codelineno-5-11" name="__codelineno-5-11"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="kr">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-5-12" id="__codelineno-5-12" name="__codelineno-5-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.js</span><pre><span></span><code><a href="#__codelineno-6-1" id="__codelineno-6-1" name="__codelineno-6-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-6-2" id="__codelineno-6-2" name="__codelineno-6-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-6-3" id="__codelineno-6-3" name="__codelineno-6-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-6-4" id="__codelineno-6-4" name="__codelineno-6-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-6-5" id="__codelineno-6-5" name="__codelineno-6-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-6-6" id="__codelineno-6-6" name="__codelineno-6-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-6-7" id="__codelineno-6-7" name="__codelineno-6-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-6-8" id="__codelineno-6-8" name="__codelineno-6-8"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-6-9" id="__codelineno-6-9" name="__codelineno-6-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-6-10" id="__codelineno-6-10" name="__codelineno-6-10"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">left</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-6-11" id="__codelineno-6-11" name="__codelineno-6-11"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">right</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-6-12" id="__codelineno-6-12" name="__codelineno-6-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.ts</span><pre><span></span><code><a href="#__codelineno-7-1" id="__codelineno-7-1" name="__codelineno-7-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-7-2" id="__codelineno-7-2" name="__codelineno-7-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[])</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-7-3" id="__codelineno-7-3" name="__codelineno-7-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-7-4" id="__codelineno-7-4" name="__codelineno-7-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-7-5" id="__codelineno-7-5" name="__codelineno-7-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-7-6" id="__codelineno-7-6" name="__codelineno-7-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-7-7" id="__codelineno-7-7" name="__codelineno-7-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-7-8" id="__codelineno-7-8" name="__codelineno-7-8"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-7-9" id="__codelineno-7-9" name="__codelineno-7-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-7-10" id="__codelineno-7-10" name="__codelineno-7-10"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">left</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-7-11" id="__codelineno-7-11" name="__codelineno-7-11"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">right</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-7-12" id="__codelineno-7-12" name="__codelineno-7-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.dart</span><pre><span></span><code><a href="#__codelineno-8-1" id="__codelineno-8-1" name="__codelineno-8-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-8-2" id="__codelineno-8-2" name="__codelineno-8-2"></a><span class="kt">void</span><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">root</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-8-3" id="__codelineno-8-3" name="__codelineno-8-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-8-4" id="__codelineno-8-4" name="__codelineno-8-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-8-5" id="__codelineno-8-5" name="__codelineno-8-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-8-6" id="__codelineno-8-6" name="__codelineno-8-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-8-7" id="__codelineno-8-7" name="__codelineno-8-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-8-8" id="__codelineno-8-8" name="__codelineno-8-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-8-9" id="__codelineno-8-9" name="__codelineno-8-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-8-10" id="__codelineno-8-10" name="__codelineno-8-10"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-8-11" id="__codelineno-8-11" name="__codelineno-8-11"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">right</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-8-12" id="__codelineno-8-12" name="__codelineno-8-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.rs</span><pre><span></span><code><a href="#__codelineno-9-1" id="__codelineno-9-1" name="__codelineno-9-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-9-2" id="__codelineno-9-2" name="__codelineno-9-2"></a><span class="k">fn</span><span class="w"> </span><span class="nf">pre_order</span><span class="p">(</span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span><span class="w"> </span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="nb">Option</span><span class="o"><&</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-9-3" id="__codelineno-9-3" name="__codelineno-9-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">is_none</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-9-4" id="__codelineno-9-4" name="__codelineno-9-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-9-5" id="__codelineno-9-5" name="__codelineno-9-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-9-6" id="__codelineno-9-6" name="__codelineno-9-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">node</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-9-7" id="__codelineno-9-7" name="__codelineno-9-7"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-9-8" id="__codelineno-9-8" name="__codelineno-9-8"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-9-9" id="__codelineno-9-9" name="__codelineno-9-9"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">clone</span><span class="p">());</span>
|
||
<a href="#__codelineno-9-10" id="__codelineno-9-10" name="__codelineno-9-10"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-9-11" id="__codelineno-9-11" name="__codelineno-9-11"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">res</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">left</span><span class="p">.</span><span class="n">as_ref</span><span class="p">());</span>
|
||
<a href="#__codelineno-9-12" id="__codelineno-9-12" name="__codelineno-9-12"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">res</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">right</span><span class="p">.</span><span class="n">as_ref</span><span class="p">());</span>
|
||
<a href="#__codelineno-9-13" id="__codelineno-9-13" name="__codelineno-9-13"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-9-14" id="__codelineno-9-14" name="__codelineno-9-14"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.c</span><pre><span></span><code><a href="#__codelineno-10-1" id="__codelineno-10-1" name="__codelineno-10-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-10-2" id="__codelineno-10-2" name="__codelineno-10-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-10-3" id="__codelineno-10-3" name="__codelineno-10-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nb">NULL</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-10-4" id="__codelineno-10-4" name="__codelineno-10-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-10-5" id="__codelineno-10-5" name="__codelineno-10-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-10-6" id="__codelineno-10-6" name="__codelineno-10-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-10-7" id="__codelineno-10-7" name="__codelineno-10-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-10-8" id="__codelineno-10-8" name="__codelineno-10-8"></a><span class="w"> </span><span class="n">res</span><span class="p">[</span><span class="n">resSize</span><span class="o">++</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root</span><span class="p">;</span>
|
||
<a href="#__codelineno-10-9" id="__codelineno-10-9" name="__codelineno-10-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-10-10" id="__codelineno-10-10" name="__codelineno-10-10"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-10-11" id="__codelineno-10-11" name="__codelineno-10-11"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-10-12" id="__codelineno-10-12" name="__codelineno-10-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.kt</span><pre><span></span><code><a href="#__codelineno-11-1" id="__codelineno-11-1" name="__codelineno-11-1"></a><span class="cm">/* 전위 순회: 예제 1 */</span>
|
||
<a href="#__codelineno-11-2" id="__codelineno-11-2" name="__codelineno-11-2"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode?</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-11-3" id="__codelineno-11-3" name="__codelineno-11-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-11-4" id="__codelineno-11-4" name="__codelineno-11-4"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-11-5" id="__codelineno-11-5" name="__codelineno-11-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-11-6" id="__codelineno-11-6" name="__codelineno-11-6"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">_val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-11-7" id="__codelineno-11-7" name="__codelineno-11-7"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-11-8" id="__codelineno-11-8" name="__codelineno-11-8"></a><span class="w"> </span><span class="n">res</span><span class="o">!!</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-11-9" id="__codelineno-11-9" name="__codelineno-11-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-11-10" id="__codelineno-11-10" name="__codelineno-11-10"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-11-11" id="__codelineno-11-11" name="__codelineno-11-11"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-11-12" id="__codelineno-11-12" name="__codelineno-11-12"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_i_compact.rb</span><pre><span></span><code><a href="#__codelineno-12-1" id="__codelineno-12-1" name="__codelineno-12-1"></a><span class="c1">### 전위 순회: 예제 1 ###</span>
|
||
<a href="#__codelineno-12-2" id="__codelineno-12-2" name="__codelineno-12-2"></a><span class="k">def</span><span class="w"> </span><span class="nf">pre_order</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-12-3" id="__codelineno-12-3" name="__codelineno-12-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="n">root</span>
|
||
<a href="#__codelineno-12-4" id="__codelineno-12-4" name="__codelineno-12-4"></a>
|
||
<a href="#__codelineno-12-5" id="__codelineno-12-5" name="__codelineno-12-5"></a><span class="w"> </span><span class="c1"># 해를 기록한다</span>
|
||
<a href="#__codelineno-12-6" id="__codelineno-12-6" name="__codelineno-12-6"></a><span class="w"> </span><span class="vg">$res</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">root</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span>
|
||
<a href="#__codelineno-12-7" id="__codelineno-12-7" name="__codelineno-12-7"></a>
|
||
<a href="#__codelineno-12-8" id="__codelineno-12-8" name="__codelineno-12-8"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-12-9" id="__codelineno-12-9" name="__codelineno-12-9"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-12-10" id="__codelineno-12-10" name="__codelineno-12-10"></a><span class="k">end</span>
|
||
</code></pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<details class="pythontutor">
|
||
<summary>코드 시각화</summary>
|
||
<p><div style="height: 549px; width: 100%;"><iframe class="pythontutor-iframe" src="https://pythontutor.com/iframe-embed.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%20%EB%85%B8%EB%93%9C%20%ED%81%B4%EB%9E%98%EC%8A%A4%22%22%22%0A%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%EB%85%B8%EB%93%9C%20%EA%B0%92%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%99%BC%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D,%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%3A%20%EC%9E%AC%EA%B7%80%22%22%22%0A%20%20%20%20%23%20%EC%9D%B8%EB%8D%B1%EC%8A%A4%EA%B0%80%20%EB%B0%B0%EC%97%B4%20%EA%B8%B8%EC%9D%B4%EB%A5%BC%20%EB%B2%97%EC%96%B4%EB%82%98%EA%B1%B0%EB%82%98%20%ED%95%B4%EB%8B%B9%20%EC%9B%90%EC%86%8C%EA%B0%80%20None%EC%9D%B4%EB%A9%B4%20None%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%ED%98%84%EC%9E%AC%20%EB%85%B8%EB%93%9C%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20%23%20%EC%99%BC%EC%AA%BD%EA%B3%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%84%9C%EB%B8%8C%ED%8A%B8%EB%A6%AC%EB%A5%BC%20%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%22%22%22%0A%20%20%20%20return%20list_to_tree_dfs%28arr,%200%29%0A%0A%0Adef%20pre_order%28root%3A%20TreeNode%29%3A%0A%20%20%20%20%22%22%22%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%3A%20%EC%98%88%EC%A0%9C%201%22%22%22%0A%20%20%20%20if%20root%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20if%20root.val%20%3D%3D%207%3A%0A%20%20%20%20%20%20%20%20%23%20%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%0A%20%20%20%20%20%20%20%20res.append%28root%29%0A%20%20%20%20pre_order%28root.left%29%0A%20%20%20%20pre_order%28root.right%29%0A%0A%0A%22%22%22%EC%8B%A4%ED%96%89%20%EC%BD%94%EB%93%9C%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1,%207,%203,%204,%205,%206,%207%5D%29%0A%0A%20%20%20%20%23%20%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%0A%20%20%20%20res%20%3D%20list%5BTreeNode%5D%28%29%0A%20%20%20%20pre_order%28root%29%0A%0A%20%20%20%20print%28%22%5Cn%EA%B0%92%EC%9D%B4%207%EC%9D%B8%20%EB%AA%A8%EB%93%A0%20%EB%85%B8%EB%93%9C%20%EC%B6%9C%EB%A0%A5%22%29%0A%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20res%5D%29&codeDivHeight=472&codeDivWidth=350&cumulative=false&curInstr=126&heapPrimitives=nevernest&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false" title="코드 시각화"> </iframe></div>
|
||
<div style="margin-top: 5px;"><a href="https://pythontutor.com/iframe-embed.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%20%EB%85%B8%EB%93%9C%20%ED%81%B4%EB%9E%98%EC%8A%A4%22%22%22%0A%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%EB%85%B8%EB%93%9C%20%EA%B0%92%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%99%BC%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D,%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%3A%20%EC%9E%AC%EA%B7%80%22%22%22%0A%20%20%20%20%23%20%EC%9D%B8%EB%8D%B1%EC%8A%A4%EA%B0%80%20%EB%B0%B0%EC%97%B4%20%EA%B8%B8%EC%9D%B4%EB%A5%BC%20%EB%B2%97%EC%96%B4%EB%82%98%EA%B1%B0%EB%82%98%20%ED%95%B4%EB%8B%B9%20%EC%9B%90%EC%86%8C%EA%B0%80%20None%EC%9D%B4%EB%A9%B4%20None%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%ED%98%84%EC%9E%AC%20%EB%85%B8%EB%93%9C%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20%23%20%EC%99%BC%EC%AA%BD%EA%B3%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%84%9C%EB%B8%8C%ED%8A%B8%EB%A6%AC%EB%A5%BC%20%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%22%22%22%0A%20%20%20%20return%20list_to_tree_dfs%28arr,%200%29%0A%0A%0Adef%20pre_order%28root%3A%20TreeNode%29%3A%0A%20%20%20%20%22%22%22%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%3A%20%EC%98%88%EC%A0%9C%201%22%22%22%0A%20%20%20%20if%20root%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20if%20root.val%20%3D%3D%207%3A%0A%20%20%20%20%20%20%20%20%23%20%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%0A%20%20%20%20%20%20%20%20res.append%28root%29%0A%20%20%20%20pre_order%28root.left%29%0A%20%20%20%20pre_order%28root.right%29%0A%0A%0A%22%22%22%EC%8B%A4%ED%96%89%20%EC%BD%94%EB%93%9C%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1,%207,%203,%204,%205,%206,%207%5D%29%0A%0A%20%20%20%20%23%20%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%0A%20%20%20%20res%20%3D%20list%5BTreeNode%5D%28%29%0A%20%20%20%20pre_order%28root%29%0A%0A%20%20%20%20print%28%22%5Cn%EA%B0%92%EC%9D%B4%207%EC%9D%B8%20%EB%AA%A8%EB%93%A0%20%EB%85%B8%EB%93%9C%20%EC%B6%9C%EB%A0%A5%22%29%0A%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20res%5D%29&codeDivHeight=800&codeDivWidth=600&cumulative=false&curInstr=126&heapPrimitives=nevernest&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false" rel="noopener noreferrer" target="_blank">전체 화면 ></a></div></p>
|
||
</details>
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_nodes.png" data-dark-src="/assets/figure-svg/figures/ef59cd475212af890d29a16f.json" data-src="/assets/figure-svg/figures/f79ff171777901b0592fce60.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_nodes.svg" data-theme="light" tabindex="-1" type="image/svg+xml">전위 순회로 노드 탐색</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_nodes.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">전위 순회로 노드 탐색</object></ha-svg-figure></p>
|
||
<p align="center"> 그림 13-1 전위 순회로 노드 탐색 </p>
|
||
<h2 id="1311">13.1.1 시도와 되돌리기<a class="headerlink" href="#1311" title="고유 링크">¶</a></h2>
|
||
<p><strong>백트래킹이라고 부르는 이유는 해 공간을 탐색할 때 '시도'와 '되돌리기' 전략을 사용하기 때문이다</strong>. 탐색 중 더 진행할 수 없거나 조건을 만족하는 해를 얻을 수 없는 상태를 만나면, 직전 선택을 취소하고 이전 상태로 돌아가 다른 선택을 시도한다.</p>
|
||
<p>예제 1에서는 각 노드의 방문이 한 번의 '시도'이며, 리프 노드를 지나거나 부모 노드로 돌아가는 <code>return</code>이 '되돌리기'에 해당한다.</p>
|
||
<p><strong>되돌리기에는 함수 반환만 포함되는 것이 아니다</strong>. 이를 설명하기 위해 예제 1을 조금 확장해 보자.</p>
|
||
<div class="admonition question">
|
||
<p class="admonition-title">예제 2</p>
|
||
<p>이진 트리에서 값이 <span class="arithmatex">\(7\)</span>인 모든 노드를 찾아 <strong>루트 노드에서 각 노드까지의 경로를 반환하라</strong>.</p>
|
||
</div>
|
||
<p>예제 1의 코드에 리스트 <code>path</code>를 추가하여 방문한 노드의 경로를 기록해야 한다. 값이 <span class="arithmatex">\(7\)</span>인 노드를 방문하면 <code>path</code>를 복사하여 결과 리스트 <code>res</code>에 추가한다. 순회를 마치면 <code>res</code>에 모든 해가 저장된다. 코드는 다음과 같다.</p>
|
||
<div class="tabbed-set tabbed-alternate" data-tabs="2:13"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio"/><input id="__tabbed_2_2" name="__tabbed_2" type="radio"/><input id="__tabbed_2_3" name="__tabbed_2" type="radio"/><input id="__tabbed_2_4" name="__tabbed_2" type="radio"/><input id="__tabbed_2_5" name="__tabbed_2" type="radio"/><input id="__tabbed_2_6" name="__tabbed_2" type="radio"/><input id="__tabbed_2_7" name="__tabbed_2" type="radio"/><input id="__tabbed_2_8" name="__tabbed_2" type="radio"/><input id="__tabbed_2_9" name="__tabbed_2" type="radio"/><input id="__tabbed_2_10" name="__tabbed_2" type="radio"/><input id="__tabbed_2_11" name="__tabbed_2" type="radio"/><input id="__tabbed_2_12" name="__tabbed_2" type="radio"/><input id="__tabbed_2_13" name="__tabbed_2" type="radio"/><div class="tabbed-labels"><label for="__tabbed_2_1">Python</label><label for="__tabbed_2_2">C++</label><label for="__tabbed_2_3">Java</label><label for="__tabbed_2_4">C#</label><label for="__tabbed_2_5">Go</label><label for="__tabbed_2_6">Swift</label><label for="__tabbed_2_7">JS</label><label for="__tabbed_2_8">TS</label><label for="__tabbed_2_9">Dart</label><label for="__tabbed_2_10">Rust</label><label for="__tabbed_2_11">C</label><label for="__tabbed_2_12">Kotlin</label><label for="__tabbed_2_13">Ruby</label></div>
|
||
<div class="tabbed-content">
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.py</span><pre><span></span><code><a href="#__codelineno-13-1" id="__codelineno-13-1" name="__codelineno-13-1"></a><span class="k">def</span><span class="w"> </span><span class="nf">pre_order</span><span class="p">(</span><span class="n">root</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">):</span>
|
||
<a href="#__codelineno-13-2" id="__codelineno-13-2" name="__codelineno-13-2"></a><span class="w"> </span><span class="sd">"""전위 순회: 예제 2"""</span>
|
||
<a href="#__codelineno-13-3" id="__codelineno-13-3" name="__codelineno-13-3"></a> <span class="k">if</span> <span class="n">root</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||
<a href="#__codelineno-13-4" id="__codelineno-13-4" name="__codelineno-13-4"></a> <span class="k">return</span>
|
||
<a href="#__codelineno-13-5" id="__codelineno-13-5" name="__codelineno-13-5"></a> <span class="c1"># 시도</span>
|
||
<a href="#__codelineno-13-6" id="__codelineno-13-6" name="__codelineno-13-6"></a> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-13-7" id="__codelineno-13-7" name="__codelineno-13-7"></a> <span class="k">if</span> <span class="n">root</span><span class="o">.</span><span class="n">val</span> <span class="o">==</span> <span class="mi">7</span><span class="p">:</span>
|
||
<a href="#__codelineno-13-8" id="__codelineno-13-8" name="__codelineno-13-8"></a> <span class="c1"># 해를 기록한다</span>
|
||
<a href="#__codelineno-13-9" id="__codelineno-13-9" name="__codelineno-13-9"></a> <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
|
||
<a href="#__codelineno-13-10" id="__codelineno-13-10" name="__codelineno-13-10"></a> <span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-13-11" id="__codelineno-13-11" name="__codelineno-13-11"></a> <span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-13-12" id="__codelineno-13-12" name="__codelineno-13-12"></a> <span class="c1"># 되돌리기</span>
|
||
<a href="#__codelineno-13-13" id="__codelineno-13-13" name="__codelineno-13-13"></a> <span class="n">path</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.cpp</span><pre><span></span><code><a href="#__codelineno-14-1" id="__codelineno-14-1" name="__codelineno-14-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-14-2" id="__codelineno-14-2" name="__codelineno-14-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-14-3" id="__codelineno-14-3" name="__codelineno-14-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nb">nullptr</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-14-4" id="__codelineno-14-4" name="__codelineno-14-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-14-5" id="__codelineno-14-5" name="__codelineno-14-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-14-6" id="__codelineno-14-6" name="__codelineno-14-6"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-14-7" id="__codelineno-14-7" name="__codelineno-14-7"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-14-8" id="__codelineno-14-8" name="__codelineno-14-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-14-9" id="__codelineno-14-9" name="__codelineno-14-9"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-14-10" id="__codelineno-14-10" name="__codelineno-14-10"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">path</span><span class="p">);</span>
|
||
<a href="#__codelineno-14-11" id="__codelineno-14-11" name="__codelineno-14-11"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-14-12" id="__codelineno-14-12" name="__codelineno-14-12"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-14-13" id="__codelineno-14-13" name="__codelineno-14-13"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-14-14" id="__codelineno-14-14" name="__codelineno-14-14"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-14-15" id="__codelineno-14-15" name="__codelineno-14-15"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">pop_back</span><span class="p">();</span>
|
||
<a href="#__codelineno-14-16" id="__codelineno-14-16" name="__codelineno-14-16"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.java</span><pre><span></span><code><a href="#__codelineno-15-1" id="__codelineno-15-1" name="__codelineno-15-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-15-2" id="__codelineno-15-2" name="__codelineno-15-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-15-3" id="__codelineno-15-3" name="__codelineno-15-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-15-4" id="__codelineno-15-4" name="__codelineno-15-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-15-5" id="__codelineno-15-5" name="__codelineno-15-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-15-6" id="__codelineno-15-6" name="__codelineno-15-6"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-15-7" id="__codelineno-15-7" name="__codelineno-15-7"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-15-8" id="__codelineno-15-8" name="__codelineno-15-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-15-9" id="__codelineno-15-9" name="__codelineno-15-9"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-15-10" id="__codelineno-15-10" name="__codelineno-15-10"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o"><></span><span class="p">(</span><span class="n">path</span><span class="p">));</span>
|
||
<a href="#__codelineno-15-11" id="__codelineno-15-11" name="__codelineno-15-11"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-15-12" id="__codelineno-15-12" name="__codelineno-15-12"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-15-13" id="__codelineno-15-13" name="__codelineno-15-13"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-15-14" id="__codelineno-15-14" name="__codelineno-15-14"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-15-15" id="__codelineno-15-15" name="__codelineno-15-15"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="na">remove</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
||
<a href="#__codelineno-15-16" id="__codelineno-15-16" name="__codelineno-15-16"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.cs</span><pre><span></span><code><a href="#__codelineno-16-1" id="__codelineno-16-1" name="__codelineno-16-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-16-2" id="__codelineno-16-2" name="__codelineno-16-2"></a><span class="k">void</span><span class="w"> </span><span class="nf">PreOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-16-3" id="__codelineno-16-3" name="__codelineno-16-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-16-4" id="__codelineno-16-4" name="__codelineno-16-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-16-5" id="__codelineno-16-5" name="__codelineno-16-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-16-6" id="__codelineno-16-6" name="__codelineno-16-6"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-16-7" id="__codelineno-16-7" name="__codelineno-16-7"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-16-8" id="__codelineno-16-8" name="__codelineno-16-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-16-9" id="__codelineno-16-9" name="__codelineno-16-9"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-16-10" id="__codelineno-16-10" name="__codelineno-16-10"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="p">(</span><span class="n">path</span><span class="p">));</span>
|
||
<a href="#__codelineno-16-11" id="__codelineno-16-11" name="__codelineno-16-11"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-16-12" id="__codelineno-16-12" name="__codelineno-16-12"></a><span class="w"> </span><span class="n">PreOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-16-13" id="__codelineno-16-13" name="__codelineno-16-13"></a><span class="w"> </span><span class="n">PreOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-16-14" id="__codelineno-16-14" name="__codelineno-16-14"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-16-15" id="__codelineno-16-15" name="__codelineno-16-15"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">RemoveAt</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="n">Count</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
||
<a href="#__codelineno-16-16" id="__codelineno-16-16" name="__codelineno-16-16"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.go</span><pre><span></span><code><a href="#__codelineno-17-1" id="__codelineno-17-1" name="__codelineno-17-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-17-2" id="__codelineno-17-2" name="__codelineno-17-2"></a><span class="kd">func</span><span class="w"> </span><span class="nx">preOrderII</span><span class="p">(</span><span class="nx">root</span><span class="w"> </span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="w"> </span><span class="o">*</span><span class="p">[][]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-17-3" id="__codelineno-17-3" name="__codelineno-17-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-17-4" id="__codelineno-17-4" name="__codelineno-17-4"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-17-5" id="__codelineno-17-5" name="__codelineno-17-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-17-6" id="__codelineno-17-6" name="__codelineno-17-6"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-17-7" id="__codelineno-17-7" name="__codelineno-17-7"></a><span class="w"> </span><span class="o">*</span><span class="nx">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="o">*</span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-17-8" id="__codelineno-17-8" name="__codelineno-17-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">root</span><span class="p">.</span><span class="nx">Val</span><span class="p">.(</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-17-9" id="__codelineno-17-9" name="__codelineno-17-9"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-17-10" id="__codelineno-17-10" name="__codelineno-17-10"></a><span class="w"> </span><span class="o">*</span><span class="nx">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="o">*</span><span class="nx">res</span><span class="p">,</span><span class="w"> </span><span class="nb">append</span><span class="p">([]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">{},</span><span class="w"> </span><span class="o">*</span><span class="nx">path</span><span class="p">...))</span>
|
||
<a href="#__codelineno-17-11" id="__codelineno-17-11" name="__codelineno-17-11"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-17-12" id="__codelineno-17-12" name="__codelineno-17-12"></a><span class="w"> </span><span class="nx">preOrderII</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">Left</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">)</span>
|
||
<a href="#__codelineno-17-13" id="__codelineno-17-13" name="__codelineno-17-13"></a><span class="w"> </span><span class="nx">preOrderII</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">Right</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">)</span>
|
||
<a href="#__codelineno-17-14" id="__codelineno-17-14" name="__codelineno-17-14"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-17-15" id="__codelineno-17-15" name="__codelineno-17-15"></a><span class="w"> </span><span class="o">*</span><span class="nx">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="nx">path</span><span class="p">)[:</span><span class="nb">len</span><span class="p">(</span><span class="o">*</span><span class="nx">path</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||
<a href="#__codelineno-17-16" id="__codelineno-17-16" name="__codelineno-17-16"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.swift</span><pre><span></span><code><a href="#__codelineno-18-1" id="__codelineno-18-1" name="__codelineno-18-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-18-2" id="__codelineno-18-2" name="__codelineno-18-2"></a><span class="kd">func</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode</span><span class="p">?)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-18-3" id="__codelineno-18-3" name="__codelineno-18-3"></a><span class="w"> </span><span class="k">guard</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">root</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-18-4" id="__codelineno-18-4" name="__codelineno-18-4"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-18-5" id="__codelineno-18-5" name="__codelineno-18-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-18-6" id="__codelineno-18-6" name="__codelineno-18-6"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-18-7" id="__codelineno-18-7" name="__codelineno-18-7"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-18-8" id="__codelineno-18-8" name="__codelineno-18-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-18-9" id="__codelineno-18-9" name="__codelineno-18-9"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-18-10" id="__codelineno-18-10" name="__codelineno-18-10"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
|
||
<a href="#__codelineno-18-11" id="__codelineno-18-11" name="__codelineno-18-11"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-18-12" id="__codelineno-18-12" name="__codelineno-18-12"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="kr">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-18-13" id="__codelineno-18-13" name="__codelineno-18-13"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="kr">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-18-14" id="__codelineno-18-14" name="__codelineno-18-14"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-18-15" id="__codelineno-18-15" name="__codelineno-18-15"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="bp">removeLast</span><span class="p">()</span>
|
||
<a href="#__codelineno-18-16" id="__codelineno-18-16" name="__codelineno-18-16"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.js</span><pre><span></span><code><a href="#__codelineno-19-1" id="__codelineno-19-1" name="__codelineno-19-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-19-2" id="__codelineno-19-2" name="__codelineno-19-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-19-3" id="__codelineno-19-3" name="__codelineno-19-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-19-4" id="__codelineno-19-4" name="__codelineno-19-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-19-5" id="__codelineno-19-5" name="__codelineno-19-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-19-6" id="__codelineno-19-6" name="__codelineno-19-6"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-19-7" id="__codelineno-19-7" name="__codelineno-19-7"></a><span class="w"> </span><span class="nx">path</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-19-8" id="__codelineno-19-8" name="__codelineno-19-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-19-9" id="__codelineno-19-9" name="__codelineno-19-9"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-19-10" id="__codelineno-19-10" name="__codelineno-19-10"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">([...</span><span class="nx">path</span><span class="p">]);</span>
|
||
<a href="#__codelineno-19-11" id="__codelineno-19-11" name="__codelineno-19-11"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-19-12" id="__codelineno-19-12" name="__codelineno-19-12"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">left</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-19-13" id="__codelineno-19-13" name="__codelineno-19-13"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">right</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-19-14" id="__codelineno-19-14" name="__codelineno-19-14"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-19-15" id="__codelineno-19-15" name="__codelineno-19-15"></a><span class="w"> </span><span class="nx">path</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span>
|
||
<a href="#__codelineno-19-16" id="__codelineno-19-16" name="__codelineno-19-16"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.ts</span><pre><span></span><code><a href="#__codelineno-20-1" id="__codelineno-20-1" name="__codelineno-20-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-20-2" id="__codelineno-20-2" name="__codelineno-20-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span>
|
||
<a href="#__codelineno-20-3" id="__codelineno-20-3" name="__codelineno-20-3"></a><span class="w"> </span><span class="nx">root</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
|
||
<a href="#__codelineno-20-4" id="__codelineno-20-4" name="__codelineno-20-4"></a><span class="w"> </span><span class="nx">path</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[],</span>
|
||
<a href="#__codelineno-20-5" id="__codelineno-20-5" name="__codelineno-20-5"></a><span class="w"> </span><span class="nx">res</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[][]</span>
|
||
<a href="#__codelineno-20-6" id="__codelineno-20-6" name="__codelineno-20-6"></a><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-20-7" id="__codelineno-20-7" name="__codelineno-20-7"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-20-8" id="__codelineno-20-8" name="__codelineno-20-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-20-9" id="__codelineno-20-9" name="__codelineno-20-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-20-10" id="__codelineno-20-10" name="__codelineno-20-10"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-20-11" id="__codelineno-20-11" name="__codelineno-20-11"></a><span class="w"> </span><span class="nx">path</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-20-12" id="__codelineno-20-12" name="__codelineno-20-12"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-20-13" id="__codelineno-20-13" name="__codelineno-20-13"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-20-14" id="__codelineno-20-14" name="__codelineno-20-14"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">([...</span><span class="nx">path</span><span class="p">]);</span>
|
||
<a href="#__codelineno-20-15" id="__codelineno-20-15" name="__codelineno-20-15"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-20-16" id="__codelineno-20-16" name="__codelineno-20-16"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">left</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-20-17" id="__codelineno-20-17" name="__codelineno-20-17"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">right</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-20-18" id="__codelineno-20-18" name="__codelineno-20-18"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-20-19" id="__codelineno-20-19" name="__codelineno-20-19"></a><span class="w"> </span><span class="nx">path</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span>
|
||
<a href="#__codelineno-20-20" id="__codelineno-20-20" name="__codelineno-20-20"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.dart</span><pre><span></span><code><a href="#__codelineno-21-1" id="__codelineno-21-1" name="__codelineno-21-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-21-2" id="__codelineno-21-2" name="__codelineno-21-2"></a><span class="kt">void</span><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span>
|
||
<a href="#__codelineno-21-3" id="__codelineno-21-3" name="__codelineno-21-3"></a><span class="w"> </span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">root</span><span class="p">,</span>
|
||
<a href="#__codelineno-21-4" id="__codelineno-21-4" name="__codelineno-21-4"></a><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">path</span><span class="p">,</span>
|
||
<a href="#__codelineno-21-5" id="__codelineno-21-5" name="__codelineno-21-5"></a><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="w"> </span><span class="n">res</span><span class="p">,</span>
|
||
<a href="#__codelineno-21-6" id="__codelineno-21-6" name="__codelineno-21-6"></a><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-21-7" id="__codelineno-21-7" name="__codelineno-21-7"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-21-8" id="__codelineno-21-8" name="__codelineno-21-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-21-9" id="__codelineno-21-9" name="__codelineno-21-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-21-10" id="__codelineno-21-10" name="__codelineno-21-10"></a>
|
||
<a href="#__codelineno-21-11" id="__codelineno-21-11" name="__codelineno-21-11"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-21-12" id="__codelineno-21-12" name="__codelineno-21-12"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-21-13" id="__codelineno-21-13" name="__codelineno-21-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-21-14" id="__codelineno-21-14" name="__codelineno-21-14"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-21-15" id="__codelineno-21-15" name="__codelineno-21-15"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">List</span><span class="p">.</span><span class="n">from</span><span class="p">(</span><span class="n">path</span><span class="p">));</span>
|
||
<a href="#__codelineno-21-16" id="__codelineno-21-16" name="__codelineno-21-16"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-21-17" id="__codelineno-21-17" name="__codelineno-21-17"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-21-18" id="__codelineno-21-18" name="__codelineno-21-18"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">right</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-21-19" id="__codelineno-21-19" name="__codelineno-21-19"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-21-20" id="__codelineno-21-20" name="__codelineno-21-20"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">removeLast</span><span class="p">();</span>
|
||
<a href="#__codelineno-21-21" id="__codelineno-21-21" name="__codelineno-21-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.rs</span><pre><span></span><code><a href="#__codelineno-22-1" id="__codelineno-22-1" name="__codelineno-22-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-22-2" id="__codelineno-22-2" name="__codelineno-22-2"></a><span class="k">fn</span><span class="w"> </span><span class="nf">pre_order</span><span class="p">(</span>
|
||
<a href="#__codelineno-22-3" id="__codelineno-22-3" name="__codelineno-22-3"></a><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-22-4" id="__codelineno-22-4" name="__codelineno-22-4"></a><span class="w"> </span><span class="n">path</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-22-5" id="__codelineno-22-5" name="__codelineno-22-5"></a><span class="w"> </span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="nb">Option</span><span class="o"><&</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-22-6" id="__codelineno-22-6" name="__codelineno-22-6"></a><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-22-7" id="__codelineno-22-7" name="__codelineno-22-7"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">is_none</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-22-8" id="__codelineno-22-8" name="__codelineno-22-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-22-9" id="__codelineno-22-9" name="__codelineno-22-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-22-10" id="__codelineno-22-10" name="__codelineno-22-10"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">node</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-22-11" id="__codelineno-22-11" name="__codelineno-22-11"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-22-12" id="__codelineno-22-12" name="__codelineno-22-12"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">clone</span><span class="p">());</span>
|
||
<a href="#__codelineno-22-13" id="__codelineno-22-13" name="__codelineno-22-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-22-14" id="__codelineno-22-14" name="__codelineno-22-14"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-22-15" id="__codelineno-22-15" name="__codelineno-22-15"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="n">clone</span><span class="p">());</span>
|
||
<a href="#__codelineno-22-16" id="__codelineno-22-16" name="__codelineno-22-16"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-22-17" id="__codelineno-22-17" name="__codelineno-22-17"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">res</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">left</span><span class="p">.</span><span class="n">as_ref</span><span class="p">());</span>
|
||
<a href="#__codelineno-22-18" id="__codelineno-22-18" name="__codelineno-22-18"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">res</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">right</span><span class="p">.</span><span class="n">as_ref</span><span class="p">());</span>
|
||
<a href="#__codelineno-22-19" id="__codelineno-22-19" name="__codelineno-22-19"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-22-20" id="__codelineno-22-20" name="__codelineno-22-20"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
|
||
<a href="#__codelineno-22-21" id="__codelineno-22-21" name="__codelineno-22-21"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-22-22" id="__codelineno-22-22" name="__codelineno-22-22"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.c</span><pre><span></span><code><a href="#__codelineno-23-1" id="__codelineno-23-1" name="__codelineno-23-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-23-2" id="__codelineno-23-2" name="__codelineno-23-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-23-3" id="__codelineno-23-3" name="__codelineno-23-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nb">NULL</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-23-4" id="__codelineno-23-4" name="__codelineno-23-4"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-23-5" id="__codelineno-23-5" name="__codelineno-23-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-23-6" id="__codelineno-23-6" name="__codelineno-23-6"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-23-7" id="__codelineno-23-7" name="__codelineno-23-7"></a><span class="w"> </span><span class="n">path</span><span class="p">[</span><span class="n">pathSize</span><span class="o">++</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root</span><span class="p">;</span>
|
||
<a href="#__codelineno-23-8" id="__codelineno-23-8" name="__codelineno-23-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-23-9" id="__codelineno-23-9" name="__codelineno-23-9"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-23-10" id="__codelineno-23-10" name="__codelineno-23-10"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">pathSize</span><span class="p">;</span><span class="w"> </span><span class="o">++</span><span class="n">i</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-23-11" id="__codelineno-23-11" name="__codelineno-23-11"></a><span class="w"> </span><span class="n">res</span><span class="p">[</span><span class="n">resSize</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
|
||
<a href="#__codelineno-23-12" id="__codelineno-23-12" name="__codelineno-23-12"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-23-13" id="__codelineno-23-13" name="__codelineno-23-13"></a><span class="w"> </span><span class="n">resSize</span><span class="o">++</span><span class="p">;</span>
|
||
<a href="#__codelineno-23-14" id="__codelineno-23-14" name="__codelineno-23-14"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-23-15" id="__codelineno-23-15" name="__codelineno-23-15"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-23-16" id="__codelineno-23-16" name="__codelineno-23-16"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-23-17" id="__codelineno-23-17" name="__codelineno-23-17"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-23-18" id="__codelineno-23-18" name="__codelineno-23-18"></a><span class="w"> </span><span class="n">pathSize</span><span class="o">--</span><span class="p">;</span>
|
||
<a href="#__codelineno-23-19" id="__codelineno-23-19" name="__codelineno-23-19"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.kt</span><pre><span></span><code><a href="#__codelineno-24-1" id="__codelineno-24-1" name="__codelineno-24-1"></a><span class="cm">/* 전위 순회: 예제 2 */</span>
|
||
<a href="#__codelineno-24-2" id="__codelineno-24-2" name="__codelineno-24-2"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode?</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-24-3" id="__codelineno-24-3" name="__codelineno-24-3"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-24-4" id="__codelineno-24-4" name="__codelineno-24-4"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-24-5" id="__codelineno-24-5" name="__codelineno-24-5"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-24-6" id="__codelineno-24-6" name="__codelineno-24-6"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-24-7" id="__codelineno-24-7" name="__codelineno-24-7"></a><span class="w"> </span><span class="n">path</span><span class="o">!!</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-24-8" id="__codelineno-24-8" name="__codelineno-24-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">_val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-24-9" id="__codelineno-24-9" name="__codelineno-24-9"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-24-10" id="__codelineno-24-10" name="__codelineno-24-10"></a><span class="w"> </span><span class="n">res</span><span class="o">!!</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">path</span><span class="o">!!</span><span class="p">.</span><span class="na">toMutableList</span><span class="p">())</span>
|
||
<a href="#__codelineno-24-11" id="__codelineno-24-11" name="__codelineno-24-11"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-24-12" id="__codelineno-24-12" name="__codelineno-24-12"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-24-13" id="__codelineno-24-13" name="__codelineno-24-13"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-24-14" id="__codelineno-24-14" name="__codelineno-24-14"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-24-15" id="__codelineno-24-15" name="__codelineno-24-15"></a><span class="w"> </span><span class="n">path</span><span class="o">!!</span><span class="p">.</span><span class="na">removeAt</span><span class="p">(</span><span class="n">path</span><span class="o">!!</span><span class="p">.</span><span class="na">size</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">)</span>
|
||
<a href="#__codelineno-24-16" id="__codelineno-24-16" name="__codelineno-24-16"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_ii_compact.rb</span><pre><span></span><code><a href="#__codelineno-25-1" id="__codelineno-25-1" name="__codelineno-25-1"></a><span class="c1">### 전위 순회: 예제 2 ###</span>
|
||
<a href="#__codelineno-25-2" id="__codelineno-25-2" name="__codelineno-25-2"></a><span class="k">def</span><span class="w"> </span><span class="nf">pre_order</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-25-3" id="__codelineno-25-3" name="__codelineno-25-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">unless</span><span class="w"> </span><span class="n">root</span>
|
||
<a href="#__codelineno-25-4" id="__codelineno-25-4" name="__codelineno-25-4"></a>
|
||
<a href="#__codelineno-25-5" id="__codelineno-25-5" name="__codelineno-25-5"></a><span class="w"> </span><span class="c1"># 시도</span>
|
||
<a href="#__codelineno-25-6" id="__codelineno-25-6" name="__codelineno-25-6"></a><span class="w"> </span><span class="vg">$path</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">root</span>
|
||
<a href="#__codelineno-25-7" id="__codelineno-25-7" name="__codelineno-25-7"></a>
|
||
<a href="#__codelineno-25-8" id="__codelineno-25-8" name="__codelineno-25-8"></a><span class="w"> </span><span class="c1"># 해를 기록한다</span>
|
||
<a href="#__codelineno-25-9" id="__codelineno-25-9" name="__codelineno-25-9"></a><span class="w"> </span><span class="vg">$res</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="vg">$path</span><span class="o">.</span><span class="n">dup</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">root</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span>
|
||
<a href="#__codelineno-25-10" id="__codelineno-25-10" name="__codelineno-25-10"></a>
|
||
<a href="#__codelineno-25-11" id="__codelineno-25-11" name="__codelineno-25-11"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-25-12" id="__codelineno-25-12" name="__codelineno-25-12"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-25-13" id="__codelineno-25-13" name="__codelineno-25-13"></a>
|
||
<a href="#__codelineno-25-14" id="__codelineno-25-14" name="__codelineno-25-14"></a><span class="w"> </span><span class="c1"># 되돌리기</span>
|
||
<a href="#__codelineno-25-15" id="__codelineno-25-15" name="__codelineno-25-15"></a><span class="w"> </span><span class="vg">$path</span><span class="o">.</span><span class="n">pop</span>
|
||
<a href="#__codelineno-25-16" id="__codelineno-25-16" name="__codelineno-25-16"></a><span class="k">end</span>
|
||
</code></pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<details class="pythontutor">
|
||
<summary>코드 시각화</summary>
|
||
<p><div style="height: 549px; width: 100%;"><iframe class="pythontutor-iframe" src="https://pythontutor.com/iframe-embed.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%20%EB%85%B8%EB%93%9C%20%ED%81%B4%EB%9E%98%EC%8A%A4%22%22%22%0A%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%EB%85%B8%EB%93%9C%20%EA%B0%92%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%99%BC%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D,%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%3A%20%EC%9E%AC%EA%B7%80%22%22%22%0A%20%20%20%20%23%20%EC%9D%B8%EB%8D%B1%EC%8A%A4%EA%B0%80%20%EB%B0%B0%EC%97%B4%20%EA%B8%B8%EC%9D%B4%EB%A5%BC%20%EB%B2%97%EC%96%B4%EB%82%98%EA%B1%B0%EB%82%98%20%ED%95%B4%EB%8B%B9%20%EC%9B%90%EC%86%8C%EA%B0%80%20None%EC%9D%B4%EB%A9%B4%20None%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%ED%98%84%EC%9E%AC%20%EB%85%B8%EB%93%9C%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20%23%20%EC%99%BC%EC%AA%BD%EA%B3%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%84%9C%EB%B8%8C%ED%8A%B8%EB%A6%AC%EB%A5%BC%20%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%22%22%22%0A%20%20%20%20return%20list_to_tree_dfs%28arr,%200%29%0A%0A%0Adef%20pre_order%28root%3A%20TreeNode%29%3A%0A%20%20%20%20%22%22%22%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%3A%20%EC%98%88%EC%A0%9C%202%22%22%22%0A%20%20%20%20if%20root%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%EC%8B%9C%EB%8F%84%0A%20%20%20%20path.append%28root%29%0A%20%20%20%20if%20root.val%20%3D%3D%207%3A%0A%20%20%20%20%20%20%20%20%23%20%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%0A%20%20%20%20%20%20%20%20res.append%28list%28path%29%29%0A%20%20%20%20pre_order%28root.left%29%0A%20%20%20%20pre_order%28root.right%29%0A%20%20%20%20%23%20%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0%0A%20%20%20%20path.pop%28%29%0A%0A%0A%22%22%22%EC%8B%A4%ED%96%89%20%EC%BD%94%EB%93%9C%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1,%207,%203,%204,%205,%206,%207%5D%29%0A%0A%20%20%20%20%23%20%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%0A%20%20%20%20path%20%3D%20list%5BTreeNode%5D%28%29%0A%20%20%20%20res%20%3D%20list%5Blist%5BTreeNode%5D%5D%28%29%0A%20%20%20%20pre_order%28root%29%0A%0A%20%20%20%20print%28%22%5Cn%EB%A3%A8%ED%8A%B8%20%EB%85%B8%EB%93%9C%EC%97%90%EC%84%9C%20%EB%85%B8%EB%93%9C%207%EA%B9%8C%EC%A7%80%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EA%B2%BD%EB%A1%9C%20%EC%B6%9C%EB%A0%A5%22%29%0A%20%20%20%20for%20path%20in%20res%3A%0A%20%20%20%20%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20path%5D%29&codeDivHeight=472&codeDivWidth=350&cumulative=false&curInstr=126&heapPrimitives=nevernest&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false" title="코드 시각화"> </iframe></div>
|
||
<div style="margin-top: 5px;"><a href="https://pythontutor.com/iframe-embed.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%20%EB%85%B8%EB%93%9C%20%ED%81%B4%EB%9E%98%EC%8A%A4%22%22%22%0A%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%EB%85%B8%EB%93%9C%20%EA%B0%92%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%99%BC%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D,%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%3A%20%EC%9E%AC%EA%B7%80%22%22%22%0A%20%20%20%20%23%20%EC%9D%B8%EB%8D%B1%EC%8A%A4%EA%B0%80%20%EB%B0%B0%EC%97%B4%20%EA%B8%B8%EC%9D%B4%EB%A5%BC%20%EB%B2%97%EC%96%B4%EB%82%98%EA%B1%B0%EB%82%98%20%ED%95%B4%EB%8B%B9%20%EC%9B%90%EC%86%8C%EA%B0%80%20None%EC%9D%B4%EB%A9%B4%20None%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%ED%98%84%EC%9E%AC%20%EB%85%B8%EB%93%9C%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20%23%20%EC%99%BC%EC%AA%BD%EA%B3%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%84%9C%EB%B8%8C%ED%8A%B8%EB%A6%AC%EB%A5%BC%20%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%22%22%22%0A%20%20%20%20return%20list_to_tree_dfs%28arr,%200%29%0A%0A%0Adef%20pre_order%28root%3A%20TreeNode%29%3A%0A%20%20%20%20%22%22%22%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%3A%20%EC%98%88%EC%A0%9C%202%22%22%22%0A%20%20%20%20if%20root%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%EC%8B%9C%EB%8F%84%0A%20%20%20%20path.append%28root%29%0A%20%20%20%20if%20root.val%20%3D%3D%207%3A%0A%20%20%20%20%20%20%20%20%23%20%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%0A%20%20%20%20%20%20%20%20res.append%28list%28path%29%29%0A%20%20%20%20pre_order%28root.left%29%0A%20%20%20%20pre_order%28root.right%29%0A%20%20%20%20%23%20%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0%0A%20%20%20%20path.pop%28%29%0A%0A%0A%22%22%22%EC%8B%A4%ED%96%89%20%EC%BD%94%EB%93%9C%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1,%207,%203,%204,%205,%206,%207%5D%29%0A%0A%20%20%20%20%23%20%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%0A%20%20%20%20path%20%3D%20list%5BTreeNode%5D%28%29%0A%20%20%20%20res%20%3D%20list%5Blist%5BTreeNode%5D%5D%28%29%0A%20%20%20%20pre_order%28root%29%0A%0A%20%20%20%20print%28%22%5Cn%EB%A3%A8%ED%8A%B8%20%EB%85%B8%EB%93%9C%EC%97%90%EC%84%9C%20%EB%85%B8%EB%93%9C%207%EA%B9%8C%EC%A7%80%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EA%B2%BD%EB%A1%9C%20%EC%B6%9C%EB%A0%A5%22%29%0A%20%20%20%20for%20path%20in%20res%3A%0A%20%20%20%20%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20path%5D%29&codeDivHeight=800&codeDivWidth=600&cumulative=false&curInstr=126&heapPrimitives=nevernest&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false" rel="noopener noreferrer" target="_blank">전체 화면 ></a></div></p>
|
||
</details>
|
||
<p>매번 '시도'할 때는 현재 노드를 <code>path</code>에 추가하여 경로를 기록한다. '되돌리기' 전에는 이 노드를 <code>path</code>에서 꺼내어 <strong>이번 시도 이전의 상태를 복원해야 한다</strong>.</p>
|
||
<p>아래 그림(13-2)의 과정을 보면 <strong>시도와 되돌리기를 각각 '전진'과 '취소'로 이해할 수 있으며</strong>, 두 연산은 서로 반대 방향이다.</p>
|
||
<div class="tabbed-set tabbed-alternate" data-figure-sequence="" data-tabs="3:11"><input checked="checked" id="__tabbed_3_1" name="__tabbed_3" type="radio"/><input id="__tabbed_3_2" name="__tabbed_3" type="radio"/><input id="__tabbed_3_3" name="__tabbed_3" type="radio"/><input id="__tabbed_3_4" name="__tabbed_3" type="radio"/><input id="__tabbed_3_5" name="__tabbed_3" type="radio"/><input id="__tabbed_3_6" name="__tabbed_3" type="radio"/><input id="__tabbed_3_7" name="__tabbed_3" type="radio"/><input id="__tabbed_3_8" name="__tabbed_3" type="radio"/><input id="__tabbed_3_9" name="__tabbed_3" type="radio"/><input id="__tabbed_3_10" name="__tabbed_3" type="radio"/><input id="__tabbed_3_11" name="__tabbed_3" type="radio"/><div class="tabbed-labels"><label for="__tabbed_3_1"><1></label><label for="__tabbed_3_2"><2></label><label for="__tabbed_3_3"><3></label><label for="__tabbed_3_4"><4></label><label for="__tabbed_3_5"><5></label><label for="__tabbed_3_6"><6></label><label for="__tabbed_3_7"><7></label><label for="__tabbed_3_8"><8></label><label for="__tabbed_3_9"><9></label><label for="__tabbed_3_10"><10></label><label for="__tabbed_3_11"><11></label></div>
|
||
<div class="tabbed-content">
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.png" data-dark-src="/assets/figure-svg/figures/7b72022bff9e6e57300b596f.json" data-src="/assets/figure-svg/figures/010fbc770aa851398bbd6c2b.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.svg" data-theme="light" tabindex="-1" type="image/svg+xml">시도와 되돌리기</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step1.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">시도와 되돌리기</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step2.png" data-dark-src="/assets/figure-svg/figures/68ffd82e743f2d77ddfdf1d8.json" data-src="/assets/figure-svg/figures/f63d80079c6d2ac3bf34d0e2.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step2.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 2단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step2.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 2단계</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step3.png" data-dark-src="/assets/figure-svg/figures/7eb7c750e2e472ec4ac492b0.json" data-src="/assets/figure-svg/figures/dbfe1971f855b4f61768575f.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step3.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 3단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step3.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 3단계</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step4.png" data-dark-src="/assets/figure-svg/figures/804cd651153fb35ff88e6709.json" data-src="/assets/figure-svg/figures/a5d6fcd725b6acf4131e1dd7.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step4.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 4단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step4.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 4단계</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step5.png" data-dark-src="/assets/figure-svg/figures/4efe19e9c60798299d09a792.json" data-src="/assets/figure-svg/figures/a67d4393ab463dbc6df86483.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step5.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 5단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step5.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 5단계</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step6.png" data-dark-src="/assets/figure-svg/figures/bfb04e209d56c59fc1ca2d58.json" data-src="/assets/figure-svg/figures/5cc77a51212cae69e9307fe3.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step6.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 6단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step6.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 6단계</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.png" data-dark-src="/assets/figure-svg/figures/99cde3f139d0318e1caafcad.json" data-src="/assets/figure-svg/figures/8a80b7deb875d18798fdd3d3.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 7단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step7.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 7단계</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.png" data-dark-src="/assets/figure-svg/figures/d46c94706b49b33336b7b2e5.json" data-src="/assets/figure-svg/figures/74b9c125d0a4efcad402b255.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 8단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step8.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 8단계</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step9.png" data-dark-src="/assets/figure-svg/figures/4b64ee315a341e6f718fa402.json" data-src="/assets/figure-svg/figures/3a168f312c96b46340f0e6d5.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step9.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 9단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step9.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 9단계</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.png" data-dark-src="/assets/figure-svg/figures/c18dfd473cec5c573a3e765e.json" data-src="/assets/figure-svg/figures/0a573c3642458f614f28b05f.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 10단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step10.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 10단계</object></ha-svg-figure></p>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.png" data-dark-src="/assets/figure-svg/figures/b2c4a337f99fdb849c011e08.json" data-src="/assets/figure-svg/figures/91851c437e99352f8cb3b58d.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.svg" data-theme="light" tabindex="-1" type="image/svg+xml">경로 탐색 11단계</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_paths_step11.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">경로 탐색 11단계</object></ha-svg-figure></p>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p align="center"> 그림 13-2 시도와 되돌리기 </p>
|
||
<h2 id="1312">13.1.2 가지치기<a class="headerlink" href="#1312" title="고유 링크">¶</a></h2>
|
||
<p>복잡한 백트래킹 문제에는 보통 하나 이상의 제약 조건이 있으며, <strong>이 제약 조건을 '가지치기'에 활용할 수 있다</strong>.</p>
|
||
<div class="admonition question">
|
||
<p class="admonition-title">예제 3</p>
|
||
<p>이진 트리에서 값이 <span class="arithmatex">\(7\)</span>인 모든 노드를 찾아 루트 노드에서 각 노드까지의 경로를 반환하라. <strong>단, 경로에 값이 <span class="arithmatex">\(3\)</span>인 노드가 포함되면 안 된다</strong>.</p>
|
||
</div>
|
||
<p>이 제약을 만족하려면 <strong>가지치기 연산을 추가해야 한다</strong>. 탐색 중 값이 <span class="arithmatex">\(3\)</span>인 노드를 만나면 더 탐색하지 않고 조기에 반환한다. 코드는 다음과 같다.</p>
|
||
<div class="tabbed-set tabbed-alternate" data-tabs="4:13"><input checked="checked" id="__tabbed_4_1" name="__tabbed_4" type="radio"/><input id="__tabbed_4_2" name="__tabbed_4" type="radio"/><input id="__tabbed_4_3" name="__tabbed_4" type="radio"/><input id="__tabbed_4_4" name="__tabbed_4" type="radio"/><input id="__tabbed_4_5" name="__tabbed_4" type="radio"/><input id="__tabbed_4_6" name="__tabbed_4" type="radio"/><input id="__tabbed_4_7" name="__tabbed_4" type="radio"/><input id="__tabbed_4_8" name="__tabbed_4" type="radio"/><input id="__tabbed_4_9" name="__tabbed_4" type="radio"/><input id="__tabbed_4_10" name="__tabbed_4" type="radio"/><input id="__tabbed_4_11" name="__tabbed_4" type="radio"/><input id="__tabbed_4_12" name="__tabbed_4" type="radio"/><input id="__tabbed_4_13" name="__tabbed_4" type="radio"/><div class="tabbed-labels"><label for="__tabbed_4_1">Python</label><label for="__tabbed_4_2">C++</label><label for="__tabbed_4_3">Java</label><label for="__tabbed_4_4">C#</label><label for="__tabbed_4_5">Go</label><label for="__tabbed_4_6">Swift</label><label for="__tabbed_4_7">JS</label><label for="__tabbed_4_8">TS</label><label for="__tabbed_4_9">Dart</label><label for="__tabbed_4_10">Rust</label><label for="__tabbed_4_11">C</label><label for="__tabbed_4_12">Kotlin</label><label for="__tabbed_4_13">Ruby</label></div>
|
||
<div class="tabbed-content">
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.py</span><pre><span></span><code><a href="#__codelineno-26-1" id="__codelineno-26-1" name="__codelineno-26-1"></a><span class="k">def</span><span class="w"> </span><span class="nf">pre_order</span><span class="p">(</span><span class="n">root</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">):</span>
|
||
<a href="#__codelineno-26-2" id="__codelineno-26-2" name="__codelineno-26-2"></a><span class="w"> </span><span class="sd">"""전위 순회: 예제 3"""</span>
|
||
<a href="#__codelineno-26-3" id="__codelineno-26-3" name="__codelineno-26-3"></a> <span class="c1"># 가지치기</span>
|
||
<a href="#__codelineno-26-4" id="__codelineno-26-4" name="__codelineno-26-4"></a> <span class="k">if</span> <span class="n">root</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">root</span><span class="o">.</span><span class="n">val</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
|
||
<a href="#__codelineno-26-5" id="__codelineno-26-5" name="__codelineno-26-5"></a> <span class="k">return</span>
|
||
<a href="#__codelineno-26-6" id="__codelineno-26-6" name="__codelineno-26-6"></a> <span class="c1"># 시도</span>
|
||
<a href="#__codelineno-26-7" id="__codelineno-26-7" name="__codelineno-26-7"></a> <span class="n">path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-26-8" id="__codelineno-26-8" name="__codelineno-26-8"></a> <span class="k">if</span> <span class="n">root</span><span class="o">.</span><span class="n">val</span> <span class="o">==</span> <span class="mi">7</span><span class="p">:</span>
|
||
<a href="#__codelineno-26-9" id="__codelineno-26-9" name="__codelineno-26-9"></a> <span class="c1"># 해를 기록한다</span>
|
||
<a href="#__codelineno-26-10" id="__codelineno-26-10" name="__codelineno-26-10"></a> <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">path</span><span class="p">))</span>
|
||
<a href="#__codelineno-26-11" id="__codelineno-26-11" name="__codelineno-26-11"></a> <span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-26-12" id="__codelineno-26-12" name="__codelineno-26-12"></a> <span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-26-13" id="__codelineno-26-13" name="__codelineno-26-13"></a> <span class="c1"># 되돌리기</span>
|
||
<a href="#__codelineno-26-14" id="__codelineno-26-14" name="__codelineno-26-14"></a> <span class="n">path</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.cpp</span><pre><span></span><code><a href="#__codelineno-27-1" id="__codelineno-27-1" name="__codelineno-27-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-27-2" id="__codelineno-27-2" name="__codelineno-27-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-27-3" id="__codelineno-27-3" name="__codelineno-27-3"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-27-4" id="__codelineno-27-4" name="__codelineno-27-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nb">nullptr</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">root</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-27-5" id="__codelineno-27-5" name="__codelineno-27-5"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-27-6" id="__codelineno-27-6" name="__codelineno-27-6"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-27-7" id="__codelineno-27-7" name="__codelineno-27-7"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-27-8" id="__codelineno-27-8" name="__codelineno-27-8"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-27-9" id="__codelineno-27-9" name="__codelineno-27-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-27-10" id="__codelineno-27-10" name="__codelineno-27-10"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-27-11" id="__codelineno-27-11" name="__codelineno-27-11"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">path</span><span class="p">);</span>
|
||
<a href="#__codelineno-27-12" id="__codelineno-27-12" name="__codelineno-27-12"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-27-13" id="__codelineno-27-13" name="__codelineno-27-13"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-27-14" id="__codelineno-27-14" name="__codelineno-27-14"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-27-15" id="__codelineno-27-15" name="__codelineno-27-15"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-27-16" id="__codelineno-27-16" name="__codelineno-27-16"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">pop_back</span><span class="p">();</span>
|
||
<a href="#__codelineno-27-17" id="__codelineno-27-17" name="__codelineno-27-17"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.java</span><pre><span></span><code><a href="#__codelineno-28-1" id="__codelineno-28-1" name="__codelineno-28-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-28-2" id="__codelineno-28-2" name="__codelineno-28-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-28-3" id="__codelineno-28-3" name="__codelineno-28-3"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-28-4" id="__codelineno-28-4" name="__codelineno-28-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="na">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-28-5" id="__codelineno-28-5" name="__codelineno-28-5"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-28-6" id="__codelineno-28-6" name="__codelineno-28-6"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-28-7" id="__codelineno-28-7" name="__codelineno-28-7"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-28-8" id="__codelineno-28-8" name="__codelineno-28-8"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-28-9" id="__codelineno-28-9" name="__codelineno-28-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-28-10" id="__codelineno-28-10" name="__codelineno-28-10"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-28-11" id="__codelineno-28-11" name="__codelineno-28-11"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o"><></span><span class="p">(</span><span class="n">path</span><span class="p">));</span>
|
||
<a href="#__codelineno-28-12" id="__codelineno-28-12" name="__codelineno-28-12"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-28-13" id="__codelineno-28-13" name="__codelineno-28-13"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-28-14" id="__codelineno-28-14" name="__codelineno-28-14"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-28-15" id="__codelineno-28-15" name="__codelineno-28-15"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-28-16" id="__codelineno-28-16" name="__codelineno-28-16"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="na">remove</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
||
<a href="#__codelineno-28-17" id="__codelineno-28-17" name="__codelineno-28-17"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.cs</span><pre><span></span><code><a href="#__codelineno-29-1" id="__codelineno-29-1" name="__codelineno-29-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-29-2" id="__codelineno-29-2" name="__codelineno-29-2"></a><span class="k">void</span><span class="w"> </span><span class="nf">PreOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-29-3" id="__codelineno-29-3" name="__codelineno-29-3"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-29-4" id="__codelineno-29-4" name="__codelineno-29-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-29-5" id="__codelineno-29-5" name="__codelineno-29-5"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-29-6" id="__codelineno-29-6" name="__codelineno-29-6"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-29-7" id="__codelineno-29-7" name="__codelineno-29-7"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-29-8" id="__codelineno-29-8" name="__codelineno-29-8"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-29-9" id="__codelineno-29-9" name="__codelineno-29-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-29-10" id="__codelineno-29-10" name="__codelineno-29-10"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-29-11" id="__codelineno-29-11" name="__codelineno-29-11"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="p">(</span><span class="n">path</span><span class="p">));</span>
|
||
<a href="#__codelineno-29-12" id="__codelineno-29-12" name="__codelineno-29-12"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-29-13" id="__codelineno-29-13" name="__codelineno-29-13"></a><span class="w"> </span><span class="n">PreOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-29-14" id="__codelineno-29-14" name="__codelineno-29-14"></a><span class="w"> </span><span class="n">PreOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-29-15" id="__codelineno-29-15" name="__codelineno-29-15"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-29-16" id="__codelineno-29-16" name="__codelineno-29-16"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">RemoveAt</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="n">Count</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
||
<a href="#__codelineno-29-17" id="__codelineno-29-17" name="__codelineno-29-17"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.go</span><pre><span></span><code><a href="#__codelineno-30-1" id="__codelineno-30-1" name="__codelineno-30-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-30-2" id="__codelineno-30-2" name="__codelineno-30-2"></a><span class="kd">func</span><span class="w"> </span><span class="nx">preOrderIII</span><span class="p">(</span><span class="nx">root</span><span class="w"> </span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="w"> </span><span class="o">*</span><span class="p">[][]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-30-3" id="__codelineno-30-3" name="__codelineno-30-3"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-30-4" id="__codelineno-30-4" name="__codelineno-30-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nx">root</span><span class="p">.</span><span class="nx">Val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-30-5" id="__codelineno-30-5" name="__codelineno-30-5"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-30-6" id="__codelineno-30-6" name="__codelineno-30-6"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-30-7" id="__codelineno-30-7" name="__codelineno-30-7"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-30-8" id="__codelineno-30-8" name="__codelineno-30-8"></a><span class="w"> </span><span class="o">*</span><span class="nx">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="o">*</span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-30-9" id="__codelineno-30-9" name="__codelineno-30-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">root</span><span class="p">.</span><span class="nx">Val</span><span class="p">.(</span><span class="kt">int</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-30-10" id="__codelineno-30-10" name="__codelineno-30-10"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-30-11" id="__codelineno-30-11" name="__codelineno-30-11"></a><span class="w"> </span><span class="o">*</span><span class="nx">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="o">*</span><span class="nx">res</span><span class="p">,</span><span class="w"> </span><span class="nb">append</span><span class="p">([]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">{},</span><span class="w"> </span><span class="o">*</span><span class="nx">path</span><span class="p">...))</span>
|
||
<a href="#__codelineno-30-12" id="__codelineno-30-12" name="__codelineno-30-12"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-30-13" id="__codelineno-30-13" name="__codelineno-30-13"></a><span class="w"> </span><span class="nx">preOrderIII</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">Left</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">)</span>
|
||
<a href="#__codelineno-30-14" id="__codelineno-30-14" name="__codelineno-30-14"></a><span class="w"> </span><span class="nx">preOrderIII</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">Right</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">)</span>
|
||
<a href="#__codelineno-30-15" id="__codelineno-30-15" name="__codelineno-30-15"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-30-16" id="__codelineno-30-16" name="__codelineno-30-16"></a><span class="w"> </span><span class="o">*</span><span class="nx">path</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="nx">path</span><span class="p">)[:</span><span class="nb">len</span><span class="p">(</span><span class="o">*</span><span class="nx">path</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||
<a href="#__codelineno-30-17" id="__codelineno-30-17" name="__codelineno-30-17"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.swift</span><pre><span></span><code><a href="#__codelineno-31-1" id="__codelineno-31-1" name="__codelineno-31-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-31-2" id="__codelineno-31-2" name="__codelineno-31-2"></a><span class="kd">func</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode</span><span class="p">?)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-31-3" id="__codelineno-31-3" name="__codelineno-31-3"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-31-4" id="__codelineno-31-4" name="__codelineno-31-4"></a><span class="w"> </span><span class="k">guard</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nv">root</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="n">root</span><span class="p">,</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-31-5" id="__codelineno-31-5" name="__codelineno-31-5"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-31-6" id="__codelineno-31-6" name="__codelineno-31-6"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-31-7" id="__codelineno-31-7" name="__codelineno-31-7"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-31-8" id="__codelineno-31-8" name="__codelineno-31-8"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-31-9" id="__codelineno-31-9" name="__codelineno-31-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-31-10" id="__codelineno-31-10" name="__codelineno-31-10"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-31-11" id="__codelineno-31-11" name="__codelineno-31-11"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">path</span><span class="p">)</span>
|
||
<a href="#__codelineno-31-12" id="__codelineno-31-12" name="__codelineno-31-12"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-31-13" id="__codelineno-31-13" name="__codelineno-31-13"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="kr">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-31-14" id="__codelineno-31-14" name="__codelineno-31-14"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="kr">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-31-15" id="__codelineno-31-15" name="__codelineno-31-15"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-31-16" id="__codelineno-31-16" name="__codelineno-31-16"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="bp">removeLast</span><span class="p">()</span>
|
||
<a href="#__codelineno-31-17" id="__codelineno-31-17" name="__codelineno-31-17"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.js</span><pre><span></span><code><a href="#__codelineno-32-1" id="__codelineno-32-1" name="__codelineno-32-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-32-2" id="__codelineno-32-2" name="__codelineno-32-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-32-3" id="__codelineno-32-3" name="__codelineno-32-3"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-32-4" id="__codelineno-32-4" name="__codelineno-32-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nx">root</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-32-5" id="__codelineno-32-5" name="__codelineno-32-5"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-32-6" id="__codelineno-32-6" name="__codelineno-32-6"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-32-7" id="__codelineno-32-7" name="__codelineno-32-7"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-32-8" id="__codelineno-32-8" name="__codelineno-32-8"></a><span class="w"> </span><span class="nx">path</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-32-9" id="__codelineno-32-9" name="__codelineno-32-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-32-10" id="__codelineno-32-10" name="__codelineno-32-10"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-32-11" id="__codelineno-32-11" name="__codelineno-32-11"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">([...</span><span class="nx">path</span><span class="p">]);</span>
|
||
<a href="#__codelineno-32-12" id="__codelineno-32-12" name="__codelineno-32-12"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-32-13" id="__codelineno-32-13" name="__codelineno-32-13"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">left</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-32-14" id="__codelineno-32-14" name="__codelineno-32-14"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">right</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-32-15" id="__codelineno-32-15" name="__codelineno-32-15"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-32-16" id="__codelineno-32-16" name="__codelineno-32-16"></a><span class="w"> </span><span class="nx">path</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span>
|
||
<a href="#__codelineno-32-17" id="__codelineno-32-17" name="__codelineno-32-17"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.ts</span><pre><span></span><code><a href="#__codelineno-33-1" id="__codelineno-33-1" name="__codelineno-33-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-33-2" id="__codelineno-33-2" name="__codelineno-33-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span>
|
||
<a href="#__codelineno-33-3" id="__codelineno-33-3" name="__codelineno-33-3"></a><span class="w"> </span><span class="nx">root</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span>
|
||
<a href="#__codelineno-33-4" id="__codelineno-33-4" name="__codelineno-33-4"></a><span class="w"> </span><span class="nx">path</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[],</span>
|
||
<a href="#__codelineno-33-5" id="__codelineno-33-5" name="__codelineno-33-5"></a><span class="w"> </span><span class="nx">res</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[][]</span>
|
||
<a href="#__codelineno-33-6" id="__codelineno-33-6" name="__codelineno-33-6"></a><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-33-7" id="__codelineno-33-7" name="__codelineno-33-7"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-33-8" id="__codelineno-33-8" name="__codelineno-33-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="nx">root</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-33-9" id="__codelineno-33-9" name="__codelineno-33-9"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-33-10" id="__codelineno-33-10" name="__codelineno-33-10"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-33-11" id="__codelineno-33-11" name="__codelineno-33-11"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-33-12" id="__codelineno-33-12" name="__codelineno-33-12"></a><span class="w"> </span><span class="nx">path</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-33-13" id="__codelineno-33-13" name="__codelineno-33-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-33-14" id="__codelineno-33-14" name="__codelineno-33-14"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-33-15" id="__codelineno-33-15" name="__codelineno-33-15"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">([...</span><span class="nx">path</span><span class="p">]);</span>
|
||
<a href="#__codelineno-33-16" id="__codelineno-33-16" name="__codelineno-33-16"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-33-17" id="__codelineno-33-17" name="__codelineno-33-17"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">left</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-33-18" id="__codelineno-33-18" name="__codelineno-33-18"></a><span class="w"> </span><span class="nx">preOrder</span><span class="p">(</span><span class="nx">root</span><span class="p">.</span><span class="nx">right</span><span class="p">,</span><span class="w"> </span><span class="nx">path</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-33-19" id="__codelineno-33-19" name="__codelineno-33-19"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-33-20" id="__codelineno-33-20" name="__codelineno-33-20"></a><span class="w"> </span><span class="nx">path</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span>
|
||
<a href="#__codelineno-33-21" id="__codelineno-33-21" name="__codelineno-33-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.dart</span><pre><span></span><code><a href="#__codelineno-34-1" id="__codelineno-34-1" name="__codelineno-34-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-34-2" id="__codelineno-34-2" name="__codelineno-34-2"></a><span class="kt">void</span><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span>
|
||
<a href="#__codelineno-34-3" id="__codelineno-34-3" name="__codelineno-34-3"></a><span class="w"> </span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">root</span><span class="p">,</span>
|
||
<a href="#__codelineno-34-4" id="__codelineno-34-4" name="__codelineno-34-4"></a><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">path</span><span class="p">,</span>
|
||
<a href="#__codelineno-34-5" id="__codelineno-34-5" name="__codelineno-34-5"></a><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="w"> </span><span class="n">res</span><span class="p">,</span>
|
||
<a href="#__codelineno-34-6" id="__codelineno-34-6" name="__codelineno-34-6"></a><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-34-7" id="__codelineno-34-7" name="__codelineno-34-7"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-34-8" id="__codelineno-34-8" name="__codelineno-34-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-34-9" id="__codelineno-34-9" name="__codelineno-34-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-34-10" id="__codelineno-34-10" name="__codelineno-34-10"></a>
|
||
<a href="#__codelineno-34-11" id="__codelineno-34-11" name="__codelineno-34-11"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-34-12" id="__codelineno-34-12" name="__codelineno-34-12"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">root</span><span class="p">);</span>
|
||
<a href="#__codelineno-34-13" id="__codelineno-34-13" name="__codelineno-34-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-34-14" id="__codelineno-34-14" name="__codelineno-34-14"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-34-15" id="__codelineno-34-15" name="__codelineno-34-15"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">List</span><span class="p">.</span><span class="n">from</span><span class="p">(</span><span class="n">path</span><span class="p">));</span>
|
||
<a href="#__codelineno-34-16" id="__codelineno-34-16" name="__codelineno-34-16"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-34-17" id="__codelineno-34-17" name="__codelineno-34-17"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-34-18" id="__codelineno-34-18" name="__codelineno-34-18"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="n">right</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-34-19" id="__codelineno-34-19" name="__codelineno-34-19"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-34-20" id="__codelineno-34-20" name="__codelineno-34-20"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">removeLast</span><span class="p">();</span>
|
||
<a href="#__codelineno-34-21" id="__codelineno-34-21" name="__codelineno-34-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.rs</span><pre><span></span><code><a href="#__codelineno-35-1" id="__codelineno-35-1" name="__codelineno-35-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-35-2" id="__codelineno-35-2" name="__codelineno-35-2"></a><span class="k">fn</span><span class="w"> </span><span class="nf">pre_order</span><span class="p">(</span>
|
||
<a href="#__codelineno-35-3" id="__codelineno-35-3" name="__codelineno-35-3"></a><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-35-4" id="__codelineno-35-4" name="__codelineno-35-4"></a><span class="w"> </span><span class="n">path</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-35-5" id="__codelineno-35-5" name="__codelineno-35-5"></a><span class="w"> </span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="nb">Option</span><span class="o"><&</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-35-6" id="__codelineno-35-6" name="__codelineno-35-6"></a><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-35-7" id="__codelineno-35-7" name="__codelineno-35-7"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-35-8" id="__codelineno-35-8" name="__codelineno-35-8"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">is_none</span><span class="p">()</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="n">as_ref</span><span class="p">().</span><span class="n">unwrap</span><span class="p">().</span><span class="n">borrow</span><span class="p">().</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-35-9" id="__codelineno-35-9" name="__codelineno-35-9"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-35-10" id="__codelineno-35-10" name="__codelineno-35-10"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-35-11" id="__codelineno-35-11" name="__codelineno-35-11"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="kd">let</span><span class="w"> </span><span class="nb">Some</span><span class="p">(</span><span class="n">node</span><span class="p">)</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-35-12" id="__codelineno-35-12" name="__codelineno-35-12"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-35-13" id="__codelineno-35-13" name="__codelineno-35-13"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">node</span><span class="p">.</span><span class="n">clone</span><span class="p">());</span>
|
||
<a href="#__codelineno-35-14" id="__codelineno-35-14" name="__codelineno-35-14"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-35-15" id="__codelineno-35-15" name="__codelineno-35-15"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-35-16" id="__codelineno-35-16" name="__codelineno-35-16"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">path</span><span class="p">.</span><span class="n">clone</span><span class="p">());</span>
|
||
<a href="#__codelineno-35-17" id="__codelineno-35-17" name="__codelineno-35-17"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-35-18" id="__codelineno-35-18" name="__codelineno-35-18"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">res</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">left</span><span class="p">.</span><span class="n">as_ref</span><span class="p">());</span>
|
||
<a href="#__codelineno-35-19" id="__codelineno-35-19" name="__codelineno-35-19"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">res</span><span class="p">,</span><span class="w"> </span><span class="n">path</span><span class="p">,</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="n">borrow</span><span class="p">().</span><span class="n">right</span><span class="p">.</span><span class="n">as_ref</span><span class="p">());</span>
|
||
<a href="#__codelineno-35-20" id="__codelineno-35-20" name="__codelineno-35-20"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-35-21" id="__codelineno-35-21" name="__codelineno-35-21"></a><span class="w"> </span><span class="n">path</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
|
||
<a href="#__codelineno-35-22" id="__codelineno-35-22" name="__codelineno-35-22"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-35-23" id="__codelineno-35-23" name="__codelineno-35-23"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.c</span><pre><span></span><code><a href="#__codelineno-36-1" id="__codelineno-36-1" name="__codelineno-36-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-36-2" id="__codelineno-36-2" name="__codelineno-36-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">root</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-36-3" id="__codelineno-36-3" name="__codelineno-36-3"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-36-4" id="__codelineno-36-4" name="__codelineno-36-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">root</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-36-5" id="__codelineno-36-5" name="__codelineno-36-5"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-36-6" id="__codelineno-36-6" name="__codelineno-36-6"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-36-7" id="__codelineno-36-7" name="__codelineno-36-7"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-36-8" id="__codelineno-36-8" name="__codelineno-36-8"></a><span class="w"> </span><span class="n">path</span><span class="p">[</span><span class="n">pathSize</span><span class="o">++</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">root</span><span class="p">;</span>
|
||
<a href="#__codelineno-36-9" id="__codelineno-36-9" name="__codelineno-36-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-36-10" id="__codelineno-36-10" name="__codelineno-36-10"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-36-11" id="__codelineno-36-11" name="__codelineno-36-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">pathSize</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-36-12" id="__codelineno-36-12" name="__codelineno-36-12"></a><span class="w"> </span><span class="n">res</span><span class="p">[</span><span class="n">resSize</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
|
||
<a href="#__codelineno-36-13" id="__codelineno-36-13" name="__codelineno-36-13"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-36-14" id="__codelineno-36-14" name="__codelineno-36-14"></a><span class="w"> </span><span class="n">resSize</span><span class="o">++</span><span class="p">;</span>
|
||
<a href="#__codelineno-36-15" id="__codelineno-36-15" name="__codelineno-36-15"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-36-16" id="__codelineno-36-16" name="__codelineno-36-16"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">left</span><span class="p">);</span>
|
||
<a href="#__codelineno-36-17" id="__codelineno-36-17" name="__codelineno-36-17"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="o">-></span><span class="n">right</span><span class="p">);</span>
|
||
<a href="#__codelineno-36-18" id="__codelineno-36-18" name="__codelineno-36-18"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-36-19" id="__codelineno-36-19" name="__codelineno-36-19"></a><span class="w"> </span><span class="n">pathSize</span><span class="o">--</span><span class="p">;</span>
|
||
<a href="#__codelineno-36-20" id="__codelineno-36-20" name="__codelineno-36-20"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.kt</span><pre><span></span><code><a href="#__codelineno-37-1" id="__codelineno-37-1" name="__codelineno-37-1"></a><span class="cm">/* 전위 순회: 예제 3 */</span>
|
||
<a href="#__codelineno-37-2" id="__codelineno-37-2" name="__codelineno-37-2"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode?</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-37-3" id="__codelineno-37-3" name="__codelineno-37-3"></a><span class="w"> </span><span class="c1">// 가지치기</span>
|
||
<a href="#__codelineno-37-4" id="__codelineno-37-4" name="__codelineno-37-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">root</span><span class="p">.</span><span class="na">_val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">3</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-37-5" id="__codelineno-37-5" name="__codelineno-37-5"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-37-6" id="__codelineno-37-6" name="__codelineno-37-6"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-37-7" id="__codelineno-37-7" name="__codelineno-37-7"></a><span class="w"> </span><span class="c1">// 시도</span>
|
||
<a href="#__codelineno-37-8" id="__codelineno-37-8" name="__codelineno-37-8"></a><span class="w"> </span><span class="n">path</span><span class="o">!!</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-37-9" id="__codelineno-37-9" name="__codelineno-37-9"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">_val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">7</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-37-10" id="__codelineno-37-10" name="__codelineno-37-10"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-37-11" id="__codelineno-37-11" name="__codelineno-37-11"></a><span class="w"> </span><span class="n">res</span><span class="o">!!</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">path</span><span class="o">!!</span><span class="p">.</span><span class="na">toMutableList</span><span class="p">())</span>
|
||
<a href="#__codelineno-37-12" id="__codelineno-37-12" name="__codelineno-37-12"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-37-13" id="__codelineno-37-13" name="__codelineno-37-13"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-37-14" id="__codelineno-37-14" name="__codelineno-37-14"></a><span class="w"> </span><span class="n">preOrder</span><span class="p">(</span><span class="n">root</span><span class="p">.</span><span class="na">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-37-15" id="__codelineno-37-15" name="__codelineno-37-15"></a><span class="w"> </span><span class="c1">// 되돌리기</span>
|
||
<a href="#__codelineno-37-16" id="__codelineno-37-16" name="__codelineno-37-16"></a><span class="w"> </span><span class="n">path</span><span class="o">!!</span><span class="p">.</span><span class="na">removeAt</span><span class="p">(</span><span class="n">path</span><span class="o">!!</span><span class="p">.</span><span class="na">size</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="p">)</span>
|
||
<a href="#__codelineno-37-17" id="__codelineno-37-17" name="__codelineno-37-17"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_compact.rb</span><pre><span></span><code><a href="#__codelineno-38-1" id="__codelineno-38-1" name="__codelineno-38-1"></a><span class="c1">### 전위 순회: 예제 3 ###</span>
|
||
<a href="#__codelineno-38-2" id="__codelineno-38-2" name="__codelineno-38-2"></a><span class="k">def</span><span class="w"> </span><span class="nf">pre_order</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-38-3" id="__codelineno-38-3" name="__codelineno-38-3"></a><span class="w"> </span><span class="c1"># 가지치기</span>
|
||
<a href="#__codelineno-38-4" id="__codelineno-38-4" name="__codelineno-38-4"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="o">!</span><span class="n">root</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="n">root</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">3</span>
|
||
<a href="#__codelineno-38-5" id="__codelineno-38-5" name="__codelineno-38-5"></a>
|
||
<a href="#__codelineno-38-6" id="__codelineno-38-6" name="__codelineno-38-6"></a><span class="w"> </span><span class="c1"># 시도</span>
|
||
<a href="#__codelineno-38-7" id="__codelineno-38-7" name="__codelineno-38-7"></a><span class="w"> </span><span class="vg">$path</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">root</span><span class="p">)</span>
|
||
<a href="#__codelineno-38-8" id="__codelineno-38-8" name="__codelineno-38-8"></a>
|
||
<a href="#__codelineno-38-9" id="__codelineno-38-9" name="__codelineno-38-9"></a><span class="w"> </span><span class="c1"># 해를 기록한다</span>
|
||
<a href="#__codelineno-38-10" id="__codelineno-38-10" name="__codelineno-38-10"></a><span class="w"> </span><span class="vg">$res</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="vg">$path</span><span class="o">.</span><span class="n">dup</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">root</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span>
|
||
<a href="#__codelineno-38-11" id="__codelineno-38-11" name="__codelineno-38-11"></a>
|
||
<a href="#__codelineno-38-12" id="__codelineno-38-12" name="__codelineno-38-12"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
|
||
<a href="#__codelineno-38-13" id="__codelineno-38-13" name="__codelineno-38-13"></a><span class="w"> </span><span class="n">pre_order</span><span class="p">(</span><span class="n">root</span><span class="o">.</span><span class="n">right</span><span class="p">)</span>
|
||
<a href="#__codelineno-38-14" id="__codelineno-38-14" name="__codelineno-38-14"></a>
|
||
<a href="#__codelineno-38-15" id="__codelineno-38-15" name="__codelineno-38-15"></a><span class="w"> </span><span class="c1"># 되돌리기</span>
|
||
<a href="#__codelineno-38-16" id="__codelineno-38-16" name="__codelineno-38-16"></a><span class="w"> </span><span class="vg">$path</span><span class="o">.</span><span class="n">pop</span>
|
||
<a href="#__codelineno-38-17" id="__codelineno-38-17" name="__codelineno-38-17"></a><span class="k">end</span>
|
||
</code></pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<details class="pythontutor">
|
||
<summary>코드 시각화</summary>
|
||
<p><div style="height: 549px; width: 100%;"><iframe class="pythontutor-iframe" src="https://pythontutor.com/iframe-embed.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%20%EB%85%B8%EB%93%9C%20%ED%81%B4%EB%9E%98%EC%8A%A4%22%22%22%0A%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%EB%85%B8%EB%93%9C%20%EA%B0%92%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%99%BC%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D,%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%3A%20%EC%9E%AC%EA%B7%80%22%22%22%0A%20%20%20%20%23%20%EC%9D%B8%EB%8D%B1%EC%8A%A4%EA%B0%80%20%EB%B0%B0%EC%97%B4%20%EA%B8%B8%EC%9D%B4%EB%A5%BC%20%EB%B2%97%EC%96%B4%EB%82%98%EA%B1%B0%EB%82%98%20%ED%95%B4%EB%8B%B9%20%EC%9B%90%EC%86%8C%EA%B0%80%20None%EC%9D%B4%EB%A9%B4%20None%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%ED%98%84%EC%9E%AC%20%EB%85%B8%EB%93%9C%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20%23%20%EC%99%BC%EC%AA%BD%EA%B3%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%84%9C%EB%B8%8C%ED%8A%B8%EB%A6%AC%EB%A5%BC%20%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%22%22%22%0A%20%20%20%20return%20list_to_tree_dfs%28arr,%200%29%0A%0A%0Adef%20pre_order%28root%3A%20TreeNode%29%3A%0A%20%20%20%20%22%22%22%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%3A%20%EC%98%88%EC%A0%9C%203%22%22%22%0A%20%20%20%20%23%20%EA%B0%80%EC%A7%80%EC%B9%98%EA%B8%B0%0A%20%20%20%20if%20root%20is%20None%20or%20root.val%20%3D%3D%203%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%EC%8B%9C%EB%8F%84%0A%20%20%20%20path.append%28root%29%0A%20%20%20%20if%20root.val%20%3D%3D%207%3A%0A%20%20%20%20%20%20%20%20%23%20%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%0A%20%20%20%20%20%20%20%20res.append%28list%28path%29%29%0A%20%20%20%20pre_order%28root.left%29%0A%20%20%20%20pre_order%28root.right%29%0A%20%20%20%20%23%20%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0%0A%20%20%20%20path.pop%28%29%0A%0A%0A%22%22%22%EC%8B%A4%ED%96%89%20%EC%BD%94%EB%93%9C%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1,%207,%203,%204,%205,%206,%207%5D%29%0A%0A%20%20%20%20%23%20%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%0A%20%20%20%20path%20%3D%20list%5BTreeNode%5D%28%29%0A%20%20%20%20res%20%3D%20list%5Blist%5BTreeNode%5D%5D%28%29%0A%20%20%20%20pre_order%28root%29%0A%0A%20%20%20%20print%28%22%5Cn%EB%A3%A8%ED%8A%B8%20%EB%85%B8%EB%93%9C%EC%97%90%EC%84%9C%20%EB%85%B8%EB%93%9C%207%EA%B9%8C%EC%A7%80%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EA%B2%BD%EB%A1%9C%20%EC%B6%9C%EB%A0%A5.%20%EA%B2%BD%EB%A1%9C%EC%97%90%EB%8A%94%20%EA%B0%92%EC%9D%B4%203%EC%9D%B8%20%EB%85%B8%EB%93%9C%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8A%94%EB%8B%A4%22%29%0A%20%20%20%20for%20path%20in%20res%3A%0A%20%20%20%20%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20path%5D%29&codeDivHeight=472&codeDivWidth=350&cumulative=false&curInstr=126&heapPrimitives=nevernest&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false" title="코드 시각화"> </iframe></div>
|
||
<div style="margin-top: 5px;"><a href="https://pythontutor.com/iframe-embed.html#code=class%20TreeNode%3A%0A%20%20%20%20%22%22%22%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%20%EB%85%B8%EB%93%9C%20%ED%81%B4%EB%9E%98%EC%8A%A4%22%22%22%0A%0A%20%20%20%20def%20__init__%28self,%20val%3A%20int%20%3D%200%29%3A%0A%20%20%20%20%20%20%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%EB%85%B8%EB%93%9C%20%EA%B0%92%0A%20%20%20%20%20%20%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%99%BC%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%20%20%20%20%20%20%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D,%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%3A%20%EC%9E%AC%EA%B7%80%22%22%22%0A%20%20%20%20%23%20%EC%9D%B8%EB%8D%B1%EC%8A%A4%EA%B0%80%20%EB%B0%B0%EC%97%B4%20%EA%B8%B8%EC%9D%B4%EB%A5%BC%20%EB%B2%97%EC%96%B4%EB%82%98%EA%B1%B0%EB%82%98%20%ED%95%B4%EB%8B%B9%20%EC%9B%90%EC%86%8C%EA%B0%80%20None%EC%9D%B4%EB%A9%B4%20None%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4%0A%20%20%20%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20%20%20%20%20%20%20return%20None%0A%20%20%20%20%23%20%ED%98%84%EC%9E%AC%20%EB%85%B8%EB%93%9C%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%20%20%20%23%20%EC%99%BC%EC%AA%BD%EA%B3%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%84%9C%EB%B8%8C%ED%8A%B8%EB%A6%AC%EB%A5%BC%20%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20%20%20%20root.left%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%201%29%0A%20%20%20%20root.right%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%202%29%0A%20%20%20%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%20%20%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%22%22%22%0A%20%20%20%20return%20list_to_tree_dfs%28arr,%200%29%0A%0A%0Adef%20pre_order%28root%3A%20TreeNode%29%3A%0A%20%20%20%20%22%22%22%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%3A%20%EC%98%88%EC%A0%9C%203%22%22%22%0A%20%20%20%20%23%20%EA%B0%80%EC%A7%80%EC%B9%98%EA%B8%B0%0A%20%20%20%20if%20root%20is%20None%20or%20root.val%20%3D%3D%203%3A%0A%20%20%20%20%20%20%20%20return%0A%20%20%20%20%23%20%EC%8B%9C%EB%8F%84%0A%20%20%20%20path.append%28root%29%0A%20%20%20%20if%20root.val%20%3D%3D%207%3A%0A%20%20%20%20%20%20%20%20%23%20%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%0A%20%20%20%20%20%20%20%20res.append%28list%28path%29%29%0A%20%20%20%20pre_order%28root.left%29%0A%20%20%20%20pre_order%28root.right%29%0A%20%20%20%20%23%20%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0%0A%20%20%20%20path.pop%28%29%0A%0A%0A%22%22%22%EC%8B%A4%ED%96%89%20%EC%BD%94%EB%93%9C%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20root%20%3D%20list_to_tree%28%5B1,%207,%203,%204,%205,%206,%207%5D%29%0A%0A%20%20%20%20%23%20%EC%A0%84%EC%9C%84%20%EC%88%9C%ED%9A%8C%0A%20%20%20%20path%20%3D%20list%5BTreeNode%5D%28%29%0A%20%20%20%20res%20%3D%20list%5Blist%5BTreeNode%5D%5D%28%29%0A%20%20%20%20pre_order%28root%29%0A%0A%20%20%20%20print%28%22%5Cn%EB%A3%A8%ED%8A%B8%20%EB%85%B8%EB%93%9C%EC%97%90%EC%84%9C%20%EB%85%B8%EB%93%9C%207%EA%B9%8C%EC%A7%80%EC%9D%98%20%EB%AA%A8%EB%93%A0%20%EA%B2%BD%EB%A1%9C%20%EC%B6%9C%EB%A0%A5.%20%EA%B2%BD%EB%A1%9C%EC%97%90%EB%8A%94%20%EA%B0%92%EC%9D%B4%203%EC%9D%B8%20%EB%85%B8%EB%93%9C%EA%B0%80%20%ED%8F%AC%ED%95%A8%EB%90%98%EC%A7%80%20%EC%95%8A%EB%8A%94%EB%8B%A4%22%29%0A%20%20%20%20for%20path%20in%20res%3A%0A%20%20%20%20%20%20%20%20print%28%5Bnode.val%20for%20node%20in%20path%5D%29&codeDivHeight=800&codeDivWidth=600&cumulative=false&curInstr=126&heapPrimitives=nevernest&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false" rel="noopener noreferrer" target="_blank">전체 화면 ></a></div></p>
|
||
</details>
|
||
<p>'가지치기'는 매우 직관적인 이름이다. 아래 그림(13-3)과 같이 탐색 중 <strong>제약 조건을 만족하지 않는 탐색 가지를 '잘라 내어'</strong> 의미 없는 시도를 많이 피하고 탐색 효율을 높인다.</p>
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_constrained_paths.png" data-dark-src="/assets/figure-svg/figures/64569bb8bbc37071fa07547b.json" data-src="/assets/figure-svg/figures/cf19f39790a9f6b90e2ce27d.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_constrained_paths.svg" data-theme="light" tabindex="-1" type="image/svg+xml">제약 조건에 따른 가지치기</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/preorder_find_constrained_paths.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">제약 조건에 따른 가지치기</object></ha-svg-figure></p>
|
||
<p align="center"> 그림 13-3 제약 조건에 따른 가지치기 </p>
|
||
<h2 id="1313">13.1.3 기본 틀 코드<a class="headerlink" href="#1313" title="고유 링크">¶</a></h2>
|
||
<p>이제 백트래킹의 '시도, 되돌리기, 가지치기'라는 기본 틀을 추출하여 코드의 범용성을 높여 보자.</p>
|
||
<p>아래 기본 틀 코드에서 <code>state</code>는 문제의 현재 상태를, <code>choices</code>는 그 상태에서 가능한 선택들을 나타낸다.</p>
|
||
<div class="tabbed-set tabbed-alternate" data-tabs="5:13"><input checked="checked" id="__tabbed_5_1" name="__tabbed_5" type="radio"/><input id="__tabbed_5_2" name="__tabbed_5" type="radio"/><input id="__tabbed_5_3" name="__tabbed_5" type="radio"/><input id="__tabbed_5_4" name="__tabbed_5" type="radio"/><input id="__tabbed_5_5" name="__tabbed_5" type="radio"/><input id="__tabbed_5_6" name="__tabbed_5" type="radio"/><input id="__tabbed_5_7" name="__tabbed_5" type="radio"/><input id="__tabbed_5_8" name="__tabbed_5" type="radio"/><input id="__tabbed_5_9" name="__tabbed_5" type="radio"/><input id="__tabbed_5_10" name="__tabbed_5" type="radio"/><input id="__tabbed_5_11" name="__tabbed_5" type="radio"/><input id="__tabbed_5_12" name="__tabbed_5" type="radio"/><input id="__tabbed_5_13" name="__tabbed_5" type="radio"/><div class="tabbed-labels"><label for="__tabbed_5_1">Python</label><label for="__tabbed_5_2">C++</label><label for="__tabbed_5_3">Java</label><label for="__tabbed_5_4">C#</label><label for="__tabbed_5_5">Go</label><label for="__tabbed_5_6">Swift</label><label for="__tabbed_5_7">JS</label><label for="__tabbed_5_8">TS</label><label for="__tabbed_5_9">Dart</label><label for="__tabbed_5_10">Rust</label><label for="__tabbed_5_11">C</label><label for="__tabbed_5_12">Kotlin</label><label for="__tabbed_5_13">Ruby</label></div>
|
||
<div class="tabbed-content">
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-39-1" id="__codelineno-39-1" name="__codelineno-39-1"></a><span class="k">def</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="n">State</span><span class="p">,</span> <span class="n">choices</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">choice</span><span class="p">],</span> <span class="n">res</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">state</span><span class="p">]):</span>
|
||
<a href="#__codelineno-39-2" id="__codelineno-39-2" name="__codelineno-39-2"></a><span class="w"> </span><span class="sd">"""백트래킹 알고리즘의 기본 틀"""</span>
|
||
<a href="#__codelineno-39-3" id="__codelineno-39-3" name="__codelineno-39-3"></a> <span class="c1"># 해인지 확인</span>
|
||
<a href="#__codelineno-39-4" id="__codelineno-39-4" name="__codelineno-39-4"></a> <span class="k">if</span> <span class="n">is_solution</span><span class="p">(</span><span class="n">state</span><span class="p">):</span>
|
||
<a href="#__codelineno-39-5" id="__codelineno-39-5" name="__codelineno-39-5"></a> <span class="c1"># 해 기록</span>
|
||
<a href="#__codelineno-39-6" id="__codelineno-39-6" name="__codelineno-39-6"></a> <span class="n">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-39-7" id="__codelineno-39-7" name="__codelineno-39-7"></a> <span class="c1"># 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-39-8" id="__codelineno-39-8" name="__codelineno-39-8"></a> <span class="k">return</span>
|
||
<a href="#__codelineno-39-9" id="__codelineno-39-9" name="__codelineno-39-9"></a> <span class="c1"># 모든 선택지 순회</span>
|
||
<a href="#__codelineno-39-10" id="__codelineno-39-10" name="__codelineno-39-10"></a> <span class="k">for</span> <span class="n">choice</span> <span class="ow">in</span> <span class="n">choices</span><span class="p">:</span>
|
||
<a href="#__codelineno-39-11" id="__codelineno-39-11" name="__codelineno-39-11"></a> <span class="c1"># 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-39-12" id="__codelineno-39-12" name="__codelineno-39-12"></a> <span class="k">if</span> <span class="n">is_valid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">):</span>
|
||
<a href="#__codelineno-39-13" id="__codelineno-39-13" name="__codelineno-39-13"></a> <span class="c1"># 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-39-14" id="__codelineno-39-14" name="__codelineno-39-14"></a> <span class="n">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-39-15" id="__codelineno-39-15" name="__codelineno-39-15"></a> <span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choices</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-39-16" id="__codelineno-39-16" name="__codelineno-39-16"></a> <span class="c1"># 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-39-17" id="__codelineno-39-17" name="__codelineno-39-17"></a> <span class="n">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">)</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-40-1" id="__codelineno-40-1" name="__codelineno-40-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-40-2" id="__codelineno-40-2" name="__codelineno-40-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">State</span><span class="w"> </span><span class="o">*</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">vector</span><span class="o"><</span><span class="n">Choice</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="o">&</span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">vector</span><span class="o"><</span><span class="n">State</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="o">&</span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-40-3" id="__codelineno-40-3" name="__codelineno-40-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-40-4" id="__codelineno-40-4" name="__codelineno-40-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-40-5" id="__codelineno-40-5" name="__codelineno-40-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-40-6" id="__codelineno-40-6" name="__codelineno-40-6"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-40-7" id="__codelineno-40-7" name="__codelineno-40-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-40-8" id="__codelineno-40-8" name="__codelineno-40-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-40-9" id="__codelineno-40-9" name="__codelineno-40-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-40-10" id="__codelineno-40-10" name="__codelineno-40-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-40-11" id="__codelineno-40-11" name="__codelineno-40-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Choice</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-40-12" id="__codelineno-40-12" name="__codelineno-40-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-40-13" id="__codelineno-40-13" name="__codelineno-40-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-40-14" id="__codelineno-40-14" name="__codelineno-40-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-40-15" id="__codelineno-40-15" name="__codelineno-40-15"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-40-16" id="__codelineno-40-16" name="__codelineno-40-16"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-40-17" id="__codelineno-40-17" name="__codelineno-40-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-40-18" id="__codelineno-40-18" name="__codelineno-40-18"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-40-19" id="__codelineno-40-19" name="__codelineno-40-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-40-20" id="__codelineno-40-20" name="__codelineno-40-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-40-21" id="__codelineno-40-21" name="__codelineno-40-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-41-1" id="__codelineno-41-1" name="__codelineno-41-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-41-2" id="__codelineno-41-2" name="__codelineno-41-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">State</span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">Choice</span><span class="o">></span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">State</span><span class="o">></span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-41-3" id="__codelineno-41-3" name="__codelineno-41-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-41-4" id="__codelineno-41-4" name="__codelineno-41-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-41-5" id="__codelineno-41-5" name="__codelineno-41-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-41-6" id="__codelineno-41-6" name="__codelineno-41-6"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-41-7" id="__codelineno-41-7" name="__codelineno-41-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-41-8" id="__codelineno-41-8" name="__codelineno-41-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-41-9" id="__codelineno-41-9" name="__codelineno-41-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-41-10" id="__codelineno-41-10" name="__codelineno-41-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-41-11" id="__codelineno-41-11" name="__codelineno-41-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Choice</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-41-12" id="__codelineno-41-12" name="__codelineno-41-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-41-13" id="__codelineno-41-13" name="__codelineno-41-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-41-14" id="__codelineno-41-14" name="__codelineno-41-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-41-15" id="__codelineno-41-15" name="__codelineno-41-15"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-41-16" id="__codelineno-41-16" name="__codelineno-41-16"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-41-17" id="__codelineno-41-17" name="__codelineno-41-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-41-18" id="__codelineno-41-18" name="__codelineno-41-18"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-41-19" id="__codelineno-41-19" name="__codelineno-41-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-41-20" id="__codelineno-41-20" name="__codelineno-41-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-41-21" id="__codelineno-41-21" name="__codelineno-41-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-42-1" id="__codelineno-42-1" name="__codelineno-42-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-42-2" id="__codelineno-42-2" name="__codelineno-42-2"></a><span class="k">void</span><span class="w"> </span><span class="nf">Backtrack</span><span class="p">(</span><span class="n">State</span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">Choice</span><span class="o">></span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">State</span><span class="o">></span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-42-3" id="__codelineno-42-3" name="__codelineno-42-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-42-4" id="__codelineno-42-4" name="__codelineno-42-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">IsSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-42-5" id="__codelineno-42-5" name="__codelineno-42-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-42-6" id="__codelineno-42-6" name="__codelineno-42-6"></a><span class="w"> </span><span class="n">RecordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-42-7" id="__codelineno-42-7" name="__codelineno-42-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-42-8" id="__codelineno-42-8" name="__codelineno-42-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-42-9" id="__codelineno-42-9" name="__codelineno-42-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-42-10" id="__codelineno-42-10" name="__codelineno-42-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-42-11" id="__codelineno-42-11" name="__codelineno-42-11"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">Choice</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-42-12" id="__codelineno-42-12" name="__codelineno-42-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-42-13" id="__codelineno-42-13" name="__codelineno-42-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">IsValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-42-14" id="__codelineno-42-14" name="__codelineno-42-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-42-15" id="__codelineno-42-15" name="__codelineno-42-15"></a><span class="w"> </span><span class="n">MakeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-42-16" id="__codelineno-42-16" name="__codelineno-42-16"></a><span class="w"> </span><span class="n">Backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-42-17" id="__codelineno-42-17" name="__codelineno-42-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-42-18" id="__codelineno-42-18" name="__codelineno-42-18"></a><span class="w"> </span><span class="n">UndoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-42-19" id="__codelineno-42-19" name="__codelineno-42-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-42-20" id="__codelineno-42-20" name="__codelineno-42-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-42-21" id="__codelineno-42-21" name="__codelineno-42-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-43-1" id="__codelineno-43-1" name="__codelineno-43-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-43-2" id="__codelineno-43-2" name="__codelineno-43-2"></a><span class="kd">func</span><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span><span class="nx">state</span><span class="w"> </span><span class="o">*</span><span class="nx">State</span><span class="p">,</span><span class="w"> </span><span class="nx">choices</span><span class="w"> </span><span class="p">[]</span><span class="nx">Choice</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="nx">State</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-43-3" id="__codelineno-43-3" name="__codelineno-43-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-43-4" id="__codelineno-43-4" name="__codelineno-43-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">isSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-43-5" id="__codelineno-43-5" name="__codelineno-43-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-43-6" id="__codelineno-43-6" name="__codelineno-43-6"></a><span class="w"> </span><span class="nx">recordSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-43-7" id="__codelineno-43-7" name="__codelineno-43-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-43-8" id="__codelineno-43-8" name="__codelineno-43-8"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-43-9" id="__codelineno-43-9" name="__codelineno-43-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-43-10" id="__codelineno-43-10" name="__codelineno-43-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-43-11" id="__codelineno-43-11" name="__codelineno-43-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="nx">choices</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-43-12" id="__codelineno-43-12" name="__codelineno-43-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-43-13" id="__codelineno-43-13" name="__codelineno-43-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">isValid</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-43-14" id="__codelineno-43-14" name="__codelineno-43-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-43-15" id="__codelineno-43-15" name="__codelineno-43-15"></a><span class="w"> </span><span class="nx">makeChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-43-16" id="__codelineno-43-16" name="__codelineno-43-16"></a><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choices</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-43-17" id="__codelineno-43-17" name="__codelineno-43-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-43-18" id="__codelineno-43-18" name="__codelineno-43-18"></a><span class="w"> </span><span class="nx">undoChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-43-19" id="__codelineno-43-19" name="__codelineno-43-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-43-20" id="__codelineno-43-20" name="__codelineno-43-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-43-21" id="__codelineno-43-21" name="__codelineno-43-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-44-1" id="__codelineno-44-1" name="__codelineno-44-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-44-2" id="__codelineno-44-2" name="__codelineno-44-2"></a><span class="kd">func</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kr">inout</span><span class="w"> </span><span class="n">State</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="n">Choice</span><span class="p">],</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="kr">inout</span><span class="w"> </span><span class="p">[</span><span class="n">State</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-44-3" id="__codelineno-44-3" name="__codelineno-44-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-44-4" id="__codelineno-44-4" name="__codelineno-44-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-44-5" id="__codelineno-44-5" name="__codelineno-44-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-44-6" id="__codelineno-44-6" name="__codelineno-44-6"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-44-7" id="__codelineno-44-7" name="__codelineno-44-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-44-8" id="__codelineno-44-8" name="__codelineno-44-8"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-44-9" id="__codelineno-44-9" name="__codelineno-44-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-44-10" id="__codelineno-44-10" name="__codelineno-44-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-44-11" id="__codelineno-44-11" name="__codelineno-44-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-44-12" id="__codelineno-44-12" name="__codelineno-44-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-44-13" id="__codelineno-44-13" name="__codelineno-44-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-44-14" id="__codelineno-44-14" name="__codelineno-44-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-44-15" id="__codelineno-44-15" name="__codelineno-44-15"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-44-16" id="__codelineno-44-16" name="__codelineno-44-16"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">:</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-44-17" id="__codelineno-44-17" name="__codelineno-44-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-44-18" id="__codelineno-44-18" name="__codelineno-44-18"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-44-19" id="__codelineno-44-19" name="__codelineno-44-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-44-20" id="__codelineno-44-20" name="__codelineno-44-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-44-21" id="__codelineno-44-21" name="__codelineno-44-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-45-1" id="__codelineno-45-1" name="__codelineno-45-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-45-2" id="__codelineno-45-2" name="__codelineno-45-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choices</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-45-3" id="__codelineno-45-3" name="__codelineno-45-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-45-4" id="__codelineno-45-4" name="__codelineno-45-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">isSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-45-5" id="__codelineno-45-5" name="__codelineno-45-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-45-6" id="__codelineno-45-6" name="__codelineno-45-6"></a><span class="w"> </span><span class="nx">recordSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-45-7" id="__codelineno-45-7" name="__codelineno-45-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-45-8" id="__codelineno-45-8" name="__codelineno-45-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-45-9" id="__codelineno-45-9" name="__codelineno-45-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-45-10" id="__codelineno-45-10" name="__codelineno-45-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-45-11" id="__codelineno-45-11" name="__codelineno-45-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">let</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-45-12" id="__codelineno-45-12" name="__codelineno-45-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-45-13" id="__codelineno-45-13" name="__codelineno-45-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">isValid</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-45-14" id="__codelineno-45-14" name="__codelineno-45-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-45-15" id="__codelineno-45-15" name="__codelineno-45-15"></a><span class="w"> </span><span class="nx">makeChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-45-16" id="__codelineno-45-16" name="__codelineno-45-16"></a><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choices</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-45-17" id="__codelineno-45-17" name="__codelineno-45-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-45-18" id="__codelineno-45-18" name="__codelineno-45-18"></a><span class="w"> </span><span class="nx">undoChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-45-19" id="__codelineno-45-19" name="__codelineno-45-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-45-20" id="__codelineno-45-20" name="__codelineno-45-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-45-21" id="__codelineno-45-21" name="__codelineno-45-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-46-1" id="__codelineno-46-1" name="__codelineno-46-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-46-2" id="__codelineno-46-2" name="__codelineno-46-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span><span class="nx">state</span><span class="o">:</span><span class="w"> </span><span class="kt">State</span><span class="p">,</span><span class="w"> </span><span class="nx">choices</span><span class="o">:</span><span class="w"> </span><span class="kt">Choice</span><span class="p">[],</span><span class="w"> </span><span class="nx">res</span><span class="o">:</span><span class="w"> </span><span class="kt">State</span><span class="p">[])</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-46-3" id="__codelineno-46-3" name="__codelineno-46-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-46-4" id="__codelineno-46-4" name="__codelineno-46-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">isSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-46-5" id="__codelineno-46-5" name="__codelineno-46-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-46-6" id="__codelineno-46-6" name="__codelineno-46-6"></a><span class="w"> </span><span class="nx">recordSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-46-7" id="__codelineno-46-7" name="__codelineno-46-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-46-8" id="__codelineno-46-8" name="__codelineno-46-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-46-9" id="__codelineno-46-9" name="__codelineno-46-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-46-10" id="__codelineno-46-10" name="__codelineno-46-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-46-11" id="__codelineno-46-11" name="__codelineno-46-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">let</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-46-12" id="__codelineno-46-12" name="__codelineno-46-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-46-13" id="__codelineno-46-13" name="__codelineno-46-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">isValid</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-46-14" id="__codelineno-46-14" name="__codelineno-46-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-46-15" id="__codelineno-46-15" name="__codelineno-46-15"></a><span class="w"> </span><span class="nx">makeChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-46-16" id="__codelineno-46-16" name="__codelineno-46-16"></a><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choices</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-46-17" id="__codelineno-46-17" name="__codelineno-46-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-46-18" id="__codelineno-46-18" name="__codelineno-46-18"></a><span class="w"> </span><span class="nx">undoChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-46-19" id="__codelineno-46-19" name="__codelineno-46-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-46-20" id="__codelineno-46-20" name="__codelineno-46-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-46-21" id="__codelineno-46-21" name="__codelineno-46-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-47-1" id="__codelineno-47-1" name="__codelineno-47-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-47-2" id="__codelineno-47-2" name="__codelineno-47-2"></a><span class="kt">void</span><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">State</span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">Choice</span><span class="o">></span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">State</span><span class="o">></span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-47-3" id="__codelineno-47-3" name="__codelineno-47-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-47-4" id="__codelineno-47-4" name="__codelineno-47-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-47-5" id="__codelineno-47-5" name="__codelineno-47-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-47-6" id="__codelineno-47-6" name="__codelineno-47-6"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-47-7" id="__codelineno-47-7" name="__codelineno-47-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-47-8" id="__codelineno-47-8" name="__codelineno-47-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-47-9" id="__codelineno-47-9" name="__codelineno-47-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-47-10" id="__codelineno-47-10" name="__codelineno-47-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-47-11" id="__codelineno-47-11" name="__codelineno-47-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">Choice</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-47-12" id="__codelineno-47-12" name="__codelineno-47-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-47-13" id="__codelineno-47-13" name="__codelineno-47-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-47-14" id="__codelineno-47-14" name="__codelineno-47-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-47-15" id="__codelineno-47-15" name="__codelineno-47-15"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-47-16" id="__codelineno-47-16" name="__codelineno-47-16"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-47-17" id="__codelineno-47-17" name="__codelineno-47-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-47-18" id="__codelineno-47-18" name="__codelineno-47-18"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-47-19" id="__codelineno-47-19" name="__codelineno-47-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-47-20" id="__codelineno-47-20" name="__codelineno-47-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-47-21" id="__codelineno-47-21" name="__codelineno-47-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-48-1" id="__codelineno-48-1" name="__codelineno-48-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-48-2" id="__codelineno-48-2" name="__codelineno-48-2"></a><span class="k">fn</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="n">State</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nb">Vec</span><span class="o"><</span><span class="n">Choice</span><span class="o">></span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">State</span><span class="o">></span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-48-3" id="__codelineno-48-3" name="__codelineno-48-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-48-4" id="__codelineno-48-4" name="__codelineno-48-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_solution</span><span class="p">(</span><span class="n">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-48-5" id="__codelineno-48-5" name="__codelineno-48-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-48-6" id="__codelineno-48-6" name="__codelineno-48-6"></a><span class="w"> </span><span class="n">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-48-7" id="__codelineno-48-7" name="__codelineno-48-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-48-8" id="__codelineno-48-8" name="__codelineno-48-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-48-9" id="__codelineno-48-9" name="__codelineno-48-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-48-10" id="__codelineno-48-10" name="__codelineno-48-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-48-11" id="__codelineno-48-11" name="__codelineno-48-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-48-12" id="__codelineno-48-12" name="__codelineno-48-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-48-13" id="__codelineno-48-13" name="__codelineno-48-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_valid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-48-14" id="__codelineno-48-14" name="__codelineno-48-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-48-15" id="__codelineno-48-15" name="__codelineno-48-15"></a><span class="w"> </span><span class="n">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-48-16" id="__codelineno-48-16" name="__codelineno-48-16"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-48-17" id="__codelineno-48-17" name="__codelineno-48-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-48-18" id="__codelineno-48-18" name="__codelineno-48-18"></a><span class="w"> </span><span class="n">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-48-19" id="__codelineno-48-19" name="__codelineno-48-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-48-20" id="__codelineno-48-20" name="__codelineno-48-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-48-21" id="__codelineno-48-21" name="__codelineno-48-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-49-1" id="__codelineno-49-1" name="__codelineno-49-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-49-2" id="__codelineno-49-2" name="__codelineno-49-2"></a><span class="kt">void</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">State</span><span class="w"> </span><span class="o">*</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">Choice</span><span class="w"> </span><span class="o">*</span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">numChoices</span><span class="p">,</span><span class="w"> </span><span class="n">State</span><span class="w"> </span><span class="o">*</span><span class="n">res</span><span class="p">,</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">numRes</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-49-3" id="__codelineno-49-3" name="__codelineno-49-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-49-4" id="__codelineno-49-4" name="__codelineno-49-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-49-5" id="__codelineno-49-5" name="__codelineno-49-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-49-6" id="__codelineno-49-6" name="__codelineno-49-6"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">,</span><span class="w"> </span><span class="n">numRes</span><span class="p">);</span>
|
||
<a href="#__codelineno-49-7" id="__codelineno-49-7" name="__codelineno-49-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-49-8" id="__codelineno-49-8" name="__codelineno-49-8"></a><span class="w"> </span><span class="k">return</span><span class="p">;</span>
|
||
<a href="#__codelineno-49-9" id="__codelineno-49-9" name="__codelineno-49-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-49-10" id="__codelineno-49-10" name="__codelineno-49-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-49-11" id="__codelineno-49-11" name="__codelineno-49-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">numChoices</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-49-12" id="__codelineno-49-12" name="__codelineno-49-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-49-13" id="__codelineno-49-13" name="__codelineno-49-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">choices</span><span class="p">[</span><span class="n">i</span><span class="p">]))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-49-14" id="__codelineno-49-14" name="__codelineno-49-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-49-15" id="__codelineno-49-15" name="__codelineno-49-15"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">choices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
|
||
<a href="#__codelineno-49-16" id="__codelineno-49-16" name="__codelineno-49-16"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">numChoices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">,</span><span class="w"> </span><span class="n">numRes</span><span class="p">);</span>
|
||
<a href="#__codelineno-49-17" id="__codelineno-49-17" name="__codelineno-49-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-49-18" id="__codelineno-49-18" name="__codelineno-49-18"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="n">choices</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
|
||
<a href="#__codelineno-49-19" id="__codelineno-49-19" name="__codelineno-49-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-49-20" id="__codelineno-49-20" name="__codelineno-49-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-49-21" id="__codelineno-49-21" name="__codelineno-49-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-50-1" id="__codelineno-50-1" name="__codelineno-50-1"></a><span class="cm">/* 백트래킹 알고리즘의 기본 틀 */</span>
|
||
<a href="#__codelineno-50-2" id="__codelineno-50-2" name="__codelineno-50-2"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">State?</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">:</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">Choice?</span><span class="o">></span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">State?</span><span class="o">>?</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-50-3" id="__codelineno-50-3" name="__codelineno-50-3"></a><span class="w"> </span><span class="c1">// 해인지 확인</span>
|
||
<a href="#__codelineno-50-4" id="__codelineno-50-4" name="__codelineno-50-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-50-5" id="__codelineno-50-5" name="__codelineno-50-5"></a><span class="w"> </span><span class="c1">// 해 기록</span>
|
||
<a href="#__codelineno-50-6" id="__codelineno-50-6" name="__codelineno-50-6"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-50-7" id="__codelineno-50-7" name="__codelineno-50-7"></a><span class="w"> </span><span class="c1">// 더 이상 탐색하지 않는다</span>
|
||
<a href="#__codelineno-50-8" id="__codelineno-50-8" name="__codelineno-50-8"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-50-9" id="__codelineno-50-9" name="__codelineno-50-9"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-50-10" id="__codelineno-50-10" name="__codelineno-50-10"></a><span class="w"> </span><span class="c1">// 모든 선택지 순회</span>
|
||
<a href="#__codelineno-50-11" id="__codelineno-50-11" name="__codelineno-50-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-50-12" id="__codelineno-50-12" name="__codelineno-50-12"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-50-13" id="__codelineno-50-13" name="__codelineno-50-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-50-14" id="__codelineno-50-14" name="__codelineno-50-14"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-50-15" id="__codelineno-50-15" name="__codelineno-50-15"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-50-16" id="__codelineno-50-16" name="__codelineno-50-16"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-50-17" id="__codelineno-50-17" name="__codelineno-50-17"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-50-18" id="__codelineno-50-18" name="__codelineno-50-18"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-50-19" id="__codelineno-50-19" name="__codelineno-50-19"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-50-20" id="__codelineno-50-20" name="__codelineno-50-20"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-50-21" id="__codelineno-50-21" name="__codelineno-50-21"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><pre><span></span><code><a href="#__codelineno-51-1" id="__codelineno-51-1" name="__codelineno-51-1"></a><span class="c1">### 백트래킹 알고리즘의 기본 틀 ###</span>
|
||
<a href="#__codelineno-51-2" id="__codelineno-51-2" name="__codelineno-51-2"></a><span class="k">def</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-51-3" id="__codelineno-51-3" name="__codelineno-51-3"></a><span class="w"> </span><span class="c1"># 해인지 확인</span>
|
||
<a href="#__codelineno-51-4" id="__codelineno-51-4" name="__codelineno-51-4"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_solution?</span><span class="p">(</span><span class="n">state</span><span class="p">)</span>
|
||
<a href="#__codelineno-51-5" id="__codelineno-51-5" name="__codelineno-51-5"></a><span class="w"> </span><span class="c1"># 해 기록</span>
|
||
<a href="#__codelineno-51-6" id="__codelineno-51-6" name="__codelineno-51-6"></a><span class="w"> </span><span class="n">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-51-7" id="__codelineno-51-7" name="__codelineno-51-7"></a><span class="w"> </span><span class="k">return</span>
|
||
<a href="#__codelineno-51-8" id="__codelineno-51-8" name="__codelineno-51-8"></a><span class="w"> </span><span class="k">end</span>
|
||
<a href="#__codelineno-51-9" id="__codelineno-51-9" name="__codelineno-51-9"></a>
|
||
<a href="#__codelineno-51-10" id="__codelineno-51-10" name="__codelineno-51-10"></a><span class="w"> </span><span class="c1"># 모든 선택지 순회</span>
|
||
<a href="#__codelineno-51-11" id="__codelineno-51-11" name="__codelineno-51-11"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span>
|
||
<a href="#__codelineno-51-12" id="__codelineno-51-12" name="__codelineno-51-12"></a><span class="w"> </span><span class="c1"># 가지치기: 선택이 유효한지 확인</span>
|
||
<a href="#__codelineno-51-13" id="__codelineno-51-13" name="__codelineno-51-13"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_valid?</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-51-14" id="__codelineno-51-14" name="__codelineno-51-14"></a><span class="w"> </span><span class="c1"># 시도: 선택하고 상태 갱신</span>
|
||
<a href="#__codelineno-51-15" id="__codelineno-51-15" name="__codelineno-51-15"></a><span class="w"> </span><span class="n">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-51-16" id="__codelineno-51-16" name="__codelineno-51-16"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-51-17" id="__codelineno-51-17" name="__codelineno-51-17"></a><span class="w"> </span><span class="c1"># 되돌리기: 선택을 취소하고 이전 상태 복원</span>
|
||
<a href="#__codelineno-51-18" id="__codelineno-51-18" name="__codelineno-51-18"></a><span class="w"> </span><span class="n">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-51-19" id="__codelineno-51-19" name="__codelineno-51-19"></a><span class="w"> </span><span class="k">end</span>
|
||
<a href="#__codelineno-51-20" id="__codelineno-51-20" name="__codelineno-51-20"></a><span class="w"> </span><span class="k">end</span>
|
||
<a href="#__codelineno-51-21" id="__codelineno-51-21" name="__codelineno-51-21"></a><span class="k">end</span>
|
||
</code></pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<p>이제 기본 틀 코드로 예제 3을 해결해 보자. 상태 <code>state</code>는 노드 순회 경로, 선택지 <code>choices</code>는 현재 노드의 왼쪽과 오른쪽 자식 노드, 결과 <code>res</code>는 경로들의 리스트다.</p>
|
||
<div class="tabbed-set tabbed-alternate" data-tabs="6:13"><input checked="checked" id="__tabbed_6_1" name="__tabbed_6" type="radio"/><input id="__tabbed_6_2" name="__tabbed_6" type="radio"/><input id="__tabbed_6_3" name="__tabbed_6" type="radio"/><input id="__tabbed_6_4" name="__tabbed_6" type="radio"/><input id="__tabbed_6_5" name="__tabbed_6" type="radio"/><input id="__tabbed_6_6" name="__tabbed_6" type="radio"/><input id="__tabbed_6_7" name="__tabbed_6" type="radio"/><input id="__tabbed_6_8" name="__tabbed_6" type="radio"/><input id="__tabbed_6_9" name="__tabbed_6" type="radio"/><input id="__tabbed_6_10" name="__tabbed_6" type="radio"/><input id="__tabbed_6_11" name="__tabbed_6" type="radio"/><input id="__tabbed_6_12" name="__tabbed_6" type="radio"/><input id="__tabbed_6_13" name="__tabbed_6" type="radio"/><div class="tabbed-labels"><label for="__tabbed_6_1">Python</label><label for="__tabbed_6_2">C++</label><label for="__tabbed_6_3">Java</label><label for="__tabbed_6_4">C#</label><label for="__tabbed_6_5">Go</label><label for="__tabbed_6_6">Swift</label><label for="__tabbed_6_7">JS</label><label for="__tabbed_6_8">TS</label><label for="__tabbed_6_9">Dart</label><label for="__tabbed_6_10">Rust</label><label for="__tabbed_6_11">C</label><label for="__tabbed_6_12">Kotlin</label><label for="__tabbed_6_13">Ruby</label></div>
|
||
<div class="tabbed-content">
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.py</span><pre><span></span><code><a href="#__codelineno-52-1" id="__codelineno-52-1" name="__codelineno-52-1"></a><span class="k">def</span><span class="w"> </span><span class="nf">is_solution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">])</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<a href="#__codelineno-52-2" id="__codelineno-52-2" name="__codelineno-52-2"></a><span class="w"> </span><span class="sd">"""현재 상태가 해인지 판단"""</span>
|
||
<a href="#__codelineno-52-3" id="__codelineno-52-3" name="__codelineno-52-3"></a> <span class="k">return</span> <span class="n">state</span> <span class="ow">and</span> <span class="n">state</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">val</span> <span class="o">==</span> <span class="mi">7</span>
|
||
<a href="#__codelineno-52-4" id="__codelineno-52-4" name="__codelineno-52-4"></a>
|
||
<a href="#__codelineno-52-5" id="__codelineno-52-5" name="__codelineno-52-5"></a><span class="k">def</span><span class="w"> </span><span class="nf">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">res</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">]]):</span>
|
||
<a href="#__codelineno-52-6" id="__codelineno-52-6" name="__codelineno-52-6"></a><span class="w"> </span><span class="sd">"""해를 기록한다"""</span>
|
||
<a href="#__codelineno-52-7" id="__codelineno-52-7" name="__codelineno-52-7"></a> <span class="n">res</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="nb">list</span><span class="p">(</span><span class="n">state</span><span class="p">))</span>
|
||
<a href="#__codelineno-52-8" id="__codelineno-52-8" name="__codelineno-52-8"></a>
|
||
<a href="#__codelineno-52-9" id="__codelineno-52-9" name="__codelineno-52-9"></a><span class="k">def</span><span class="w"> </span><span class="nf">is_valid</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">choice</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">)</span> <span class="o">-></span> <span class="nb">bool</span><span class="p">:</span>
|
||
<a href="#__codelineno-52-10" id="__codelineno-52-10" name="__codelineno-52-10"></a><span class="w"> </span><span class="sd">"""현재 상태에서 해당 선택이 유효한지 판단"""</span>
|
||
<a href="#__codelineno-52-11" id="__codelineno-52-11" name="__codelineno-52-11"></a> <span class="k">return</span> <span class="n">choice</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">choice</span><span class="o">.</span><span class="n">val</span> <span class="o">!=</span> <span class="mi">3</span>
|
||
<a href="#__codelineno-52-12" id="__codelineno-52-12" name="__codelineno-52-12"></a>
|
||
<a href="#__codelineno-52-13" id="__codelineno-52-13" name="__codelineno-52-13"></a><span class="k">def</span><span class="w"> </span><span class="nf">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">choice</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">):</span>
|
||
<a href="#__codelineno-52-14" id="__codelineno-52-14" name="__codelineno-52-14"></a><span class="w"> </span><span class="sd">"""상태 갱신"""</span>
|
||
<a href="#__codelineno-52-15" id="__codelineno-52-15" name="__codelineno-52-15"></a> <span class="n">state</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-52-16" id="__codelineno-52-16" name="__codelineno-52-16"></a>
|
||
<a href="#__codelineno-52-17" id="__codelineno-52-17" name="__codelineno-52-17"></a><span class="k">def</span><span class="w"> </span><span class="nf">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">choice</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">):</span>
|
||
<a href="#__codelineno-52-18" id="__codelineno-52-18" name="__codelineno-52-18"></a><span class="w"> </span><span class="sd">"""상태 복원"""</span>
|
||
<a href="#__codelineno-52-19" id="__codelineno-52-19" name="__codelineno-52-19"></a> <span class="n">state</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
||
<a href="#__codelineno-52-20" id="__codelineno-52-20" name="__codelineno-52-20"></a>
|
||
<a href="#__codelineno-52-21" id="__codelineno-52-21" name="__codelineno-52-21"></a><span class="k">def</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span>
|
||
<a href="#__codelineno-52-22" id="__codelineno-52-22" name="__codelineno-52-22"></a> <span class="n">state</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">choices</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span> <span class="n">res</span><span class="p">:</span> <span class="nb">list</span><span class="p">[</span><span class="nb">list</span><span class="p">[</span><span class="n">TreeNode</span><span class="p">]]</span>
|
||
<a href="#__codelineno-52-23" id="__codelineno-52-23" name="__codelineno-52-23"></a><span class="p">):</span>
|
||
<a href="#__codelineno-52-24" id="__codelineno-52-24" name="__codelineno-52-24"></a><span class="w"> </span><span class="sd">"""백트래킹 알고리즘: 예제 3"""</span>
|
||
<a href="#__codelineno-52-25" id="__codelineno-52-25" name="__codelineno-52-25"></a> <span class="c1"># 해인지 확인한다</span>
|
||
<a href="#__codelineno-52-26" id="__codelineno-52-26" name="__codelineno-52-26"></a> <span class="k">if</span> <span class="n">is_solution</span><span class="p">(</span><span class="n">state</span><span class="p">):</span>
|
||
<a href="#__codelineno-52-27" id="__codelineno-52-27" name="__codelineno-52-27"></a> <span class="c1"># 해를 기록한다</span>
|
||
<a href="#__codelineno-52-28" id="__codelineno-52-28" name="__codelineno-52-28"></a> <span class="n">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-52-29" id="__codelineno-52-29" name="__codelineno-52-29"></a> <span class="c1"># 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-52-30" id="__codelineno-52-30" name="__codelineno-52-30"></a> <span class="k">for</span> <span class="n">choice</span> <span class="ow">in</span> <span class="n">choices</span><span class="p">:</span>
|
||
<a href="#__codelineno-52-31" id="__codelineno-52-31" name="__codelineno-52-31"></a> <span class="c1"># 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-52-32" id="__codelineno-52-32" name="__codelineno-52-32"></a> <span class="k">if</span> <span class="n">is_valid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">):</span>
|
||
<a href="#__codelineno-52-33" id="__codelineno-52-33" name="__codelineno-52-33"></a> <span class="c1"># 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-52-34" id="__codelineno-52-34" name="__codelineno-52-34"></a> <span class="n">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-52-35" id="__codelineno-52-35" name="__codelineno-52-35"></a> <span class="c1"># 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-52-36" id="__codelineno-52-36" name="__codelineno-52-36"></a> <span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="p">[</span><span class="n">choice</span><span class="o">.</span><span class="n">left</span><span class="p">,</span> <span class="n">choice</span><span class="o">.</span><span class="n">right</span><span class="p">],</span> <span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-52-37" id="__codelineno-52-37" name="__codelineno-52-37"></a> <span class="c1"># 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-52-38" id="__codelineno-52-38" name="__codelineno-52-38"></a> <span class="n">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">choice</span><span class="p">)</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.cpp</span><pre><span></span><code><a href="#__codelineno-53-1" id="__codelineno-53-1" name="__codelineno-53-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-53-2" id="__codelineno-53-2" name="__codelineno-53-2"></a><span class="kt">bool</span><span class="w"> </span><span class="nf">isSolution</span><span class="p">(</span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="o">&</span><span class="n">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-53-3" id="__codelineno-53-3" name="__codelineno-53-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">!</span><span class="n">state</span><span class="p">.</span><span class="n">empty</span><span class="p">()</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">back</span><span class="p">()</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">;</span>
|
||
<a href="#__codelineno-53-4" id="__codelineno-53-4" name="__codelineno-53-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-53-5" id="__codelineno-53-5" name="__codelineno-53-5"></a>
|
||
<a href="#__codelineno-53-6" id="__codelineno-53-6" name="__codelineno-53-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-53-7" id="__codelineno-53-7" name="__codelineno-53-7"></a><span class="kt">void</span><span class="w"> </span><span class="nf">recordSolution</span><span class="p">(</span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="o">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">vector</span><span class="o"><</span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*>></span><span class="w"> </span><span class="o">&</span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-53-8" id="__codelineno-53-8" name="__codelineno-53-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">state</span><span class="p">);</span>
|
||
<a href="#__codelineno-53-9" id="__codelineno-53-9" name="__codelineno-53-9"></a><span class="p">}</span>
|
||
<a href="#__codelineno-53-10" id="__codelineno-53-10" name="__codelineno-53-10"></a>
|
||
<a href="#__codelineno-53-11" id="__codelineno-53-11" name="__codelineno-53-11"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-53-12" id="__codelineno-53-12" name="__codelineno-53-12"></a><span class="kt">bool</span><span class="w"> </span><span class="nf">isValid</span><span class="p">(</span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="o">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-53-13" id="__codelineno-53-13" name="__codelineno-53-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">nullptr</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">choice</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
|
||
<a href="#__codelineno-53-14" id="__codelineno-53-14" name="__codelineno-53-14"></a><span class="p">}</span>
|
||
<a href="#__codelineno-53-15" id="__codelineno-53-15" name="__codelineno-53-15"></a>
|
||
<a href="#__codelineno-53-16" id="__codelineno-53-16" name="__codelineno-53-16"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-53-17" id="__codelineno-53-17" name="__codelineno-53-17"></a><span class="kt">void</span><span class="w"> </span><span class="nf">makeChoice</span><span class="p">(</span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="o">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-53-18" id="__codelineno-53-18" name="__codelineno-53-18"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-53-19" id="__codelineno-53-19" name="__codelineno-53-19"></a><span class="p">}</span>
|
||
<a href="#__codelineno-53-20" id="__codelineno-53-20" name="__codelineno-53-20"></a>
|
||
<a href="#__codelineno-53-21" id="__codelineno-53-21" name="__codelineno-53-21"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-53-22" id="__codelineno-53-22" name="__codelineno-53-22"></a><span class="kt">void</span><span class="w"> </span><span class="nf">undoChoice</span><span class="p">(</span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="o">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-53-23" id="__codelineno-53-23" name="__codelineno-53-23"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">pop_back</span><span class="p">();</span>
|
||
<a href="#__codelineno-53-24" id="__codelineno-53-24" name="__codelineno-53-24"></a><span class="p">}</span>
|
||
<a href="#__codelineno-53-25" id="__codelineno-53-25" name="__codelineno-53-25"></a>
|
||
<a href="#__codelineno-53-26" id="__codelineno-53-26" name="__codelineno-53-26"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-53-27" id="__codelineno-53-27" name="__codelineno-53-27"></a><span class="kt">void</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="o">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="o">&</span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">vector</span><span class="o"><</span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*>></span><span class="w"> </span><span class="o">&</span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-53-28" id="__codelineno-53-28" name="__codelineno-53-28"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-53-29" id="__codelineno-53-29" name="__codelineno-53-29"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-53-30" id="__codelineno-53-30" name="__codelineno-53-30"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-53-31" id="__codelineno-53-31" name="__codelineno-53-31"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-53-32" id="__codelineno-53-32" name="__codelineno-53-32"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-53-33" id="__codelineno-53-33" name="__codelineno-53-33"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-53-34" id="__codelineno-53-34" name="__codelineno-53-34"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">choice</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-53-35" id="__codelineno-53-35" name="__codelineno-53-35"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-53-36" id="__codelineno-53-36" name="__codelineno-53-36"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-53-37" id="__codelineno-53-37" name="__codelineno-53-37"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-53-38" id="__codelineno-53-38" name="__codelineno-53-38"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-53-39" id="__codelineno-53-39" name="__codelineno-53-39"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-53-40" id="__codelineno-53-40" name="__codelineno-53-40"></a><span class="w"> </span><span class="n">vector</span><span class="o"><</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*></span><span class="w"> </span><span class="n">nextChoices</span><span class="p">{</span><span class="n">choice</span><span class="o">-></span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="o">-></span><span class="n">right</span><span class="p">};</span>
|
||
<a href="#__codelineno-53-41" id="__codelineno-53-41" name="__codelineno-53-41"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">nextChoices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-53-42" id="__codelineno-53-42" name="__codelineno-53-42"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-53-43" id="__codelineno-53-43" name="__codelineno-53-43"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-53-44" id="__codelineno-53-44" name="__codelineno-53-44"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-53-45" id="__codelineno-53-45" name="__codelineno-53-45"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-53-46" id="__codelineno-53-46" name="__codelineno-53-46"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.java</span><pre><span></span><code><a href="#__codelineno-54-1" id="__codelineno-54-1" name="__codelineno-54-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-54-2" id="__codelineno-54-2" name="__codelineno-54-2"></a><span class="kt">boolean</span><span class="w"> </span><span class="nf">isSolution</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-54-3" id="__codelineno-54-3" name="__codelineno-54-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">!</span><span class="n">state</span><span class="p">.</span><span class="na">isEmpty</span><span class="p">()</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="na">get</span><span class="p">(</span><span class="n">state</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">).</span><span class="na">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">;</span>
|
||
<a href="#__codelineno-54-4" id="__codelineno-54-4" name="__codelineno-54-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-54-5" id="__codelineno-54-5" name="__codelineno-54-5"></a>
|
||
<a href="#__codelineno-54-6" id="__codelineno-54-6" name="__codelineno-54-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-54-7" id="__codelineno-54-7" name="__codelineno-54-7"></a><span class="kt">void</span><span class="w"> </span><span class="nf">recordSolution</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-54-8" id="__codelineno-54-8" name="__codelineno-54-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">ArrayList</span><span class="o"><></span><span class="p">(</span><span class="n">state</span><span class="p">));</span>
|
||
<a href="#__codelineno-54-9" id="__codelineno-54-9" name="__codelineno-54-9"></a><span class="p">}</span>
|
||
<a href="#__codelineno-54-10" id="__codelineno-54-10" name="__codelineno-54-10"></a>
|
||
<a href="#__codelineno-54-11" id="__codelineno-54-11" name="__codelineno-54-11"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-54-12" id="__codelineno-54-12" name="__codelineno-54-12"></a><span class="kt">boolean</span><span class="w"> </span><span class="nf">isValid</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-54-13" id="__codelineno-54-13" name="__codelineno-54-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="na">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
|
||
<a href="#__codelineno-54-14" id="__codelineno-54-14" name="__codelineno-54-14"></a><span class="p">}</span>
|
||
<a href="#__codelineno-54-15" id="__codelineno-54-15" name="__codelineno-54-15"></a>
|
||
<a href="#__codelineno-54-16" id="__codelineno-54-16" name="__codelineno-54-16"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-54-17" id="__codelineno-54-17" name="__codelineno-54-17"></a><span class="kt">void</span><span class="w"> </span><span class="nf">makeChoice</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-54-18" id="__codelineno-54-18" name="__codelineno-54-18"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-54-19" id="__codelineno-54-19" name="__codelineno-54-19"></a><span class="p">}</span>
|
||
<a href="#__codelineno-54-20" id="__codelineno-54-20" name="__codelineno-54-20"></a>
|
||
<a href="#__codelineno-54-21" id="__codelineno-54-21" name="__codelineno-54-21"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-54-22" id="__codelineno-54-22" name="__codelineno-54-22"></a><span class="kt">void</span><span class="w"> </span><span class="nf">undoChoice</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-54-23" id="__codelineno-54-23" name="__codelineno-54-23"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="na">remove</span><span class="p">(</span><span class="n">state</span><span class="p">.</span><span class="na">size</span><span class="p">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
||
<a href="#__codelineno-54-24" id="__codelineno-54-24" name="__codelineno-54-24"></a><span class="p">}</span>
|
||
<a href="#__codelineno-54-25" id="__codelineno-54-25" name="__codelineno-54-25"></a>
|
||
<a href="#__codelineno-54-26" id="__codelineno-54-26" name="__codelineno-54-26"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-54-27" id="__codelineno-54-27" name="__codelineno-54-27"></a><span class="kt">void</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-54-28" id="__codelineno-54-28" name="__codelineno-54-28"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-54-29" id="__codelineno-54-29" name="__codelineno-54-29"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-54-30" id="__codelineno-54-30" name="__codelineno-54-30"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-54-31" id="__codelineno-54-31" name="__codelineno-54-31"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-54-32" id="__codelineno-54-32" name="__codelineno-54-32"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-54-33" id="__codelineno-54-33" name="__codelineno-54-33"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-54-34" id="__codelineno-54-34" name="__codelineno-54-34"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-54-35" id="__codelineno-54-35" name="__codelineno-54-35"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-54-36" id="__codelineno-54-36" name="__codelineno-54-36"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-54-37" id="__codelineno-54-37" name="__codelineno-54-37"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-54-38" id="__codelineno-54-38" name="__codelineno-54-38"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-54-39" id="__codelineno-54-39" name="__codelineno-54-39"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-54-40" id="__codelineno-54-40" name="__codelineno-54-40"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">Arrays</span><span class="p">.</span><span class="na">asList</span><span class="p">(</span><span class="n">choice</span><span class="p">.</span><span class="na">left</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="na">right</span><span class="p">),</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-54-41" id="__codelineno-54-41" name="__codelineno-54-41"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-54-42" id="__codelineno-54-42" name="__codelineno-54-42"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-54-43" id="__codelineno-54-43" name="__codelineno-54-43"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-54-44" id="__codelineno-54-44" name="__codelineno-54-44"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-54-45" id="__codelineno-54-45" name="__codelineno-54-45"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.cs</span><pre><span></span><code><a href="#__codelineno-55-1" id="__codelineno-55-1" name="__codelineno-55-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-55-2" id="__codelineno-55-2" name="__codelineno-55-2"></a><span class="kt">bool</span><span class="w"> </span><span class="nf">IsSolution</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-55-3" id="__codelineno-55-3" name="__codelineno-55-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">Count</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">state</span><span class="p">[</span><span class="o">^</span><span class="mi">1</span><span class="p">].</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">;</span>
|
||
<a href="#__codelineno-55-4" id="__codelineno-55-4" name="__codelineno-55-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-55-5" id="__codelineno-55-5" name="__codelineno-55-5"></a>
|
||
<a href="#__codelineno-55-6" id="__codelineno-55-6" name="__codelineno-55-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-55-7" id="__codelineno-55-7" name="__codelineno-55-7"></a><span class="k">void</span><span class="w"> </span><span class="nf">RecordSolution</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-55-8" id="__codelineno-55-8" name="__codelineno-55-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="k">new</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="p">(</span><span class="n">state</span><span class="p">));</span>
|
||
<a href="#__codelineno-55-9" id="__codelineno-55-9" name="__codelineno-55-9"></a><span class="p">}</span>
|
||
<a href="#__codelineno-55-10" id="__codelineno-55-10" name="__codelineno-55-10"></a>
|
||
<a href="#__codelineno-55-11" id="__codelineno-55-11" name="__codelineno-55-11"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-55-12" id="__codelineno-55-12" name="__codelineno-55-12"></a><span class="kt">bool</span><span class="w"> </span><span class="nf">IsValid</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-55-13" id="__codelineno-55-13" name="__codelineno-55-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
|
||
<a href="#__codelineno-55-14" id="__codelineno-55-14" name="__codelineno-55-14"></a><span class="p">}</span>
|
||
<a href="#__codelineno-55-15" id="__codelineno-55-15" name="__codelineno-55-15"></a>
|
||
<a href="#__codelineno-55-16" id="__codelineno-55-16" name="__codelineno-55-16"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-55-17" id="__codelineno-55-17" name="__codelineno-55-17"></a><span class="k">void</span><span class="w"> </span><span class="nf">MakeChoice</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-55-18" id="__codelineno-55-18" name="__codelineno-55-18"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">Add</span><span class="p">(</span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-55-19" id="__codelineno-55-19" name="__codelineno-55-19"></a><span class="p">}</span>
|
||
<a href="#__codelineno-55-20" id="__codelineno-55-20" name="__codelineno-55-20"></a>
|
||
<a href="#__codelineno-55-21" id="__codelineno-55-21" name="__codelineno-55-21"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-55-22" id="__codelineno-55-22" name="__codelineno-55-22"></a><span class="k">void</span><span class="w"> </span><span class="nf">UndoChoice</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-55-23" id="__codelineno-55-23" name="__codelineno-55-23"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">RemoveAt</span><span class="p">(</span><span class="n">state</span><span class="p">.</span><span class="n">Count</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">);</span>
|
||
<a href="#__codelineno-55-24" id="__codelineno-55-24" name="__codelineno-55-24"></a><span class="p">}</span>
|
||
<a href="#__codelineno-55-25" id="__codelineno-55-25" name="__codelineno-55-25"></a>
|
||
<a href="#__codelineno-55-26" id="__codelineno-55-26" name="__codelineno-55-26"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-55-27" id="__codelineno-55-27" name="__codelineno-55-27"></a><span class="k">void</span><span class="w"> </span><span class="nf">Backtrack</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-55-28" id="__codelineno-55-28" name="__codelineno-55-28"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-55-29" id="__codelineno-55-29" name="__codelineno-55-29"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">IsSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-55-30" id="__codelineno-55-30" name="__codelineno-55-30"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-55-31" id="__codelineno-55-31" name="__codelineno-55-31"></a><span class="w"> </span><span class="n">RecordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-55-32" id="__codelineno-55-32" name="__codelineno-55-32"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-55-33" id="__codelineno-55-33" name="__codelineno-55-33"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-55-34" id="__codelineno-55-34" name="__codelineno-55-34"></a><span class="w"> </span><span class="k">foreach</span><span class="w"> </span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-55-35" id="__codelineno-55-35" name="__codelineno-55-35"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-55-36" id="__codelineno-55-36" name="__codelineno-55-36"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">IsValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-55-37" id="__codelineno-55-37" name="__codelineno-55-37"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-55-38" id="__codelineno-55-38" name="__codelineno-55-38"></a><span class="w"> </span><span class="n">MakeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-55-39" id="__codelineno-55-39" name="__codelineno-55-39"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-55-40" id="__codelineno-55-40" name="__codelineno-55-40"></a><span class="w"> </span><span class="n">Backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="n">choice</span><span class="p">.</span><span class="n">left</span><span class="o">!</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">right</span><span class="o">!</span><span class="p">],</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-55-41" id="__codelineno-55-41" name="__codelineno-55-41"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-55-42" id="__codelineno-55-42" name="__codelineno-55-42"></a><span class="w"> </span><span class="n">UndoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-55-43" id="__codelineno-55-43" name="__codelineno-55-43"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-55-44" id="__codelineno-55-44" name="__codelineno-55-44"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-55-45" id="__codelineno-55-45" name="__codelineno-55-45"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.go</span><pre><span></span><code><a href="#__codelineno-56-1" id="__codelineno-56-1" name="__codelineno-56-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-56-2" id="__codelineno-56-2" name="__codelineno-56-2"></a><span class="kd">func</span><span class="w"> </span><span class="nx">isSolution</span><span class="p">(</span><span class="nx">state</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-56-3" id="__codelineno-56-3" name="__codelineno-56-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">len</span><span class="p">(</span><span class="o">*</span><span class="nx">state</span><span class="p">)</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="nx">state</span><span class="p">)[</span><span class="nb">len</span><span class="p">(</span><span class="o">*</span><span class="nx">state</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">].</span><span class="nx">Val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span>
|
||
<a href="#__codelineno-56-4" id="__codelineno-56-4" name="__codelineno-56-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-56-5" id="__codelineno-56-5" name="__codelineno-56-5"></a>
|
||
<a href="#__codelineno-56-6" id="__codelineno-56-6" name="__codelineno-56-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-56-7" id="__codelineno-56-7" name="__codelineno-56-7"></a><span class="kd">func</span><span class="w"> </span><span class="nx">recordSolution</span><span class="p">(</span><span class="nx">state</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="w"> </span><span class="o">*</span><span class="p">[][]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-56-8" id="__codelineno-56-8" name="__codelineno-56-8"></a><span class="w"> </span><span class="o">*</span><span class="nx">res</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="o">*</span><span class="nx">res</span><span class="p">,</span><span class="w"> </span><span class="nb">append</span><span class="p">([]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">{},</span><span class="w"> </span><span class="o">*</span><span class="nx">state</span><span class="p">...))</span>
|
||
<a href="#__codelineno-56-9" id="__codelineno-56-9" name="__codelineno-56-9"></a><span class="p">}</span>
|
||
<a href="#__codelineno-56-10" id="__codelineno-56-10" name="__codelineno-56-10"></a>
|
||
<a href="#__codelineno-56-11" id="__codelineno-56-11" name="__codelineno-56-11"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-56-12" id="__codelineno-56-12" name="__codelineno-56-12"></a><span class="kd">func</span><span class="w"> </span><span class="nx">isValid</span><span class="p">(</span><span class="nx">state</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-56-13" id="__codelineno-56-13" name="__codelineno-56-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nx">choice</span><span class="p">.</span><span class="nx">Val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">3</span>
|
||
<a href="#__codelineno-56-14" id="__codelineno-56-14" name="__codelineno-56-14"></a><span class="p">}</span>
|
||
<a href="#__codelineno-56-15" id="__codelineno-56-15" name="__codelineno-56-15"></a>
|
||
<a href="#__codelineno-56-16" id="__codelineno-56-16" name="__codelineno-56-16"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-56-17" id="__codelineno-56-17" name="__codelineno-56-17"></a><span class="kd">func</span><span class="w"> </span><span class="nx">makeChoice</span><span class="p">(</span><span class="nx">state</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-56-18" id="__codelineno-56-18" name="__codelineno-56-18"></a><span class="w"> </span><span class="o">*</span><span class="nx">state</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="o">*</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-56-19" id="__codelineno-56-19" name="__codelineno-56-19"></a><span class="p">}</span>
|
||
<a href="#__codelineno-56-20" id="__codelineno-56-20" name="__codelineno-56-20"></a>
|
||
<a href="#__codelineno-56-21" id="__codelineno-56-21" name="__codelineno-56-21"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-56-22" id="__codelineno-56-22" name="__codelineno-56-22"></a><span class="kd">func</span><span class="w"> </span><span class="nx">undoChoice</span><span class="p">(</span><span class="nx">state</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-56-23" id="__codelineno-56-23" name="__codelineno-56-23"></a><span class="w"> </span><span class="o">*</span><span class="nx">state</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="o">*</span><span class="nx">state</span><span class="p">)[:</span><span class="nb">len</span><span class="p">(</span><span class="o">*</span><span class="nx">state</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
||
<a href="#__codelineno-56-24" id="__codelineno-56-24" name="__codelineno-56-24"></a><span class="p">}</span>
|
||
<a href="#__codelineno-56-25" id="__codelineno-56-25" name="__codelineno-56-25"></a>
|
||
<a href="#__codelineno-56-26" id="__codelineno-56-26" name="__codelineno-56-26"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-56-27" id="__codelineno-56-27" name="__codelineno-56-27"></a><span class="kd">func</span><span class="w"> </span><span class="nx">backtrackIII</span><span class="p">(</span><span class="nx">state</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">choices</span><span class="w"> </span><span class="o">*</span><span class="p">[]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="w"> </span><span class="o">*</span><span class="p">[][]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-56-28" id="__codelineno-56-28" name="__codelineno-56-28"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-56-29" id="__codelineno-56-29" name="__codelineno-56-29"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">isSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-56-30" id="__codelineno-56-30" name="__codelineno-56-30"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-56-31" id="__codelineno-56-31" name="__codelineno-56-31"></a><span class="w"> </span><span class="nx">recordSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-56-32" id="__codelineno-56-32" name="__codelineno-56-32"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-56-33" id="__codelineno-56-33" name="__codelineno-56-33"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-56-34" id="__codelineno-56-34" name="__codelineno-56-34"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nx">_</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">range</span><span class="w"> </span><span class="o">*</span><span class="nx">choices</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-56-35" id="__codelineno-56-35" name="__codelineno-56-35"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-56-36" id="__codelineno-56-36" name="__codelineno-56-36"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="nx">isValid</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-56-37" id="__codelineno-56-37" name="__codelineno-56-37"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-56-38" id="__codelineno-56-38" name="__codelineno-56-38"></a><span class="w"> </span><span class="nx">makeChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-56-39" id="__codelineno-56-39" name="__codelineno-56-39"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-56-40" id="__codelineno-56-40" name="__codelineno-56-40"></a><span class="w"> </span><span class="nx">temp</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="nb">make</span><span class="p">([]</span><span class="o">*</span><span class="nx">TreeNode</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">)</span>
|
||
<a href="#__codelineno-56-41" id="__codelineno-56-41" name="__codelineno-56-41"></a><span class="w"> </span><span class="nx">temp</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">append</span><span class="p">(</span><span class="nx">temp</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">.</span><span class="nx">Left</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">.</span><span class="nx">Right</span><span class="p">)</span>
|
||
<a href="#__codelineno-56-42" id="__codelineno-56-42" name="__codelineno-56-42"></a><span class="w"> </span><span class="nx">backtrackIII</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="o">&</span><span class="nx">temp</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-56-43" id="__codelineno-56-43" name="__codelineno-56-43"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-56-44" id="__codelineno-56-44" name="__codelineno-56-44"></a><span class="w"> </span><span class="nx">undoChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-56-45" id="__codelineno-56-45" name="__codelineno-56-45"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-56-46" id="__codelineno-56-46" name="__codelineno-56-46"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-56-47" id="__codelineno-56-47" name="__codelineno-56-47"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.swift</span><pre><span></span><code><a href="#__codelineno-57-1" id="__codelineno-57-1" name="__codelineno-57-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-57-2" id="__codelineno-57-2" name="__codelineno-57-2"></a><span class="kd">func</span><span class="w"> </span><span class="nf">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="n">TreeNode</span><span class="p">])</span><span class="w"> </span><span class="p">-></span><span class="w"> </span><span class="nb">Bool</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-57-3" id="__codelineno-57-3" name="__codelineno-57-3"></a><span class="w"> </span><span class="o">!</span><span class="n">state</span><span class="p">.</span><span class="bp">isEmpty</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="bp">last</span><span class="p">!.</span><span class="n">val</span><span class="w"> </span><span class="p">==</span><span class="w"> </span><span class="mi">7</span>
|
||
<a href="#__codelineno-57-4" id="__codelineno-57-4" name="__codelineno-57-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-57-5" id="__codelineno-57-5" name="__codelineno-57-5"></a>
|
||
<a href="#__codelineno-57-6" id="__codelineno-57-6" name="__codelineno-57-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-57-7" id="__codelineno-57-7" name="__codelineno-57-7"></a><span class="kd">func</span><span class="w"> </span><span class="nf">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="kr">inout</span><span class="w"> </span><span class="p">[[</span><span class="n">TreeNode</span><span class="p">]])</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-57-8" id="__codelineno-57-8" name="__codelineno-57-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">state</span><span class="p">)</span>
|
||
<a href="#__codelineno-57-9" id="__codelineno-57-9" name="__codelineno-57-9"></a><span class="p">}</span>
|
||
<a href="#__codelineno-57-10" id="__codelineno-57-10" name="__codelineno-57-10"></a>
|
||
<a href="#__codelineno-57-11" id="__codelineno-57-11" name="__codelineno-57-11"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-57-12" id="__codelineno-57-12" name="__codelineno-57-12"></a><span class="kd">func</span><span class="w"> </span><span class="nf">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode</span><span class="p">?)</span><span class="w"> </span><span class="p">-></span><span class="w"> </span><span class="nb">Bool</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-57-13" id="__codelineno-57-13" name="__codelineno-57-13"></a><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">nil</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">choice</span><span class="p">!.</span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">3</span>
|
||
<a href="#__codelineno-57-14" id="__codelineno-57-14" name="__codelineno-57-14"></a><span class="p">}</span>
|
||
<a href="#__codelineno-57-15" id="__codelineno-57-15" name="__codelineno-57-15"></a>
|
||
<a href="#__codelineno-57-16" id="__codelineno-57-16" name="__codelineno-57-16"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-57-17" id="__codelineno-57-17" name="__codelineno-57-17"></a><span class="kd">func</span><span class="w"> </span><span class="nf">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kr">inout</span><span class="w"> </span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-57-18" id="__codelineno-57-18" name="__codelineno-57-18"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-57-19" id="__codelineno-57-19" name="__codelineno-57-19"></a><span class="p">}</span>
|
||
<a href="#__codelineno-57-20" id="__codelineno-57-20" name="__codelineno-57-20"></a>
|
||
<a href="#__codelineno-57-21" id="__codelineno-57-21" name="__codelineno-57-21"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-57-22" id="__codelineno-57-22" name="__codelineno-57-22"></a><span class="kd">func</span><span class="w"> </span><span class="nf">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kr">inout</span><span class="w"> </span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-57-23" id="__codelineno-57-23" name="__codelineno-57-23"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="bp">removeLast</span><span class="p">()</span>
|
||
<a href="#__codelineno-57-24" id="__codelineno-57-24" name="__codelineno-57-24"></a><span class="p">}</span>
|
||
<a href="#__codelineno-57-25" id="__codelineno-57-25" name="__codelineno-57-25"></a>
|
||
<a href="#__codelineno-57-26" id="__codelineno-57-26" name="__codelineno-57-26"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-57-27" id="__codelineno-57-27" name="__codelineno-57-27"></a><span class="kd">func</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kr">inout</span><span class="w"> </span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span><span class="w"> </span><span class="n">choices</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="n">TreeNode</span><span class="p">],</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="kr">inout</span><span class="w"> </span><span class="p">[[</span><span class="n">TreeNode</span><span class="p">]])</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-57-28" id="__codelineno-57-28" name="__codelineno-57-28"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-57-29" id="__codelineno-57-29" name="__codelineno-57-29"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-57-30" id="__codelineno-57-30" name="__codelineno-57-30"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-57-31" id="__codelineno-57-31" name="__codelineno-57-31"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-57-32" id="__codelineno-57-32" name="__codelineno-57-32"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-57-33" id="__codelineno-57-33" name="__codelineno-57-33"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-57-34" id="__codelineno-57-34" name="__codelineno-57-34"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-57-35" id="__codelineno-57-35" name="__codelineno-57-35"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-57-36" id="__codelineno-57-36" name="__codelineno-57-36"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-57-37" id="__codelineno-57-37" name="__codelineno-57-37"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-57-38" id="__codelineno-57-38" name="__codelineno-57-38"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-57-39" id="__codelineno-57-39" name="__codelineno-57-39"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="n">choice</span><span class="p">.</span><span class="kr">left</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="kr">right</span><span class="p">].</span><span class="n">compactMap</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nv">$0</span><span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-57-40" id="__codelineno-57-40" name="__codelineno-57-40"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-57-41" id="__codelineno-57-41" name="__codelineno-57-41"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="p">&</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-57-42" id="__codelineno-57-42" name="__codelineno-57-42"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-57-43" id="__codelineno-57-43" name="__codelineno-57-43"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-57-44" id="__codelineno-57-44" name="__codelineno-57-44"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.js</span><pre><span></span><code><a href="#__codelineno-58-1" id="__codelineno-58-1" name="__codelineno-58-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-58-2" id="__codelineno-58-2" name="__codelineno-58-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">isSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-58-3" id="__codelineno-58-3" name="__codelineno-58-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">state</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nx">state</span><span class="p">[</span><span class="nx">state</span><span class="p">.</span><span class="nx">length</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">1</span><span class="p">]</span><span class="o">?</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">7</span><span class="p">;</span>
|
||
<a href="#__codelineno-58-4" id="__codelineno-58-4" name="__codelineno-58-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-58-5" id="__codelineno-58-5" name="__codelineno-58-5"></a>
|
||
<a href="#__codelineno-58-6" id="__codelineno-58-6" name="__codelineno-58-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-58-7" id="__codelineno-58-7" name="__codelineno-58-7"></a><span class="kd">function</span><span class="w"> </span><span class="nx">recordSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-58-8" id="__codelineno-58-8" name="__codelineno-58-8"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">([...</span><span class="nx">state</span><span class="p">]);</span>
|
||
<a href="#__codelineno-58-9" id="__codelineno-58-9" name="__codelineno-58-9"></a><span class="p">}</span>
|
||
<a href="#__codelineno-58-10" id="__codelineno-58-10" name="__codelineno-58-10"></a>
|
||
<a href="#__codelineno-58-11" id="__codelineno-58-11" name="__codelineno-58-11"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-58-12" id="__codelineno-58-12" name="__codelineno-58-12"></a><span class="kd">function</span><span class="w"> </span><span class="nx">isValid</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-58-13" id="__codelineno-58-13" name="__codelineno-58-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nx">choice</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="mf">3</span><span class="p">;</span>
|
||
<a href="#__codelineno-58-14" id="__codelineno-58-14" name="__codelineno-58-14"></a><span class="p">}</span>
|
||
<a href="#__codelineno-58-15" id="__codelineno-58-15" name="__codelineno-58-15"></a>
|
||
<a href="#__codelineno-58-16" id="__codelineno-58-16" name="__codelineno-58-16"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-58-17" id="__codelineno-58-17" name="__codelineno-58-17"></a><span class="kd">function</span><span class="w"> </span><span class="nx">makeChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-58-18" id="__codelineno-58-18" name="__codelineno-58-18"></a><span class="w"> </span><span class="nx">state</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-58-19" id="__codelineno-58-19" name="__codelineno-58-19"></a><span class="p">}</span>
|
||
<a href="#__codelineno-58-20" id="__codelineno-58-20" name="__codelineno-58-20"></a>
|
||
<a href="#__codelineno-58-21" id="__codelineno-58-21" name="__codelineno-58-21"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-58-22" id="__codelineno-58-22" name="__codelineno-58-22"></a><span class="kd">function</span><span class="w"> </span><span class="nx">undoChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-58-23" id="__codelineno-58-23" name="__codelineno-58-23"></a><span class="w"> </span><span class="nx">state</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span>
|
||
<a href="#__codelineno-58-24" id="__codelineno-58-24" name="__codelineno-58-24"></a><span class="p">}</span>
|
||
<a href="#__codelineno-58-25" id="__codelineno-58-25" name="__codelineno-58-25"></a>
|
||
<a href="#__codelineno-58-26" id="__codelineno-58-26" name="__codelineno-58-26"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-58-27" id="__codelineno-58-27" name="__codelineno-58-27"></a><span class="kd">function</span><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choices</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-58-28" id="__codelineno-58-28" name="__codelineno-58-28"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-58-29" id="__codelineno-58-29" name="__codelineno-58-29"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">isSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-58-30" id="__codelineno-58-30" name="__codelineno-58-30"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-58-31" id="__codelineno-58-31" name="__codelineno-58-31"></a><span class="w"> </span><span class="nx">recordSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-58-32" id="__codelineno-58-32" name="__codelineno-58-32"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-58-33" id="__codelineno-58-33" name="__codelineno-58-33"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-58-34" id="__codelineno-58-34" name="__codelineno-58-34"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-58-35" id="__codelineno-58-35" name="__codelineno-58-35"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-58-36" id="__codelineno-58-36" name="__codelineno-58-36"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">isValid</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-58-37" id="__codelineno-58-37" name="__codelineno-58-37"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-58-38" id="__codelineno-58-38" name="__codelineno-58-38"></a><span class="w"> </span><span class="nx">makeChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-58-39" id="__codelineno-58-39" name="__codelineno-58-39"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-58-40" id="__codelineno-58-40" name="__codelineno-58-40"></a><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="nx">choice</span><span class="p">.</span><span class="nx">left</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">.</span><span class="nx">right</span><span class="p">],</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-58-41" id="__codelineno-58-41" name="__codelineno-58-41"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-58-42" id="__codelineno-58-42" name="__codelineno-58-42"></a><span class="w"> </span><span class="nx">undoChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">);</span>
|
||
<a href="#__codelineno-58-43" id="__codelineno-58-43" name="__codelineno-58-43"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-58-44" id="__codelineno-58-44" name="__codelineno-58-44"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-58-45" id="__codelineno-58-45" name="__codelineno-58-45"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.ts</span><pre><span></span><code><a href="#__codelineno-59-1" id="__codelineno-59-1" name="__codelineno-59-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-59-2" id="__codelineno-59-2" name="__codelineno-59-2"></a><span class="kd">function</span><span class="w"> </span><span class="nx">isSolution</span><span class="p">(</span><span class="nx">state</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[])</span><span class="o">:</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-59-3" id="__codelineno-59-3" name="__codelineno-59-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">state</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nx">state</span><span class="p">[</span><span class="nx">state</span><span class="p">.</span><span class="nx">length</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mf">1</span><span class="p">]</span><span class="o">?</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">===</span><span class="w"> </span><span class="mf">7</span><span class="p">;</span>
|
||
<a href="#__codelineno-59-4" id="__codelineno-59-4" name="__codelineno-59-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-59-5" id="__codelineno-59-5" name="__codelineno-59-5"></a>
|
||
<a href="#__codelineno-59-6" id="__codelineno-59-6" name="__codelineno-59-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-59-7" id="__codelineno-59-7" name="__codelineno-59-7"></a><span class="kd">function</span><span class="w"> </span><span class="nx">recordSolution</span><span class="p">(</span><span class="nx">state</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[],</span><span class="w"> </span><span class="nx">res</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[][])</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-59-8" id="__codelineno-59-8" name="__codelineno-59-8"></a><span class="w"> </span><span class="nx">res</span><span class="p">.</span><span class="nx">push</span><span class="p">([...</span><span class="nx">state</span><span class="p">]);</span>
|
||
<a href="#__codelineno-59-9" id="__codelineno-59-9" name="__codelineno-59-9"></a><span class="p">}</span>
|
||
<a href="#__codelineno-59-10" id="__codelineno-59-10" name="__codelineno-59-10"></a>
|
||
<a href="#__codelineno-59-11" id="__codelineno-59-11" name="__codelineno-59-11"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-59-12" id="__codelineno-59-12" name="__codelineno-59-12"></a><span class="kd">function</span><span class="w"> </span><span class="nx">isValid</span><span class="p">(</span><span class="nx">state</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[],</span><span class="w"> </span><span class="nx">choice</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="kt">boolean</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-59-13" id="__codelineno-59-13" name="__codelineno-59-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nx">choice</span><span class="p">.</span><span class="nx">val</span><span class="w"> </span><span class="o">!==</span><span class="w"> </span><span class="mf">3</span><span class="p">;</span>
|
||
<a href="#__codelineno-59-14" id="__codelineno-59-14" name="__codelineno-59-14"></a><span class="p">}</span>
|
||
<a href="#__codelineno-59-15" id="__codelineno-59-15" name="__codelineno-59-15"></a>
|
||
<a href="#__codelineno-59-16" id="__codelineno-59-16" name="__codelineno-59-16"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-59-17" id="__codelineno-59-17" name="__codelineno-59-17"></a><span class="kd">function</span><span class="w"> </span><span class="nx">makeChoice</span><span class="p">(</span><span class="nx">state</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[],</span><span class="w"> </span><span class="nx">choice</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-59-18" id="__codelineno-59-18" name="__codelineno-59-18"></a><span class="w"> </span><span class="nx">state</span><span class="p">.</span><span class="nx">push</span><span class="p">(</span><span class="nx">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-59-19" id="__codelineno-59-19" name="__codelineno-59-19"></a><span class="p">}</span>
|
||
<a href="#__codelineno-59-20" id="__codelineno-59-20" name="__codelineno-59-20"></a>
|
||
<a href="#__codelineno-59-21" id="__codelineno-59-21" name="__codelineno-59-21"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-59-22" id="__codelineno-59-22" name="__codelineno-59-22"></a><span class="kd">function</span><span class="w"> </span><span class="nx">undoChoice</span><span class="p">(</span><span class="nx">state</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[])</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-59-23" id="__codelineno-59-23" name="__codelineno-59-23"></a><span class="w"> </span><span class="nx">state</span><span class="p">.</span><span class="nx">pop</span><span class="p">();</span>
|
||
<a href="#__codelineno-59-24" id="__codelineno-59-24" name="__codelineno-59-24"></a><span class="p">}</span>
|
||
<a href="#__codelineno-59-25" id="__codelineno-59-25" name="__codelineno-59-25"></a>
|
||
<a href="#__codelineno-59-26" id="__codelineno-59-26" name="__codelineno-59-26"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-59-27" id="__codelineno-59-27" name="__codelineno-59-27"></a><span class="kd">function</span><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span>
|
||
<a href="#__codelineno-59-28" id="__codelineno-59-28" name="__codelineno-59-28"></a><span class="w"> </span><span class="nx">state</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[],</span>
|
||
<a href="#__codelineno-59-29" id="__codelineno-59-29" name="__codelineno-59-29"></a><span class="w"> </span><span class="nx">choices</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[],</span>
|
||
<a href="#__codelineno-59-30" id="__codelineno-59-30" name="__codelineno-59-30"></a><span class="w"> </span><span class="nx">res</span><span class="o">:</span><span class="w"> </span><span class="kt">TreeNode</span><span class="p">[][]</span>
|
||
<a href="#__codelineno-59-31" id="__codelineno-59-31" name="__codelineno-59-31"></a><span class="p">)</span><span class="o">:</span><span class="w"> </span><span class="ow">void</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-59-32" id="__codelineno-59-32" name="__codelineno-59-32"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-59-33" id="__codelineno-59-33" name="__codelineno-59-33"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">isSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-59-34" id="__codelineno-59-34" name="__codelineno-59-34"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-59-35" id="__codelineno-59-35" name="__codelineno-59-35"></a><span class="w"> </span><span class="nx">recordSolution</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-59-36" id="__codelineno-59-36" name="__codelineno-59-36"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-59-37" id="__codelineno-59-37" name="__codelineno-59-37"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-59-38" id="__codelineno-59-38" name="__codelineno-59-38"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kd">const</span><span class="w"> </span><span class="nx">choice</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="nx">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-59-39" id="__codelineno-59-39" name="__codelineno-59-39"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-59-40" id="__codelineno-59-40" name="__codelineno-59-40"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="nx">isValid</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-59-41" id="__codelineno-59-41" name="__codelineno-59-41"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-59-42" id="__codelineno-59-42" name="__codelineno-59-42"></a><span class="w"> </span><span class="nx">makeChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-59-43" id="__codelineno-59-43" name="__codelineno-59-43"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-59-44" id="__codelineno-59-44" name="__codelineno-59-44"></a><span class="w"> </span><span class="nx">backtrack</span><span class="p">(</span><span class="nx">state</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="nx">choice</span><span class="p">.</span><span class="nx">left</span><span class="p">,</span><span class="w"> </span><span class="nx">choice</span><span class="p">.</span><span class="nx">right</span><span class="p">],</span><span class="w"> </span><span class="nx">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-59-45" id="__codelineno-59-45" name="__codelineno-59-45"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-59-46" id="__codelineno-59-46" name="__codelineno-59-46"></a><span class="w"> </span><span class="nx">undoChoice</span><span class="p">(</span><span class="nx">state</span><span class="p">);</span>
|
||
<a href="#__codelineno-59-47" id="__codelineno-59-47" name="__codelineno-59-47"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-59-48" id="__codelineno-59-48" name="__codelineno-59-48"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-59-49" id="__codelineno-59-49" name="__codelineno-59-49"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.dart</span><pre><span></span><code><a href="#__codelineno-60-1" id="__codelineno-60-1" name="__codelineno-60-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-60-2" id="__codelineno-60-2" name="__codelineno-60-2"></a><span class="kt">bool</span><span class="w"> </span><span class="n">isSolution</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-60-3" id="__codelineno-60-3" name="__codelineno-60-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">isNotEmpty</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">last</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">7</span><span class="p">;</span>
|
||
<a href="#__codelineno-60-4" id="__codelineno-60-4" name="__codelineno-60-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-60-5" id="__codelineno-60-5" name="__codelineno-60-5"></a>
|
||
<a href="#__codelineno-60-6" id="__codelineno-60-6" name="__codelineno-60-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-60-7" id="__codelineno-60-7" name="__codelineno-60-7"></a><span class="kt">void</span><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-60-8" id="__codelineno-60-8" name="__codelineno-60-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">List</span><span class="p">.</span><span class="n">from</span><span class="p">(</span><span class="n">state</span><span class="p">));</span>
|
||
<a href="#__codelineno-60-9" id="__codelineno-60-9" name="__codelineno-60-9"></a><span class="p">}</span>
|
||
<a href="#__codelineno-60-10" id="__codelineno-60-10" name="__codelineno-60-10"></a>
|
||
<a href="#__codelineno-60-11" id="__codelineno-60-11" name="__codelineno-60-11"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-60-12" id="__codelineno-60-12" name="__codelineno-60-12"></a><span class="kt">bool</span><span class="w"> </span><span class="n">isValid</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-60-13" id="__codelineno-60-13" name="__codelineno-60-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="m">3</span><span class="p">;</span>
|
||
<a href="#__codelineno-60-14" id="__codelineno-60-14" name="__codelineno-60-14"></a><span class="p">}</span>
|
||
<a href="#__codelineno-60-15" id="__codelineno-60-15" name="__codelineno-60-15"></a>
|
||
<a href="#__codelineno-60-16" id="__codelineno-60-16" name="__codelineno-60-16"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-60-17" id="__codelineno-60-17" name="__codelineno-60-17"></a><span class="kt">void</span><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-60-18" id="__codelineno-60-18" name="__codelineno-60-18"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">add</span><span class="p">(</span><span class="n">choice</span><span class="o">!</span><span class="p">);</span>
|
||
<a href="#__codelineno-60-19" id="__codelineno-60-19" name="__codelineno-60-19"></a><span class="p">}</span>
|
||
<a href="#__codelineno-60-20" id="__codelineno-60-20" name="__codelineno-60-20"></a>
|
||
<a href="#__codelineno-60-21" id="__codelineno-60-21" name="__codelineno-60-21"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-60-22" id="__codelineno-60-22" name="__codelineno-60-22"></a><span class="kt">void</span><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-60-23" id="__codelineno-60-23" name="__codelineno-60-23"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">removeLast</span><span class="p">();</span>
|
||
<a href="#__codelineno-60-24" id="__codelineno-60-24" name="__codelineno-60-24"></a><span class="p">}</span>
|
||
<a href="#__codelineno-60-25" id="__codelineno-60-25" name="__codelineno-60-25"></a>
|
||
<a href="#__codelineno-60-26" id="__codelineno-60-26" name="__codelineno-60-26"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-60-27" id="__codelineno-60-27" name="__codelineno-60-27"></a><span class="kt">void</span><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span>
|
||
<a href="#__codelineno-60-28" id="__codelineno-60-28" name="__codelineno-60-28"></a><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">></span><span class="w"> </span><span class="n">state</span><span class="p">,</span>
|
||
<a href="#__codelineno-60-29" id="__codelineno-60-29" name="__codelineno-60-29"></a><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">?></span><span class="w"> </span><span class="n">choices</span><span class="p">,</span>
|
||
<a href="#__codelineno-60-30" id="__codelineno-60-30" name="__codelineno-60-30"></a><span class="w"> </span><span class="n">List</span><span class="o"><</span><span class="n">List</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="w"> </span><span class="n">res</span><span class="p">,</span>
|
||
<a href="#__codelineno-60-31" id="__codelineno-60-31" name="__codelineno-60-31"></a><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-60-32" id="__codelineno-60-32" name="__codelineno-60-32"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-60-33" id="__codelineno-60-33" name="__codelineno-60-33"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-60-34" id="__codelineno-60-34" name="__codelineno-60-34"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-60-35" id="__codelineno-60-35" name="__codelineno-60-35"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-60-36" id="__codelineno-60-36" name="__codelineno-60-36"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-60-37" id="__codelineno-60-37" name="__codelineno-60-37"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-60-38" id="__codelineno-60-38" name="__codelineno-60-38"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">TreeNode</span><span class="o">?</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-60-39" id="__codelineno-60-39" name="__codelineno-60-39"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-60-40" id="__codelineno-60-40" name="__codelineno-60-40"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-60-41" id="__codelineno-60-41" name="__codelineno-60-41"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-60-42" id="__codelineno-60-42" name="__codelineno-60-42"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-60-43" id="__codelineno-60-43" name="__codelineno-60-43"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-60-44" id="__codelineno-60-44" name="__codelineno-60-44"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="p">[</span><span class="n">choice</span><span class="o">!</span><span class="p">.</span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">right</span><span class="p">],</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-60-45" id="__codelineno-60-45" name="__codelineno-60-45"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-60-46" id="__codelineno-60-46" name="__codelineno-60-46"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-60-47" id="__codelineno-60-47" name="__codelineno-60-47"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-60-48" id="__codelineno-60-48" name="__codelineno-60-48"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-60-49" id="__codelineno-60-49" name="__codelineno-60-49"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.rs</span><pre><span></span><code><a href="#__codelineno-61-1" id="__codelineno-61-1" name="__codelineno-61-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-61-2" id="__codelineno-61-2" name="__codelineno-61-2"></a><span class="k">fn</span><span class="w"> </span><span class="nf">is_solution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">)</span><span class="w"> </span><span class="p">-></span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-61-3" id="__codelineno-61-3" name="__codelineno-61-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">!</span><span class="n">state</span><span class="p">.</span><span class="n">is_empty</span><span class="p">()</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">last</span><span class="p">().</span><span class="n">unwrap</span><span class="p">().</span><span class="n">borrow</span><span class="p">().</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">;</span>
|
||
<a href="#__codelineno-61-4" id="__codelineno-61-4" name="__codelineno-61-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-61-5" id="__codelineno-61-5" name="__codelineno-61-5"></a>
|
||
<a href="#__codelineno-61-6" id="__codelineno-61-6" name="__codelineno-61-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-61-7" id="__codelineno-61-7" name="__codelineno-61-7"></a><span class="k">fn</span><span class="w"> </span><span class="nf">record_solution</span><span class="p">(</span>
|
||
<a href="#__codelineno-61-8" id="__codelineno-61-8" name="__codelineno-61-8"></a><span class="w"> </span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-61-9" id="__codelineno-61-9" name="__codelineno-61-9"></a><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-61-10" id="__codelineno-61-10" name="__codelineno-61-10"></a><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-61-11" id="__codelineno-61-11" name="__codelineno-61-11"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">state</span><span class="p">.</span><span class="n">clone</span><span class="p">());</span>
|
||
<a href="#__codelineno-61-12" id="__codelineno-61-12" name="__codelineno-61-12"></a><span class="p">}</span>
|
||
<a href="#__codelineno-61-13" id="__codelineno-61-13" name="__codelineno-61-13"></a>
|
||
<a href="#__codelineno-61-14" id="__codelineno-61-14" name="__codelineno-61-14"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-61-15" id="__codelineno-61-15" name="__codelineno-61-15"></a><span class="k">fn</span><span class="w"> </span><span class="nf">is_valid</span><span class="p">(</span><span class="n">_</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="nb">Option</span><span class="o"><&</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">)</span><span class="w"> </span><span class="p">-></span><span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-61-16" id="__codelineno-61-16" name="__codelineno-61-16"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">is_some</span><span class="p">()</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">unwrap</span><span class="p">().</span><span class="n">borrow</span><span class="p">().</span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
|
||
<a href="#__codelineno-61-17" id="__codelineno-61-17" name="__codelineno-61-17"></a><span class="p">}</span>
|
||
<a href="#__codelineno-61-18" id="__codelineno-61-18" name="__codelineno-61-18"></a>
|
||
<a href="#__codelineno-61-19" id="__codelineno-61-19" name="__codelineno-61-19"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-61-20" id="__codelineno-61-20" name="__codelineno-61-20"></a><span class="k">fn</span><span class="w"> </span><span class="nf">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="nc">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-61-21" id="__codelineno-61-21" name="__codelineno-61-21"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-61-22" id="__codelineno-61-22" name="__codelineno-61-22"></a><span class="p">}</span>
|
||
<a href="#__codelineno-61-23" id="__codelineno-61-23" name="__codelineno-61-23"></a>
|
||
<a href="#__codelineno-61-24" id="__codelineno-61-24" name="__codelineno-61-24"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-61-25" id="__codelineno-61-25" name="__codelineno-61-25"></a><span class="k">fn</span><span class="w"> </span><span class="nf">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span><span class="w"> </span><span class="n">_</span><span class="p">:</span><span class="w"> </span><span class="nc">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>></span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-61-26" id="__codelineno-61-26" name="__codelineno-61-26"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
|
||
<a href="#__codelineno-61-27" id="__codelineno-61-27" name="__codelineno-61-27"></a><span class="p">}</span>
|
||
<a href="#__codelineno-61-28" id="__codelineno-61-28" name="__codelineno-61-28"></a>
|
||
<a href="#__codelineno-61-29" id="__codelineno-61-29" name="__codelineno-61-29"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-61-30" id="__codelineno-61-30" name="__codelineno-61-30"></a><span class="k">fn</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span>
|
||
<a href="#__codelineno-61-31" id="__codelineno-61-31" name="__codelineno-61-31"></a><span class="w"> </span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-61-32" id="__codelineno-61-32" name="__codelineno-61-32"></a><span class="w"> </span><span class="n">choices</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nb">Vec</span><span class="o"><</span><span class="nb">Option</span><span class="o"><&</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-61-33" id="__codelineno-61-33" name="__codelineno-61-33"></a><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="kp">&</span><span class="nc">mut</span><span class="w"> </span><span class="nb">Vec</span><span class="o"><</span><span class="nb">Vec</span><span class="o"><</span><span class="n">Rc</span><span class="o"><</span><span class="n">RefCell</span><span class="o"><</span><span class="n">TreeNode</span><span class="o">>>>></span><span class="p">,</span>
|
||
<a href="#__codelineno-61-34" id="__codelineno-61-34" name="__codelineno-61-34"></a><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-61-35" id="__codelineno-61-35" name="__codelineno-61-35"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-61-36" id="__codelineno-61-36" name="__codelineno-61-36"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_solution</span><span class="p">(</span><span class="n">state</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-61-37" id="__codelineno-61-37" name="__codelineno-61-37"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-61-38" id="__codelineno-61-38" name="__codelineno-61-38"></a><span class="w"> </span><span class="n">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">);</span>
|
||
<a href="#__codelineno-61-39" id="__codelineno-61-39" name="__codelineno-61-39"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-61-40" id="__codelineno-61-40" name="__codelineno-61-40"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-61-41" id="__codelineno-61-41" name="__codelineno-61-41"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="o">&</span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="p">.</span><span class="n">iter</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-61-42" id="__codelineno-61-42" name="__codelineno-61-42"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-61-43" id="__codelineno-61-43" name="__codelineno-61-43"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_valid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-61-44" id="__codelineno-61-44" name="__codelineno-61-44"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-61-45" id="__codelineno-61-45" name="__codelineno-61-45"></a><span class="w"> </span><span class="n">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">unwrap</span><span class="p">().</span><span class="n">clone</span><span class="p">());</span>
|
||
<a href="#__codelineno-61-46" id="__codelineno-61-46" name="__codelineno-61-46"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-61-47" id="__codelineno-61-47" name="__codelineno-61-47"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span>
|
||
<a href="#__codelineno-61-48" id="__codelineno-61-48" name="__codelineno-61-48"></a><span class="w"> </span><span class="n">state</span><span class="p">,</span>
|
||
<a href="#__codelineno-61-49" id="__codelineno-61-49" name="__codelineno-61-49"></a><span class="w"> </span><span class="o">&</span><span class="fm">vec!</span><span class="p">[</span>
|
||
<a href="#__codelineno-61-50" id="__codelineno-61-50" name="__codelineno-61-50"></a><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">unwrap</span><span class="p">().</span><span class="n">borrow</span><span class="p">().</span><span class="n">left</span><span class="p">.</span><span class="n">as_ref</span><span class="p">(),</span>
|
||
<a href="#__codelineno-61-51" id="__codelineno-61-51" name="__codelineno-61-51"></a><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">unwrap</span><span class="p">().</span><span class="n">borrow</span><span class="p">().</span><span class="n">right</span><span class="p">.</span><span class="n">as_ref</span><span class="p">(),</span>
|
||
<a href="#__codelineno-61-52" id="__codelineno-61-52" name="__codelineno-61-52"></a><span class="w"> </span><span class="p">],</span>
|
||
<a href="#__codelineno-61-53" id="__codelineno-61-53" name="__codelineno-61-53"></a><span class="w"> </span><span class="n">res</span><span class="p">,</span>
|
||
<a href="#__codelineno-61-54" id="__codelineno-61-54" name="__codelineno-61-54"></a><span class="w"> </span><span class="p">);</span>
|
||
<a href="#__codelineno-61-55" id="__codelineno-61-55" name="__codelineno-61-55"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-61-56" id="__codelineno-61-56" name="__codelineno-61-56"></a><span class="w"> </span><span class="n">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="n">unwrap</span><span class="p">().</span><span class="n">clone</span><span class="p">());</span>
|
||
<a href="#__codelineno-61-57" id="__codelineno-61-57" name="__codelineno-61-57"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-61-58" id="__codelineno-61-58" name="__codelineno-61-58"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-61-59" id="__codelineno-61-59" name="__codelineno-61-59"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.c</span><pre><span></span><code><a href="#__codelineno-62-1" id="__codelineno-62-1" name="__codelineno-62-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-62-2" id="__codelineno-62-2" name="__codelineno-62-2"></a><span class="kt">bool</span><span class="w"> </span><span class="nf">isSolution</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-3" id="__codelineno-62-3" name="__codelineno-62-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">pathSize</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">path</span><span class="p">[</span><span class="n">pathSize</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="p">]</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span><span class="p">;</span>
|
||
<a href="#__codelineno-62-4" id="__codelineno-62-4" name="__codelineno-62-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-62-5" id="__codelineno-62-5" name="__codelineno-62-5"></a>
|
||
<a href="#__codelineno-62-6" id="__codelineno-62-6" name="__codelineno-62-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-62-7" id="__codelineno-62-7" name="__codelineno-62-7"></a><span class="kt">void</span><span class="w"> </span><span class="nf">recordSolution</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-8" id="__codelineno-62-8" name="__codelineno-62-8"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">pathSize</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-9" id="__codelineno-62-9" name="__codelineno-62-9"></a><span class="w"> </span><span class="n">res</span><span class="p">[</span><span class="n">resSize</span><span class="p">][</span><span class="n">i</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">path</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
|
||
<a href="#__codelineno-62-10" id="__codelineno-62-10" name="__codelineno-62-10"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-62-11" id="__codelineno-62-11" name="__codelineno-62-11"></a><span class="w"> </span><span class="n">resSize</span><span class="o">++</span><span class="p">;</span>
|
||
<a href="#__codelineno-62-12" id="__codelineno-62-12" name="__codelineno-62-12"></a><span class="p">}</span>
|
||
<a href="#__codelineno-62-13" id="__codelineno-62-13" name="__codelineno-62-13"></a>
|
||
<a href="#__codelineno-62-14" id="__codelineno-62-14" name="__codelineno-62-14"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-62-15" id="__codelineno-62-15" name="__codelineno-62-15"></a><span class="kt">bool</span><span class="w"> </span><span class="nf">isValid</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-16" id="__codelineno-62-16" name="__codelineno-62-16"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="nb">NULL</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">choice</span><span class="o">-></span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">3</span><span class="p">;</span>
|
||
<a href="#__codelineno-62-17" id="__codelineno-62-17" name="__codelineno-62-17"></a><span class="p">}</span>
|
||
<a href="#__codelineno-62-18" id="__codelineno-62-18" name="__codelineno-62-18"></a>
|
||
<a href="#__codelineno-62-19" id="__codelineno-62-19" name="__codelineno-62-19"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-62-20" id="__codelineno-62-20" name="__codelineno-62-20"></a><span class="kt">void</span><span class="w"> </span><span class="nf">makeChoice</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">choice</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-21" id="__codelineno-62-21" name="__codelineno-62-21"></a><span class="w"> </span><span class="n">path</span><span class="p">[</span><span class="n">pathSize</span><span class="o">++</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">choice</span><span class="p">;</span>
|
||
<a href="#__codelineno-62-22" id="__codelineno-62-22" name="__codelineno-62-22"></a><span class="p">}</span>
|
||
<a href="#__codelineno-62-23" id="__codelineno-62-23" name="__codelineno-62-23"></a>
|
||
<a href="#__codelineno-62-24" id="__codelineno-62-24" name="__codelineno-62-24"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-62-25" id="__codelineno-62-25" name="__codelineno-62-25"></a><span class="kt">void</span><span class="w"> </span><span class="nf">undoChoice</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-26" id="__codelineno-62-26" name="__codelineno-62-26"></a><span class="w"> </span><span class="n">pathSize</span><span class="o">--</span><span class="p">;</span>
|
||
<a href="#__codelineno-62-27" id="__codelineno-62-27" name="__codelineno-62-27"></a><span class="p">}</span>
|
||
<a href="#__codelineno-62-28" id="__codelineno-62-28" name="__codelineno-62-28"></a>
|
||
<a href="#__codelineno-62-29" id="__codelineno-62-29" name="__codelineno-62-29"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-62-30" id="__codelineno-62-30" name="__codelineno-62-30"></a><span class="kt">void</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">choices</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-31" id="__codelineno-62-31" name="__codelineno-62-31"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-62-32" id="__codelineno-62-32" name="__codelineno-62-32"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">())</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-33" id="__codelineno-62-33" name="__codelineno-62-33"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-62-34" id="__codelineno-62-34" name="__codelineno-62-34"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">();</span>
|
||
<a href="#__codelineno-62-35" id="__codelineno-62-35" name="__codelineno-62-35"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-62-36" id="__codelineno-62-36" name="__codelineno-62-36"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-62-37" id="__codelineno-62-37" name="__codelineno-62-37"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="kt">int</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">2</span><span class="p">;</span><span class="w"> </span><span class="n">i</span><span class="o">++</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-38" id="__codelineno-62-38" name="__codelineno-62-38"></a><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">choice</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">choices</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
|
||
<a href="#__codelineno-62-39" id="__codelineno-62-39" name="__codelineno-62-39"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-62-40" id="__codelineno-62-40" name="__codelineno-62-40"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-62-41" id="__codelineno-62-41" name="__codelineno-62-41"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-62-42" id="__codelineno-62-42" name="__codelineno-62-42"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">choice</span><span class="p">);</span>
|
||
<a href="#__codelineno-62-43" id="__codelineno-62-43" name="__codelineno-62-43"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-62-44" id="__codelineno-62-44" name="__codelineno-62-44"></a><span class="w"> </span><span class="n">TreeNode</span><span class="w"> </span><span class="o">*</span><span class="n">nextChoices</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">{</span><span class="n">choice</span><span class="o">-></span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="o">-></span><span class="n">right</span><span class="p">};</span>
|
||
<a href="#__codelineno-62-45" id="__codelineno-62-45" name="__codelineno-62-45"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">nextChoices</span><span class="p">);</span>
|
||
<a href="#__codelineno-62-46" id="__codelineno-62-46" name="__codelineno-62-46"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-62-47" id="__codelineno-62-47" name="__codelineno-62-47"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">();</span>
|
||
<a href="#__codelineno-62-48" id="__codelineno-62-48" name="__codelineno-62-48"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-62-49" id="__codelineno-62-49" name="__codelineno-62-49"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-62-50" id="__codelineno-62-50" name="__codelineno-62-50"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.kt</span><pre><span></span><code><a href="#__codelineno-63-1" id="__codelineno-63-1" name="__codelineno-63-1"></a><span class="cm">/* 현재 상태가 해인지 판단 */</span>
|
||
<a href="#__codelineno-63-2" id="__codelineno-63-2" name="__codelineno-63-2"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o"><</span><span class="n">TreeNode?</span><span class="o">></span><span class="p">):</span><span class="w"> </span><span class="kt">Boolean</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-63-3" id="__codelineno-63-3" name="__codelineno-63-3"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="na">isNotEmpty</span><span class="p">()</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">state</span><span class="o">[</span><span class="n">state</span><span class="p">.</span><span class="na">size</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="m">1</span><span class="o">]?.</span><span class="na">_val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="m">7</span>
|
||
<a href="#__codelineno-63-4" id="__codelineno-63-4" name="__codelineno-63-4"></a><span class="p">}</span>
|
||
<a href="#__codelineno-63-5" id="__codelineno-63-5" name="__codelineno-63-5"></a>
|
||
<a href="#__codelineno-63-6" id="__codelineno-63-6" name="__codelineno-63-6"></a><span class="cm">/* 해를 기록한다 */</span>
|
||
<a href="#__codelineno-63-7" id="__codelineno-63-7" name="__codelineno-63-7"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o"><</span><span class="n">TreeNode?</span><span class="o">>?</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o"><</span><span class="n">MutableList</span><span class="o"><</span><span class="n">TreeNode?</span><span class="o">>?></span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-63-8" id="__codelineno-63-8" name="__codelineno-63-8"></a><span class="w"> </span><span class="n">res</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">state</span><span class="o">!!</span><span class="p">.</span><span class="na">toMutableList</span><span class="p">())</span>
|
||
<a href="#__codelineno-63-9" id="__codelineno-63-9" name="__codelineno-63-9"></a><span class="p">}</span>
|
||
<a href="#__codelineno-63-10" id="__codelineno-63-10" name="__codelineno-63-10"></a>
|
||
<a href="#__codelineno-63-11" id="__codelineno-63-11" name="__codelineno-63-11"></a><span class="cm">/* 현재 상태에서 해당 선택이 유효한지 판단 */</span>
|
||
<a href="#__codelineno-63-12" id="__codelineno-63-12" name="__codelineno-63-12"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o"><</span><span class="n">TreeNode?</span><span class="o">>?</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode?</span><span class="p">):</span><span class="w"> </span><span class="kt">Boolean</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-63-13" id="__codelineno-63-13" name="__codelineno-63-13"></a><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="kc">null</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="na">_val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="m">3</span>
|
||
<a href="#__codelineno-63-14" id="__codelineno-63-14" name="__codelineno-63-14"></a><span class="p">}</span>
|
||
<a href="#__codelineno-63-15" id="__codelineno-63-15" name="__codelineno-63-15"></a>
|
||
<a href="#__codelineno-63-16" id="__codelineno-63-16" name="__codelineno-63-16"></a><span class="cm">/* 상태 갱신 */</span>
|
||
<a href="#__codelineno-63-17" id="__codelineno-63-17" name="__codelineno-63-17"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o"><</span><span class="n">TreeNode?</span><span class="o">></span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode?</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-63-18" id="__codelineno-63-18" name="__codelineno-63-18"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="na">add</span><span class="p">(</span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-63-19" id="__codelineno-63-19" name="__codelineno-63-19"></a><span class="p">}</span>
|
||
<a href="#__codelineno-63-20" id="__codelineno-63-20" name="__codelineno-63-20"></a>
|
||
<a href="#__codelineno-63-21" id="__codelineno-63-21" name="__codelineno-63-21"></a><span class="cm">/* 상태 복원 */</span>
|
||
<a href="#__codelineno-63-22" id="__codelineno-63-22" name="__codelineno-63-22"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o"><</span><span class="n">TreeNode?</span><span class="o">></span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">:</span><span class="w"> </span><span class="n">TreeNode?</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-63-23" id="__codelineno-63-23" name="__codelineno-63-23"></a><span class="w"> </span><span class="n">state</span><span class="p">.</span><span class="na">removeLast</span><span class="p">()</span>
|
||
<a href="#__codelineno-63-24" id="__codelineno-63-24" name="__codelineno-63-24"></a><span class="p">}</span>
|
||
<a href="#__codelineno-63-25" id="__codelineno-63-25" name="__codelineno-63-25"></a>
|
||
<a href="#__codelineno-63-26" id="__codelineno-63-26" name="__codelineno-63-26"></a><span class="cm">/* 백트래킹 알고리즘: 예제 3 */</span>
|
||
<a href="#__codelineno-63-27" id="__codelineno-63-27" name="__codelineno-63-27"></a><span class="kd">fun</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span>
|
||
<a href="#__codelineno-63-28" id="__codelineno-63-28" name="__codelineno-63-28"></a><span class="w"> </span><span class="n">state</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o"><</span><span class="n">TreeNode?</span><span class="o">></span><span class="p">,</span>
|
||
<a href="#__codelineno-63-29" id="__codelineno-63-29" name="__codelineno-63-29"></a><span class="w"> </span><span class="n">choices</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o"><</span><span class="n">TreeNode?</span><span class="o">></span><span class="p">,</span>
|
||
<a href="#__codelineno-63-30" id="__codelineno-63-30" name="__codelineno-63-30"></a><span class="w"> </span><span class="n">res</span><span class="p">:</span><span class="w"> </span><span class="n">MutableList</span><span class="o"><</span><span class="n">MutableList</span><span class="o"><</span><span class="n">TreeNode?</span><span class="o">>?></span>
|
||
<a href="#__codelineno-63-31" id="__codelineno-63-31" name="__codelineno-63-31"></a><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-63-32" id="__codelineno-63-32" name="__codelineno-63-32"></a><span class="w"> </span><span class="c1">// 해인지 확인한다</span>
|
||
<a href="#__codelineno-63-33" id="__codelineno-63-33" name="__codelineno-63-33"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isSolution</span><span class="p">(</span><span class="n">state</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-63-34" id="__codelineno-63-34" name="__codelineno-63-34"></a><span class="w"> </span><span class="c1">// 해를 기록한다</span>
|
||
<a href="#__codelineno-63-35" id="__codelineno-63-35" name="__codelineno-63-35"></a><span class="w"> </span><span class="n">recordSolution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-63-36" id="__codelineno-63-36" name="__codelineno-63-36"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-63-37" id="__codelineno-63-37" name="__codelineno-63-37"></a><span class="w"> </span><span class="c1">// 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-63-38" id="__codelineno-63-38" name="__codelineno-63-38"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="p">(</span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-63-39" id="__codelineno-63-39" name="__codelineno-63-39"></a><span class="w"> </span><span class="c1">// 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-63-40" id="__codelineno-63-40" name="__codelineno-63-40"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">isValid</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">))</span><span class="w"> </span><span class="p">{</span>
|
||
<a href="#__codelineno-63-41" id="__codelineno-63-41" name="__codelineno-63-41"></a><span class="w"> </span><span class="c1">// 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-63-42" id="__codelineno-63-42" name="__codelineno-63-42"></a><span class="w"> </span><span class="n">makeChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-63-43" id="__codelineno-63-43" name="__codelineno-63-43"></a><span class="w"> </span><span class="c1">// 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-63-44" id="__codelineno-63-44" name="__codelineno-63-44"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">mutableListOf</span><span class="p">(</span><span class="n">choice</span><span class="o">!!</span><span class="p">.</span><span class="na">left</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">.</span><span class="na">right</span><span class="p">),</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-63-45" id="__codelineno-63-45" name="__codelineno-63-45"></a><span class="w"> </span><span class="c1">// 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-63-46" id="__codelineno-63-46" name="__codelineno-63-46"></a><span class="w"> </span><span class="n">undoChoice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-63-47" id="__codelineno-63-47" name="__codelineno-63-47"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-63-48" id="__codelineno-63-48" name="__codelineno-63-48"></a><span class="w"> </span><span class="p">}</span>
|
||
<a href="#__codelineno-63-49" id="__codelineno-63-49" name="__codelineno-63-49"></a><span class="p">}</span>
|
||
</code></pre></div>
|
||
</div>
|
||
<div class="tabbed-block">
|
||
<div class="highlight"><span class="filename">preorder_traversal_iii_template.rb</span><pre><span></span><code><a href="#__codelineno-64-1" id="__codelineno-64-1" name="__codelineno-64-1"></a><span class="c1">### 현재 상태가 해인지 판단 ###</span>
|
||
<a href="#__codelineno-64-2" id="__codelineno-64-2" name="__codelineno-64-2"></a><span class="k">def</span><span class="w"> </span><span class="nf">is_solution?</span><span class="p">(</span><span class="n">state</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-3" id="__codelineno-64-3" name="__codelineno-64-3"></a><span class="w"> </span><span class="o">!</span><span class="n">state</span><span class="o">.</span><span class="n">empty?</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">state</span><span class="o">.</span><span class="n">last</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">7</span>
|
||
<a href="#__codelineno-64-4" id="__codelineno-64-4" name="__codelineno-64-4"></a><span class="k">end</span>
|
||
<a href="#__codelineno-64-5" id="__codelineno-64-5" name="__codelineno-64-5"></a>
|
||
<a href="#__codelineno-64-6" id="__codelineno-64-6" name="__codelineno-64-6"></a><span class="c1">### 해를 기록한다 ###</span>
|
||
<a href="#__codelineno-64-7" id="__codelineno-64-7" name="__codelineno-64-7"></a><span class="k">def</span><span class="w"> </span><span class="nf">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-8" id="__codelineno-64-8" name="__codelineno-64-8"></a><span class="w"> </span><span class="n">res</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">state</span><span class="o">.</span><span class="n">dup</span>
|
||
<a href="#__codelineno-64-9" id="__codelineno-64-9" name="__codelineno-64-9"></a><span class="k">end</span>
|
||
<a href="#__codelineno-64-10" id="__codelineno-64-10" name="__codelineno-64-10"></a>
|
||
<a href="#__codelineno-64-11" id="__codelineno-64-11" name="__codelineno-64-11"></a><span class="c1">### 현재 상태에서 해당 선택이 유효한지 판단 ###</span>
|
||
<a href="#__codelineno-64-12" id="__codelineno-64-12" name="__codelineno-64-12"></a><span class="k">def</span><span class="w"> </span><span class="nf">is_valid?</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-13" id="__codelineno-64-13" name="__codelineno-64-13"></a><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">choice</span><span class="o">.</span><span class="n">val</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="mi">3</span>
|
||
<a href="#__codelineno-64-14" id="__codelineno-64-14" name="__codelineno-64-14"></a><span class="k">end</span>
|
||
<a href="#__codelineno-64-15" id="__codelineno-64-15" name="__codelineno-64-15"></a>
|
||
<a href="#__codelineno-64-16" id="__codelineno-64-16" name="__codelineno-64-16"></a><span class="c1">### 상태 갱신 ###</span>
|
||
<a href="#__codelineno-64-17" id="__codelineno-64-17" name="__codelineno-64-17"></a><span class="k">def</span><span class="w"> </span><span class="nf">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-18" id="__codelineno-64-18" name="__codelineno-64-18"></a><span class="w"> </span><span class="n">state</span><span class="w"> </span><span class="o"><<</span><span class="w"> </span><span class="n">choice</span>
|
||
<a href="#__codelineno-64-19" id="__codelineno-64-19" name="__codelineno-64-19"></a><span class="k">end</span>
|
||
<a href="#__codelineno-64-20" id="__codelineno-64-20" name="__codelineno-64-20"></a>
|
||
<a href="#__codelineno-64-21" id="__codelineno-64-21" name="__codelineno-64-21"></a><span class="c1">### 상태 복원 ###</span>
|
||
<a href="#__codelineno-64-22" id="__codelineno-64-22" name="__codelineno-64-22"></a><span class="k">def</span><span class="w"> </span><span class="nf">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-23" id="__codelineno-64-23" name="__codelineno-64-23"></a><span class="w"> </span><span class="n">state</span><span class="o">.</span><span class="n">pop</span>
|
||
<a href="#__codelineno-64-24" id="__codelineno-64-24" name="__codelineno-64-24"></a><span class="k">end</span>
|
||
<a href="#__codelineno-64-25" id="__codelineno-64-25" name="__codelineno-64-25"></a>
|
||
<a href="#__codelineno-64-26" id="__codelineno-64-26" name="__codelineno-64-26"></a><span class="c1">### 백트래킹 알고리즘: 예제 3 ###</span>
|
||
<a href="#__codelineno-64-27" id="__codelineno-64-27" name="__codelineno-64-27"></a><span class="k">def</span><span class="w"> </span><span class="nf">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choices</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-28" id="__codelineno-64-28" name="__codelineno-64-28"></a><span class="w"> </span><span class="c1"># 해인지 확인한다</span>
|
||
<a href="#__codelineno-64-29" id="__codelineno-64-29" name="__codelineno-64-29"></a><span class="w"> </span><span class="n">record_solution</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_solution?</span><span class="p">(</span><span class="n">state</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-30" id="__codelineno-64-30" name="__codelineno-64-30"></a>
|
||
<a href="#__codelineno-64-31" id="__codelineno-64-31" name="__codelineno-64-31"></a><span class="w"> </span><span class="c1"># 모든 선택지를 순회한다</span>
|
||
<a href="#__codelineno-64-32" id="__codelineno-64-32" name="__codelineno-64-32"></a><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">choice</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">choices</span>
|
||
<a href="#__codelineno-64-33" id="__codelineno-64-33" name="__codelineno-64-33"></a><span class="w"> </span><span class="c1"># 가지치기: 선택이 유효한지 확인한다</span>
|
||
<a href="#__codelineno-64-34" id="__codelineno-64-34" name="__codelineno-64-34"></a><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">is_valid?</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-35" id="__codelineno-64-35" name="__codelineno-64-35"></a><span class="w"> </span><span class="c1"># 시도: 선택하고 상태를 갱신한다</span>
|
||
<a href="#__codelineno-64-36" id="__codelineno-64-36" name="__codelineno-64-36"></a><span class="w"> </span><span class="n">make_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-37" id="__codelineno-64-37" name="__codelineno-64-37"></a><span class="w"> </span><span class="c1"># 다음 선택을 진행한다</span>
|
||
<a href="#__codelineno-64-38" id="__codelineno-64-38" name="__codelineno-64-38"></a><span class="w"> </span><span class="n">backtrack</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="o">[</span><span class="n">choice</span><span class="o">.</span><span class="n">left</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="o">.</span><span class="n">right</span><span class="o">]</span><span class="p">,</span><span class="w"> </span><span class="n">res</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-39" id="__codelineno-64-39" name="__codelineno-64-39"></a><span class="w"> </span><span class="c1"># 되돌리기: 선택을 취소하고 이전 상태로 되돌린다</span>
|
||
<a href="#__codelineno-64-40" id="__codelineno-64-40" name="__codelineno-64-40"></a><span class="w"> </span><span class="n">undo_choice</span><span class="p">(</span><span class="n">state</span><span class="p">,</span><span class="w"> </span><span class="n">choice</span><span class="p">)</span>
|
||
<a href="#__codelineno-64-41" id="__codelineno-64-41" name="__codelineno-64-41"></a><span class="w"> </span><span class="k">end</span>
|
||
<a href="#__codelineno-64-42" id="__codelineno-64-42" name="__codelineno-64-42"></a><span class="w"> </span><span class="k">end</span>
|
||
<a href="#__codelineno-64-43" id="__codelineno-64-43" name="__codelineno-64-43"></a><span class="k">end</span>
|
||
</code></pre></div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<details class="pythontutor">
|
||
<summary>코드 시각화</summary>
|
||
<p><div style="height: 549px; width: 100%;"><iframe class="pythontutor-iframe" src="https://pythontutor.com/iframe-embed.html#code=class%20TreeNode%3A%0A%20%22%22%22%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%20%EB%85%B8%EB%93%9C%20%ED%81%B4%EB%9E%98%EC%8A%A4%22%22%22%0A%0A%20def%20__init__%28self,%20val%3A%20int%20%3D%200%29%3A%0A%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%EB%85%B8%EB%93%9C%20%EA%B0%92%0A%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%99%BC%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D,%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%3A%20%EC%9E%AC%EA%B7%80%22%22%22%0A%20%23%20%EC%9D%B8%EB%8D%B1%EC%8A%A4%EA%B0%80%20%EB%B0%B0%EC%97%B4%20%EA%B8%B8%EC%9D%B4%EB%A5%BC%20%EB%B2%97%EC%96%B4%EB%82%98%EA%B1%B0%EB%82%98%20%ED%95%B4%EB%8B%B9%20%EC%9B%90%EC%86%8C%EA%B0%80%20None%EC%9D%B4%EB%A9%B4%20None%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4%0A%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20return%20None%0A%20%23%20%ED%98%84%EC%9E%AC%20%EB%85%B8%EB%93%9C%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%23%20%EC%99%BC%EC%AA%BD%EA%B3%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%84%9C%EB%B8%8C%ED%8A%B8%EB%A6%AC%EB%A5%BC%20%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20root.left%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%201%29%0A%20root.right%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%202%29%0A%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%22%22%22%0A%20return%20list_to_tree_dfs%28arr,%200%29%0A%0A%0Adef%20is_solution%28state%3A%20list%5BTreeNode%5D%29%20-%3E%20bool%3A%0A%20%22%22%22%ED%98%84%EC%9E%AC%20%EC%83%81%ED%83%9C%EA%B0%80%20%ED%95%B4%EC%9D%B8%EC%A7%80%20%ED%8C%90%EB%8B%A8%22%22%22%0A%20return%20state%20and%20state%5B-1%5D.val%20%3D%3D%207%0A%0Adef%20record_solution%28state%3A%20list%5BTreeNode%5D,%20res%3A%20list%5Blist%5BTreeNode%5D%5D%29%3A%0A%20%22%22%22%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%22%22%22%0A%20res.append%28list%28state%29%29%0A%0Adef%20is_valid%28state%3A%20list%5BTreeNode%5D,%20choice%3A%20TreeNode%29%20-%3E%20bool%3A%0A%20%22%22%22%ED%98%84%EC%9E%AC%20%EC%83%81%ED%83%9C%EC%97%90%EC%84%9C%20%ED%95%B4%EB%8B%B9%20%EC%84%A0%ED%83%9D%EC%9D%B4%20%EC%9C%A0%ED%9A%A8%ED%95%9C%EC%A7%80%20%ED%8C%90%EB%8B%A8%22%22%22%0A%20return%20choice%20is%20not%20None%20and%20choice.val%20%21%3D%203%0A%0Adef%20make_choice%28state%3A%20list%5BTreeNode%5D,%20choice%3A%20TreeNode%29%3A%0A%20%22%22%22%EC%83%81%ED%83%9C%20%EA%B0%B1%EC%8B%A0%22%22%22%0A%20state.append%28choice%29%0A%0Adef%20undo_choice%28state%3A%20list%5BTreeNode%5D,%20choice%3A%20TreeNode%29%3A%0A%20%22%22%22%EC%83%81%ED%83%9C%20%EB%B3%B5%EC%9B%90%22%22%22%0A%20state.pop%28%29%0A%0Adef%20backtrack%28%0A%20state%3A%20list%5BTreeNode%5D,%20choices%3A%20list%5BTreeNode%5D,%20res%3A%20list%5Blist%5BTreeNode%5D%5D%0A%29%3A%0A%20%22%22%22%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%3A%20%EC%98%88%EC%A0%9C%203%22%22%22%0A%20%23%20%ED%95%B4%EC%9D%B8%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4%0A%20if%20is_solution%28state%29%3A%0A%20%20%23%20%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%0A%20%20record_solution%28state,%20res%29%0A%20%23%20%EB%AA%A8%EB%93%A0%20%EC%84%A0%ED%83%9D%EC%A7%80%EB%A5%BC%20%EC%88%9C%ED%9A%8C%ED%95%9C%EB%8B%A4%0A%20for%20choice%20in%20choices%3A%0A%20%20%23%20%EA%B0%80%EC%A7%80%EC%B9%98%EA%B8%B0%3A%20%EC%84%A0%ED%83%9D%EC%9D%B4%20%EC%9C%A0%ED%9A%A8%ED%95%9C%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4%0A%20%20if%20is_valid%28state,%20choice%29%3A%0A%20%20%20%23%20%EC%8B%9C%EB%8F%84%3A%20%EC%84%A0%ED%83%9D%ED%95%98%EA%B3%A0%20%EC%83%81%ED%83%9C%EB%A5%BC%20%EA%B0%B1%EC%8B%A0%ED%95%9C%EB%8B%A4%0A%20%20%20make_choice%28state,%20choice%29%0A%20%20%20%23%20%EB%8B%A4%EC%9D%8C%20%EC%84%A0%ED%83%9D%EC%9D%84%20%EC%A7%84%ED%96%89%ED%95%9C%EB%8B%A4%0A%20%20%20backtrack%28state,%20%5Bchoice.left,%20choice.right%5D,%20res%29%0A%20%20%20%23%20%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0%3A%20%EC%84%A0%ED%83%9D%EC%9D%84%20%EC%B7%A8%EC%86%8C%ED%95%98%EA%B3%A0%20%EC%9D%B4%EC%A0%84%20%EC%83%81%ED%83%9C%EB%A1%9C%20%EB%90%98%EB%8F%8C%EB%A6%B0%EB%8B%A4%0A%20%20%20undo_choice%28state,%20choice%29%0A%0A%22%22%22%EC%8B%A4%ED%96%89%20%EC%BD%94%EB%93%9C%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20root%20%3D%20list_to_tree%28%5B1,%207,%203,%204,%205,%206,%207%5D%29%0A%0A%20%23%20%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%0A%20res%20%3D%20%5B%5D%0A%20backtrack%28state%3D%5B%5D,%20choices%3D%5Broot%5D,%20res%3Dres%29%0A%20print%28%22%5Cn%EB%AA%A8%EB%93%A0%20%EA%B2%BD%EB%A1%9C%20%EC%B6%9C%EB%A0%A5%22%29%0A%20for%20path%20in%20res%3A%0A%20%20print%28%5Bnode.val%20for%20node%20in%20path%5D%29&codeDivHeight=472&codeDivWidth=350&cumulative=false&curInstr=138&heapPrimitives=nevernest&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false" title="코드 시각화"> </iframe></div>
|
||
<div style="margin-top: 5px;"><a href="https://pythontutor.com/iframe-embed.html#code=class%20TreeNode%3A%0A%20%22%22%22%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%20%EB%85%B8%EB%93%9C%20%ED%81%B4%EB%9E%98%EC%8A%A4%22%22%22%0A%0A%20def%20__init__%28self,%20val%3A%20int%20%3D%200%29%3A%0A%20%20self.val%3A%20int%20%3D%20val%20%20%23%20%EB%85%B8%EB%93%9C%20%EA%B0%92%0A%20%20self.left%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%99%BC%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%20%20self.right%3A%20TreeNode%20%7C%20None%20%3D%20None%20%20%23%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%9E%90%EC%8B%9D%20%EB%85%B8%EB%93%9C%20%EC%B0%B8%EC%A1%B0%0A%0Adef%20list_to_tree_dfs%28arr%3A%20list%5Bint%5D,%20i%3A%20int%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%3A%20%EC%9E%AC%EA%B7%80%22%22%22%0A%20%23%20%EC%9D%B8%EB%8D%B1%EC%8A%A4%EA%B0%80%20%EB%B0%B0%EC%97%B4%20%EA%B8%B8%EC%9D%B4%EB%A5%BC%20%EB%B2%97%EC%96%B4%EB%82%98%EA%B1%B0%EB%82%98%20%ED%95%B4%EB%8B%B9%20%EC%9B%90%EC%86%8C%EA%B0%80%20None%EC%9D%B4%EB%A9%B4%20None%EC%9D%84%20%EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4%0A%20if%20i%20%3C%200%20or%20i%20%3E%3D%20len%28arr%29%20or%20arr%5Bi%5D%20is%20None%3A%0A%20%20return%20None%0A%20%23%20%ED%98%84%EC%9E%AC%20%EB%85%B8%EB%93%9C%EB%A5%BC%20%EC%83%9D%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20root%20%3D%20TreeNode%28arr%5Bi%5D%29%0A%20%23%20%EC%99%BC%EC%AA%BD%EA%B3%BC%20%EC%98%A4%EB%A5%B8%EC%AA%BD%20%EC%84%9C%EB%B8%8C%ED%8A%B8%EB%A6%AC%EB%A5%BC%20%EC%9E%AC%EA%B7%80%EC%A0%81%EC%9C%BC%EB%A1%9C%20%EA%B5%AC%EC%84%B1%ED%95%9C%EB%8B%A4%0A%20root.left%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%201%29%0A%20root.right%20%3D%20list_to_tree_dfs%28arr,%202%20%2A%20i%20%2B%202%29%0A%20return%20root%0A%0Adef%20list_to_tree%28arr%3A%20list%5Bint%5D%29%20-%3E%20TreeNode%20%7C%20None%3A%0A%20%22%22%22%EB%A6%AC%EC%8A%A4%ED%8A%B8%EB%A5%BC%20%EC%9D%B4%EC%A7%84%20%ED%8A%B8%EB%A6%AC%EB%A1%9C%20%EC%97%AD%EC%A7%81%EB%A0%AC%ED%99%94%22%22%22%0A%20return%20list_to_tree_dfs%28arr,%200%29%0A%0A%0Adef%20is_solution%28state%3A%20list%5BTreeNode%5D%29%20-%3E%20bool%3A%0A%20%22%22%22%ED%98%84%EC%9E%AC%20%EC%83%81%ED%83%9C%EA%B0%80%20%ED%95%B4%EC%9D%B8%EC%A7%80%20%ED%8C%90%EB%8B%A8%22%22%22%0A%20return%20state%20and%20state%5B-1%5D.val%20%3D%3D%207%0A%0Adef%20record_solution%28state%3A%20list%5BTreeNode%5D,%20res%3A%20list%5Blist%5BTreeNode%5D%5D%29%3A%0A%20%22%22%22%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%22%22%22%0A%20res.append%28list%28state%29%29%0A%0Adef%20is_valid%28state%3A%20list%5BTreeNode%5D,%20choice%3A%20TreeNode%29%20-%3E%20bool%3A%0A%20%22%22%22%ED%98%84%EC%9E%AC%20%EC%83%81%ED%83%9C%EC%97%90%EC%84%9C%20%ED%95%B4%EB%8B%B9%20%EC%84%A0%ED%83%9D%EC%9D%B4%20%EC%9C%A0%ED%9A%A8%ED%95%9C%EC%A7%80%20%ED%8C%90%EB%8B%A8%22%22%22%0A%20return%20choice%20is%20not%20None%20and%20choice.val%20%21%3D%203%0A%0Adef%20make_choice%28state%3A%20list%5BTreeNode%5D,%20choice%3A%20TreeNode%29%3A%0A%20%22%22%22%EC%83%81%ED%83%9C%20%EA%B0%B1%EC%8B%A0%22%22%22%0A%20state.append%28choice%29%0A%0Adef%20undo_choice%28state%3A%20list%5BTreeNode%5D,%20choice%3A%20TreeNode%29%3A%0A%20%22%22%22%EC%83%81%ED%83%9C%20%EB%B3%B5%EC%9B%90%22%22%22%0A%20state.pop%28%29%0A%0Adef%20backtrack%28%0A%20state%3A%20list%5BTreeNode%5D,%20choices%3A%20list%5BTreeNode%5D,%20res%3A%20list%5Blist%5BTreeNode%5D%5D%0A%29%3A%0A%20%22%22%22%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%3A%20%EC%98%88%EC%A0%9C%203%22%22%22%0A%20%23%20%ED%95%B4%EC%9D%B8%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4%0A%20if%20is_solution%28state%29%3A%0A%20%20%23%20%ED%95%B4%EB%A5%BC%20%EA%B8%B0%EB%A1%9D%ED%95%9C%EB%8B%A4%0A%20%20record_solution%28state,%20res%29%0A%20%23%20%EB%AA%A8%EB%93%A0%20%EC%84%A0%ED%83%9D%EC%A7%80%EB%A5%BC%20%EC%88%9C%ED%9A%8C%ED%95%9C%EB%8B%A4%0A%20for%20choice%20in%20choices%3A%0A%20%20%23%20%EA%B0%80%EC%A7%80%EC%B9%98%EA%B8%B0%3A%20%EC%84%A0%ED%83%9D%EC%9D%B4%20%EC%9C%A0%ED%9A%A8%ED%95%9C%EC%A7%80%20%ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4%0A%20%20if%20is_valid%28state,%20choice%29%3A%0A%20%20%20%23%20%EC%8B%9C%EB%8F%84%3A%20%EC%84%A0%ED%83%9D%ED%95%98%EA%B3%A0%20%EC%83%81%ED%83%9C%EB%A5%BC%20%EA%B0%B1%EC%8B%A0%ED%95%9C%EB%8B%A4%0A%20%20%20make_choice%28state,%20choice%29%0A%20%20%20%23%20%EB%8B%A4%EC%9D%8C%20%EC%84%A0%ED%83%9D%EC%9D%84%20%EC%A7%84%ED%96%89%ED%95%9C%EB%8B%A4%0A%20%20%20backtrack%28state,%20%5Bchoice.left,%20choice.right%5D,%20res%29%0A%20%20%20%23%20%EB%90%98%EB%8F%8C%EB%A6%AC%EA%B8%B0%3A%20%EC%84%A0%ED%83%9D%EC%9D%84%20%EC%B7%A8%EC%86%8C%ED%95%98%EA%B3%A0%20%EC%9D%B4%EC%A0%84%20%EC%83%81%ED%83%9C%EB%A1%9C%20%EB%90%98%EB%8F%8C%EB%A6%B0%EB%8B%A4%0A%20%20%20undo_choice%28state,%20choice%29%0A%0A%22%22%22%EC%8B%A4%ED%96%89%20%EC%BD%94%EB%93%9C%22%22%22%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20root%20%3D%20list_to_tree%28%5B1,%207,%203,%204,%205,%206,%207%5D%29%0A%0A%20%23%20%EB%B0%B1%ED%8A%B8%EB%9E%98%ED%82%B9%20%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98%0A%20res%20%3D%20%5B%5D%0A%20backtrack%28state%3D%5B%5D,%20choices%3D%5Broot%5D,%20res%3Dres%29%0A%20print%28%22%5Cn%EB%AA%A8%EB%93%A0%20%EA%B2%BD%EB%A1%9C%20%EC%B6%9C%EB%A0%A5%22%29%0A%20for%20path%20in%20res%3A%0A%20%20print%28%5Bnode.val%20for%20node%20in%20path%5D%29&codeDivHeight=800&codeDivWidth=600&cumulative=false&curInstr=138&heapPrimitives=nevernest&origin=opt-frontend.js&py=311&rawInputLstJSON=%5B%5D&textReferences=false" rel="noopener noreferrer" target="_blank">전체 화면 ></a></div></p>
|
||
</details>
|
||
<p>문제의 요구에 따르면 값이 <span class="arithmatex">\(7\)</span>인 노드를 찾은 뒤에도 탐색을 계속해야 한다. <strong>따라서 해를 기록한 뒤의 <code>return</code> 문을 삭제해야 한다</strong>. 아래 그림(13-4)은 <code>return</code> 문을 유지하거나 삭제했을 때의 탐색 과정을 비교한다.</p>
|
||
<p><ha-svg-figure class="animation-figure" data-book-key="ko/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.png" data-dark-src="/assets/figure-svg/figures/d3a34c4f3a481b1b481b7f1c.json" data-src="/assets/figure-svg/figures/47e9e20bd80765f4f7c5a3b7.json" style=";--figure-ratio:960.0/540.0"><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.svg" data-theme="light" tabindex="-1" type="image/svg+xml">return 유지 여부에 따른 탐색 과정 비교</object><object data="/ko/chapter_backtracking/backtracking_algorithm.assets/backtrack_remove_return_or_not.dark.svg" data-theme="dark" tabindex="-1" type="image/svg+xml">return 유지 여부에 따른 탐색 과정 비교</object></ha-svg-figure></p>
|
||
<p align="center"> 그림 13-4 return 유지 여부에 따른 탐색 과정 비교 </p>
|
||
<p>전위 순회 기반 코드에 비해 백트래킹 기본 틀을 사용한 코드는 다소 장황하지만 범용성이 더 좋다. 실제로 <strong>많은 백트래킹 문제를 이 틀 안에서 해결할 수 있다</strong>. 구체적인 문제에 맞게 <code>state</code>와 <code>choices</code>를 정의하고, 틀 안의 각 메서드만 구현하면 된다.</p>
|
||
<h2 id="1314">13.1.4 주요 용어<a class="headerlink" href="#1314" title="고유 링크">¶</a></h2>
|
||
<p>알고리즘 문제를 더 명확히 분석하기 위해 백트래킹에서 자주 쓰는 용어를 정리하고, 예제 3에 대응하는 사례를 아래 표(13-1)에 나타냈다.</p>
|
||
<p align="center"> 표 13-1 백트래킹 알고리즘의 주요 용어 </p>
|
||
<div class="center-table">
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>용어</th>
|
||
<th>정의</th>
|
||
<th>예제 3</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody>
|
||
<tr>
|
||
<td>해(solution)</td>
|
||
<td>문제의 특정 조건을 만족하는 답으로, 하나 또는 여러 개일 수 있다</td>
|
||
<td>루트 노드에서 노드 <span class="arithmatex">\(7\)</span>까지 제약 조건을 만족하는 모든 경로</td>
|
||
</tr>
|
||
<tr>
|
||
<td>제약 조건(constraint)</td>
|
||
<td>해의 유효성을 제한하는 조건으로, 보통 가지치기에 사용한다</td>
|
||
<td>경로에 노드 <span class="arithmatex">\(3\)</span>이 포함되지 않는다</td>
|
||
</tr>
|
||
<tr>
|
||
<td>상태(state)</td>
|
||
<td>이미 내린 선택을 포함하여 특정 시점의 문제 상황을 나타낸다</td>
|
||
<td>현재까지 방문한 노드의 경로, 즉 노드 리스트 <code>path</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td>시도(attempt)</td>
|
||
<td>가능한 선택으로 해 공간을 탐색하는 과정으로, 선택, 상태 갱신, 해인지 확인하는 작업을 포함한다</td>
|
||
<td>왼쪽(오른쪽) 자식 노드를 재귀적으로 방문하고 <code>path</code>에 추가한 뒤 값이 <span class="arithmatex">\(7\)</span>인지 확인한다</td>
|
||
</tr>
|
||
<tr>
|
||
<td>되돌리기(backtracking)</td>
|
||
<td>제약 조건을 만족하지 않는 상태를 만나면 이전 선택을 취소하고 직전 상태로 돌아간다</td>
|
||
<td>리프 노드를 지나거나 노드 방문을 마치거나 값이 <span class="arithmatex">\(3\)</span>인 노드를 만나면 탐색을 멈추고 함수가 반환된다</td>
|
||
</tr>
|
||
<tr>
|
||
<td>가지치기(pruning)</td>
|
||
<td>문제의 특성과 제약 조건에 따라 의미 없는 탐색 경로를 피하여 효율을 높이는 방법이다</td>
|
||
<td>값이 <span class="arithmatex">\(3\)</span>인 노드를 만나면 탐색을 더 진행하지 않는다</td>
|
||
</tr>
|
||
</tbody>
|
||
</table>
|
||
</div>
|
||
<div class="admonition tip">
|
||
<p class="admonition-title">참고</p>
|
||
<p>문제, 해, 상태 등의 개념은 분할 정복, 백트래킹, 동적 계획법, 탐욕 알고리즘 등에서 공통으로 사용된다.</p>
|
||
</div>
|
||
<h2 id="1315">13.1.5 장점과 한계<a class="headerlink" href="#1315" title="고유 링크">¶</a></h2>
|
||
<p>백트래킹은 본질적으로 깊이 우선 탐색 알고리즘으로, 조건을 만족하는 해를 찾을 때까지 가능한 모든 해결 방법을 시도한다. 모든 가능한 해를 찾을 수 있으며, 적절히 가지치기하면 매우 효율적이라는 장점이 있다.</p>
|
||
<p>하지만 규모가 크거나 복잡한 문제에서는 <strong>백트래킹의 실행 효율을 받아들이기 어려울 수 있다</strong>.</p>
|
||
<ul>
|
||
<li><strong>시간</strong>: 상태 공간의 모든 가능성을 순회해야 하는 경우가 많아 시간 복잡도가 지수 또는 팩토리얼 수준에 이를 수 있다.</li>
|
||
<li><strong>공간</strong>: 재귀 호출 중 현재 상태(경로, 가지치기용 보조 변수 등)를 저장해야 하므로 깊이가 크면 공간 요구량도 매우 커질 수 있다.</li>
|
||
</ul>
|
||
<p>그렇더라도 <strong>일부 탐색 문제와 제약 만족 문제에서는 백트래킹이 여전히 최선의 해결 방법이다</strong>. 어떤 선택이 유효한 해를 만들지 예측할 수 없으므로 가능한 모든 선택을 순회해야 하기 때문이다. 이때는 <strong>효율을 어떻게 최적화하느냐가 핵심</strong>이며, 대표적인 방법은 두 가지다.</p>
|
||
<ul>
|
||
<li><strong>가지치기</strong>: 해가 나올 수 없는 경로를 탐색하지 않아 시간과 공간을 절약한다.</li>
|
||
<li><strong>휴리스틱 탐색</strong>: 탐색에 전략이나 추정값을 도입하여 유효한 해가 나올 가능성이 높은 경로를 먼저 탐색한다.</li>
|
||
</ul>
|
||
<h2 id="1316">13.1.6 대표적인 백트래킹 문제<a class="headerlink" href="#1316" title="고유 링크">¶</a></h2>
|
||
<p>백트래킹은 많은 탐색 문제, 제약 만족 문제, 조합 최적화 문제를 해결하는 데 사용할 수 있다.</p>
|
||
<p><strong>탐색 문제</strong>: 특정 조건을 만족하는 해결 방법을 찾는 것이 목표다.</p>
|
||
<ul>
|
||
<li>모든 순열 문제: 집합이 주어졌을 때 가능한 모든 배열 순서를 구한다.</li>
|
||
<li>부분 집합 합 문제: 집합과 목표 합이 주어졌을 때 원소의 합이 목표 합인 모든 부분 집합을 찾는다.</li>
|
||
<li>하노이의 탑 문제: 기둥 세 개와 크기가 다른 원판들이 주어졌을 때 모든 원판을 한 기둥에서 다른 기둥으로 옮긴다. 한 번에 하나만 옮길 수 있고 큰 원판을 작은 원판 위에 놓으면 안 된다.</li>
|
||
</ul>
|
||
<p><strong>제약 만족 문제</strong>: 모든 제약 조건을 만족하는 해를 찾는 것이 목표다.</p>
|
||
<ul>
|
||
<li><span class="arithmatex">\(n\)</span>-퀸: <span class="arithmatex">\(n \times n\)</span> 체스판에 퀸 <span class="arithmatex">\(n\)</span> 개를 서로 공격하지 않도록 놓는다.</li>
|
||
<li>스도쿠: <span class="arithmatex">\(9 \times 9\)</span> 격자에 <span class="arithmatex">\(1\)</span> ~ <span class="arithmatex">\(9\)</span>를 넣되, 각 행과 열 및 각 <span class="arithmatex">\(3 \times 3\)</span> 부분 격자에서 숫자가 중복되지 않게 한다.</li>
|
||
<li>그래프 색칠 문제: 무방향 그래프의 각 정점을 가능한 한 적은 색으로 칠하되, 인접한 정점은 서로 다른 색을 갖게 한다.</li>
|
||
</ul>
|
||
<p><strong>조합 최적화 문제</strong>: 조합 공간에서 특정 조건을 만족하는 최적해를 찾는 것이 목표다.</p>
|
||
<ul>
|
||
<li>0-1 배낭 문제: 가치와 무게가 있는 물건들과 배낭이 주어졌을 때, 용량 제한 안에서 총가치가 최대가 되도록 물건을 고른다.</li>
|
||
<li>외판원 문제: 그래프의 한 점에서 출발하여 다른 모든 점을 정확히 한 번 방문한 뒤 출발점으로 돌아오는 최단 경로를 구한다.</li>
|
||
<li>최대 클리크 문제: 무방향 그래프에서 가장 큰 완전 부분 그래프, 즉 임의의 두 정점 사이에 간선이 있는 부분 그래프를 찾는다.</li>
|
||
</ul>
|
||
<p>많은 조합 최적화 문제에서 백트래킹이 최적의 해결 방법은 아니라는 점에 주의하자.</p>
|
||
<ul>
|
||
<li>0-1 배낭 문제는 더 높은 시간 효율을 위해 보통 동적 계획법으로 해결한다.</li>
|
||
<li>외판원 문제는 유명한 NP-Hard 문제이며, 유전 알고리즘과 개미 군집 알고리즘 등이 자주 쓰인다.</li>
|
||
<li>최대 클리크 문제는 그래프 이론의 대표적인 문제로, 탐욕 알고리즘 같은 휴리스틱 알고리즘을 사용할 수 있다.</li>
|
||
</ul>
|
||
<!-- Source file information -->
|
||
<!-- Was this page helpful? -->
|
||
<!-- Previous and next pages link -->
|
||
<nav aria-label="하단/푸터" class="md-footer__inner md-grid">
|
||
<!-- Link to previous page -->
|
||
<a aria-label="이전: 제 13 장 백트래킹" class="md-footer__link md-footer__link--prev" href="../" rel="prev">
|
||
<div class="md-footer__button md-icon">
|
||
<svg class="lucide lucide-arrow-left" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="m12 19-7-7 7-7M19 12H5"></path></svg>
|
||
</div>
|
||
<div class="md-footer__title">
|
||
<span class="md-footer__direction">
|
||
이전
|
||
</span>
|
||
<div class="md-ellipsis">
|
||
제 13 장 백트래킹
|
||
</div>
|
||
</div>
|
||
</a>
|
||
<!-- Link to next page -->
|
||
<a aria-label="다음: 13.2 모든 순열 문제" class="md-footer__link md-footer__link--next" href="../permutations_problem/" rel="next">
|
||
<div class="md-footer__title">
|
||
<span class="md-footer__direction">
|
||
다음
|
||
</span>
|
||
<div class="md-ellipsis">
|
||
13.2 모든 순열 문제
|
||
</div>
|
||
</div>
|
||
<div class="md-footer__button md-icon">
|
||
<svg class="lucide lucide-arrow-right" fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" viewbox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M5 12h14M12 5l7 7-7 7"></path></svg>
|
||
</div>
|
||
</a>
|
||
</nav>
|
||
<!-- Comment system -->
|
||
<!-- Check-in button above comments -->
|
||
<h5 align="center" id="__comments">댓글로 의견이나 질문, 제안을 남겨 주세요</h5>
|
||
<!-- Insert generated snippet here -->
|
||
<script async="" crossorigin="anonymous" data-category="Announcements" data-category-id="DIC_kwDOIXtSq84CSZk_" data-emit-metadata="1" data-input-position="top" data-lang="ko" data-mapping="pathname" data-reactions-enabled="1" data-repo="krahets/hello-algo" data-repo-id="R_kgDOIXtSqw" data-strict="1" data-theme="light" src="https://giscus.app/client.js">
|
||
</script>
|
||
<!-- Synchronize Giscus theme with palette -->
|
||
<script>
|
||
var giscus = document.querySelector("script[src*=giscus]")
|
||
|
||
function getGiscusTheme() {
|
||
var palette = __md_get("__palette")
|
||
var isDark = palette && typeof palette.color === "object" && palette.color.scheme === "slate"
|
||
return isDark ? "noborder_dark" : "light"
|
||
}
|
||
|
||
/* Set palette on initial load */
|
||
giscus.setAttribute("data-theme", getGiscusTheme())
|
||
|
||
/* The Giscus client creates the iframe asynchronously with an English title. */
|
||
;(function() {
|
||
function labelCommentsFrame() {
|
||
var frame = document.querySelector("iframe.giscus-frame")
|
||
if (!frame) return false
|
||
frame.setAttribute("title", "댓글")
|
||
return true
|
||
}
|
||
if (labelCommentsFrame()) return
|
||
var observer = new MutationObserver(function() {
|
||
if (labelCommentsFrame()) observer.disconnect()
|
||
})
|
||
observer.observe(giscus.parentElement, { childList: true, subtree: true })
|
||
})()
|
||
|
||
/* Register event handlers after documented loaded */
|
||
document.addEventListener("DOMContentLoaded", function() {
|
||
var ref = document.querySelector("[data-md-component=palette]")
|
||
if (!ref) return
|
||
ref.addEventListener("change", function() {
|
||
var theme = getGiscusTheme()
|
||
|
||
/* Instruct Giscus to change theme */
|
||
var frame = document.querySelector(".giscus-frame")
|
||
if (!frame) return
|
||
frame.contentWindow.postMessage(
|
||
{ giscus: { setConfig: { theme } } },
|
||
"https://giscus.app"
|
||
)
|
||
})
|
||
})
|
||
</script>
|
||
</article>
|
||
</div>
|
||
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var labels=set.querySelector(".tabbed-labels");for(var tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
|
||
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
||
</div>
|
||
</main>
|
||
<footer class="md-footer">
|
||
<div class="md-footer-meta md-typeset">
|
||
<div class="md-footer-meta__inner md-grid">
|
||
<div class="md-copyright">
|
||
<div class="md-copyright__highlight">
|
||
저작권 © 2026 krahets<br/>웹사이트 콘텐츠에는 <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/">CC BY-NC-SA 4.0</a> 라이선스가 적용된다
|
||
</div>
|
||
</div>
|
||
<div class="md-social">
|
||
<a class="md-social__link" href="https://github.com/krahets" rel="noopener" target="_blank" title="github.com">
|
||
<svg viewbox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M173.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6m-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3m44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9M252.8 8C114.1 8 8 113.3 8 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C436.2 457.8 504 362.9 504 252 504 113.3 391.5 8 252.8 8M105.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1m-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7m32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1m-11.4-14.7c-1.6 1-1.6 3.6 0 5.9s4.3 3.3 5.6 2.3c1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2" fill="currentColor"></path></svg>
|
||
</a>
|
||
<a class="md-social__link" href="https://twitter.com/krahets" rel="noopener" target="_blank" title="twitter.com">
|
||
<svg viewbox="0 0 448 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M357.2 48h70.6L273.6 224.2 455 464H313L201.7 318.6 74.5 464H3.8l164.9-188.5L-5.2 48h145.6l100.5 132.9zm-24.8 373.8h39.1L119.1 88h-42z" fill="currentColor"></path></svg>
|
||
</a>
|
||
<a class="md-social__link" href="https://leetcode.cn/u/jyd/" rel="noopener" target="_blank" title="leetcode.cn">
|
||
<svg viewbox="0 0 576 512" xmlns="http://www.w3.org/2000/svg"><!--! Font Awesome Free 7.2.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2026 Fonticons, Inc.--><path d="M360.8 1.2c-17-4.9-34.7 5-39.6 22l-128 448c-4.9 17 5 34.7 22 39.6s34.7-5 39.6-22l128-448c4.9-17-5-34.7-22-39.6m64.6 136.1c-12.5 12.5-12.5 32.8 0 45.3l73.4 73.4-73.4 73.4c-12.5 12.5-12.5 32.8 0 45.3s32.8 12.5 45.3 0l96-96c12.5-12.5 12.5-32.8 0-45.3l-96-96c-12.5-12.5-32.8-12.5-45.3 0zm-274.7 0c-12.5-12.5-32.8-12.5-45.3 0l-96 96c-12.5 12.5-12.5 32.8 0 45.3l96 96c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L77.3 256l73.3-73.4c12.5-12.5 12.5-32.8 0-45.3z" fill="currentColor"></path></svg>
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</footer>
|
||
</div>
|
||
<div class="md-dialog" data-md-component="dialog">
|
||
<div class="md-dialog__inner md-typeset"></div>
|
||
</div>
|
||
<script id="__config" type="application/json">{"annotate":null,"base":"../../","features":["content.action.edit","content.code.annotate","content.code.copy","content.tabs.link","content.tooltips","navigation.indexes","navigation.tracking","search.highlight","search.share","search.suggest","toc.follow"],"search":"../../assets/javascripts/workers/search.b6b7e04f.min.js","tags":null,"translations":{"clipboard.copied":"클립보드에 복사됨","clipboard.copy":"클립보드로 복사","search.result.more.one":"이 문서에서 1개의 검색 결과 더 보기","search.result.more.other":"이 문서에서 #개의 검색 결과 더 보기","search.result.none":"검색어와 일치하는 문서가 없습니다","search.result.one":"1개의 일치하는 문서","search.result.other":"#개의 일치하는 문서","search.result.placeholder":"검색어를 입력하세요","search.result.term.missing":"포함되지 않은 검색어","select.version":"버전 선택"},"version":null}</script>
|
||
<script src="../../assets/javascripts/bundle.9da20b33253961ce280a4a32ba173a4ae6a1344b3b104ddf2f5f2caf9b8f6ec8.min.js"></script>
|
||
<script src="../../javascripts/mathjax.js"></script>
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.min.js"></script>
|
||
<script src="../../javascripts/animation_player.js"></script>
|
||
<script defer="" src="/assets/figure-svg/js/bcdea376f01bc2bc0cac7c6c.js"></script><script defer="" src="/assets/figure-svg/js/e84f59519170c0f5ef238548.js"></script><script defer="" src="/assets/figure-svg/js/99a707e9f0a14d8280f16808.js"></script><script defer="" src="/assets/figure-svg/js/b789dc8b01e43e756fc89964.js"></script></body>
|
||
</html> |