<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=RandomWalk%2F%EC%9E%84%EC%9D%B8%ED%83%9D</id>
	<title>RandomWalk/임인택 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mediawiki.zeropage.org/index.php?action=history&amp;feed=atom&amp;title=RandomWalk%2F%EC%9E%84%EC%9D%B8%ED%83%9D"/>
	<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=RandomWalk/%EC%9E%84%EC%9D%B8%ED%83%9D&amp;action=history"/>
	<updated>2026-05-15T01:02:20Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.8</generator>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=RandomWalk/%EC%9E%84%EC%9D%B8%ED%83%9D&amp;diff=87590&amp;oldid=prev</id>
		<title>Maintenance script: Repair MoniWiki formatting after migration</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=RandomWalk/%EC%9E%84%EC%9D%B8%ED%83%9D&amp;diff=87590&amp;oldid=prev"/>
		<updated>2026-03-29T00:34:29Z</updated>

		<summary type="html">&lt;p&gt;Repair MoniWiki formatting after migration&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 00:34, 29 March 2026&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;ToyProblems 에서 느낀바가 있어 RandomWalk 를 여러가지 방법으로 풀어보려 합니다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;ToyProblems&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/ins&gt;에서 느낀바가 있어 &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;RandomWalk&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/ins&gt;를 여러가지 방법으로 풀어보려 합니다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;__TOC__&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;__TOC__&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l289&quot;&gt;Line 289:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 289:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 소스 4 : OO 적으로 ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 소스 4 : OO 적으로 ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 별로 OO 적이지 못한것 같다...(Roach 와 Board 객체가 양방향참조를 한다). DesignPatterns 를 참고하면서 보았어야 하는데.. 나중에 Refactoring 해야 함..&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* 별로 OO 적이지 못한것 같다...(Roach 와 Board 객체가 양방향참조를 한다). &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;DesignPatterns&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/ins&gt;를 참고하면서 보았어야 하는데.. 나중에 Refactoring 해야 함..&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*  &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;*  &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;Roach.java&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;code&amp;gt;Roach.java&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l404&quot;&gt;Line 404:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 404:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 소스 5 : 재미있을것 같은 CSP ===&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;=== 소스 5 : 재미있을것 같은 CSP ===&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  TokenRing 에서 아이디어를 얻어 나름대로 만들어봤는데 (아직 제대로 동작하는지 미확인. 이 글을 작성하는 도중에도 버그가 하나둘 보이고 BadSmell 이 많이 난다. PC가 많은 곳에서 추가작업필요... :( ) 이게 CSP 의 이념에 부합하는지 모르겠다. m by n 배열에 있는 셀들을 TokenRingNetwork 형태를 띠게 하면서 사실은 배열인것처럼 동작하게 했다. 이 방법 말고 마땅한 방법이 떠오르지 않았다. TestDrivenDevelopment 으로 작성해보려고 했지만 실천에 옮기지 못했다. 몸에 밴 습관이란건 극복하기가 쉽지 않은 것 같다.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  TokenRing 에서 아이디어를 얻어 나름대로 만들어봤는데 (아직 제대로 동작하는지 미확인. 이 글을 작성하는 도중에도 버그가 하나둘 보이고 BadSmell 이 많이 난다. PC가 많은 곳에서 추가작업필요... :( ) 이게 CSP 의 이념에 부합하는지 모르겠다. m by n 배열에 있는 셀들을 TokenRingNetwork 형태를 띠게 하면서 사실은 배열인것처럼 동작하게 했다. 이 방법 말고 마땅한 방법이 떠오르지 않았다. &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;TestDrivenDevelopment&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]] &lt;/ins&gt;으로 작성해보려고 했지만 실천에 옮기지 못했다. 몸에 밴 습관이란건 극복하기가 쉽지 않은 것 같다.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Cell.java&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* Cell.java&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l583&quot;&gt;Line 583:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 583:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;    &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* RandomWalk.java&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;* &lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[&lt;/ins&gt;RandomWalk&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]]&lt;/ins&gt;.java&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;   &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  /**&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;  /**&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=RandomWalk/%EC%9E%84%EC%9D%B8%ED%83%9D&amp;diff=84878&amp;oldid=prev</id>
		<title>Maintenance script: Repair batch-0003 pages from live compare</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=RandomWalk/%EC%9E%84%EC%9D%B8%ED%83%9D&amp;diff=84878&amp;oldid=prev"/>
		<updated>2026-03-27T00:29:07Z</updated>

		<summary type="html">&lt;p&gt;Repair batch-0003 pages from live compare&lt;/p&gt;
&lt;a href=&quot;https://mediawiki.zeropage.org/index.php?title=RandomWalk/%EC%9E%84%EC%9D%B8%ED%83%9D&amp;amp;diff=84878&amp;amp;oldid=38355&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Maintenance script</name></author>
	</entry>
	<entry>
		<id>https://mediawiki.zeropage.org/index.php?title=RandomWalk/%EC%9E%84%EC%9D%B8%ED%83%9D&amp;diff=38355&amp;oldid=prev</id>
		<title>imported&gt;Unknown at 05:27, 7 February 2021</title>
		<link rel="alternate" type="text/html" href="https://mediawiki.zeropage.org/index.php?title=RandomWalk/%EC%9E%84%EC%9D%B8%ED%83%9D&amp;diff=38355&amp;oldid=prev"/>
		<updated>2021-02-07T05:27:51Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;ToyProblems 에서 느낀바가 있어 RandomWalk 를 여러가지 방법으로 풀어보려 합니다.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
=== 소스 1 : 2학년때 자료구조 숙제로 작성 (약간 Iterative한것 같다) ===&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;ctime&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;cstdlib&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 // move direction and board.&lt;br /&gt;
 int	 direction_x[]={-1,0,1,1,1,0,-1,-1};&lt;br /&gt;
 int	 direction_y[]={1,1,1,0,-1,-1,-1,0};&lt;br /&gt;
 int	 board[40][20];	// maximum size of the board is : 40x20&lt;br /&gt;
 // required variables.&lt;br /&gt;
 int	 sizeX, sizeY, xPos, yPos, NumOfBlock, loop=0;&lt;br /&gt;
 const int DIRECTION = 8;&lt;br /&gt;
 &lt;br /&gt;
 void input();&lt;br /&gt;
 void output();&lt;br /&gt;
 void move();&lt;br /&gt;
 void init_board();&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
          init_board();&lt;br /&gt;
 	input();&lt;br /&gt;
 	move();&lt;br /&gt;
 	output();&lt;br /&gt;
 	&lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void init_board()&lt;br /&gt;
 {&lt;br /&gt;
 	for(int i=0; i&amp;amp;lt;sizeX; i++)&lt;br /&gt;
 		for(int j=0; j&amp;amp;lt;sizeY; j++)&lt;br /&gt;
 			board[i][j]=0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void move()&lt;br /&gt;
 {&lt;br /&gt;
 	int k;&lt;br /&gt;
 	srand((unsigned)time(NULL));&lt;br /&gt;
 &lt;br /&gt;
 	// initial point&lt;br /&gt;
 	board[xPos][yPos]++;&lt;br /&gt;
          NumOfBlock--;&lt;br /&gt;
 &lt;br /&gt;
 	// move roach while loop is smaller than 50,000&lt;br /&gt;
 	while(loop&amp;amp;lt;50000)&lt;br /&gt;
 	{&lt;br /&gt;
 		k = rand()%DIRECTION;&lt;br /&gt;
 &lt;br /&gt;
 		// prevent the roach moves outside of the board&lt;br /&gt;
 		if(xPos+direction_x[k]&amp;amp;lt;0 || xPos+direction_x[k]&amp;amp;gt;sizeX-1&lt;br /&gt;
 			|| yPos+direction_y[k]&amp;amp;lt;0 || yPos+direction_y[k]&amp;amp;gt;sizeY-1)&lt;br /&gt;
 			continue;&lt;br /&gt;
 &lt;br /&gt;
 		xPos += direction_x[k];&lt;br /&gt;
 		yPos += direction_y[k];&lt;br /&gt;
 &lt;br /&gt;
 		if(board[xPos][yPos]==0)&lt;br /&gt;
 			NumOfBlock--;&lt;br /&gt;
 		board[xPos][yPos]++;&lt;br /&gt;
 		&lt;br /&gt;
 		if(NumOfBlock==0)&lt;br /&gt;
 			break;&lt;br /&gt;
 		loop++;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void input()&lt;br /&gt;
 {&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;input size of the board&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 &lt;br /&gt;
 	while(cin &amp;amp;gt;&amp;amp;gt; sizeX &amp;amp;gt;&amp;amp;gt; sizeY)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(sizeX&amp;amp;gt;40 || sizeY&amp;amp;gt;20)&lt;br /&gt;
 		{&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; &amp;quot;size is out of range.\ntry again.&amp;quot;;&lt;br /&gt;
 			continue;&lt;br /&gt;
 		}&lt;br /&gt;
 		break;&lt;br /&gt;
 	}&lt;br /&gt;
 &lt;br /&gt;
 	NumOfBlock=sizeX*sizeY;&lt;br /&gt;
 &lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;input start point;&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	while(cin &amp;amp;gt;&amp;amp;gt; xPos &amp;amp;gt;&amp;amp;gt; yPos)&lt;br /&gt;
 	{&lt;br /&gt;
 		if(xPos&amp;amp;gt;40 || yPos&amp;amp;gt;20)&lt;br /&gt;
 		{&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; &amp;quot;point is out of range.\ntry again.&amp;quot;;&lt;br /&gt;
 			continue;&lt;br /&gt;
 		}&lt;br /&gt;
 		break;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void output()&lt;br /&gt;
 {&lt;br /&gt;
 	int i,j;&lt;br /&gt;
 &lt;br /&gt;
 	// print outputs.&lt;br /&gt;
 	for(i=0; i&amp;amp;lt;sizeX; i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		for(j=0; j&amp;amp;lt;sizeY; j++)&lt;br /&gt;
 		{&lt;br /&gt;
 			cout.width(4);&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; board[i][j];&lt;br /&gt;
 			if(j==sizeY-1)&lt;br /&gt;
 				cout &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 		}&lt;br /&gt;
 	}&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;loop : &amp;quot; &amp;amp;lt;&amp;amp;lt; loop &amp;amp;lt;&amp;amp;lt; &amp;quot; times&amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
=== 소스 2 : 1에 [[STL]]을 사용하고 약간의 [[Refactoring]] ===&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;ctime&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 #define DIRECTION 8&lt;br /&gt;
 &lt;br /&gt;
 // move direction and board.&lt;br /&gt;
 int	 direction_x[]={-1,0,1,1,1,0,-1,-1};&lt;br /&gt;
 int	 direction_y[]={1,1,1,0,-1,-1,-1,0};&lt;br /&gt;
 int sizeX, sizeY;&lt;br /&gt;
 int NumberOfUnvisitedBlocks = 0, LoopCount= 0 ;&lt;br /&gt;
 &lt;br /&gt;
 vector&amp;amp;lt;vector&amp;amp;lt;int&amp;amp;gt; &amp;amp;gt; board;&lt;br /&gt;
 &lt;br /&gt;
 void printOutResult();&lt;br /&gt;
 void moveRoach(int x, int y);&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Size of the board : &amp;quot;;&lt;br /&gt;
 	cin &amp;amp;gt;&amp;amp;gt; sizeX &amp;amp;gt;&amp;amp;gt; sizeY;&lt;br /&gt;
 	NumberOfUnvisitedBlocks = sizeX * sizeY;&lt;br /&gt;
 &lt;br /&gt;
 	// initizlize the vector&lt;br /&gt;
 	board.resize(sizeX);&lt;br /&gt;
 	vector&amp;amp;lt;vector&amp;amp;lt;int&amp;amp;gt; &amp;amp;gt;::iterator iter;&lt;br /&gt;
 	for(iter=board.begin(); iter!=board.end(); ++iter)&lt;br /&gt;
 		(*iter).resize(sizeY);&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Starting Point : &amp;quot;;&lt;br /&gt;
 	int xPos, yPos;&lt;br /&gt;
     cin &amp;amp;gt;&amp;amp;gt; xPos &amp;amp;gt;&amp;amp;gt; yPos;&lt;br /&gt;
 &lt;br /&gt;
     &lt;br /&gt;
 	moveRoach(xPos, yPos);&lt;br /&gt;
 	&lt;br /&gt;
 	printOutResult();&lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void moveRoach(int xPos, int yPos)&lt;br /&gt;
 {&lt;br /&gt;
 	int k;&lt;br /&gt;
 	srand((unsigned)time(NULL));&lt;br /&gt;
 &lt;br /&gt;
 	// initial point&lt;br /&gt;
 	board[xPos][yPos]++;&lt;br /&gt;
 	NumberOfUnvisitedBlocks--;&lt;br /&gt;
 &lt;br /&gt;
 	// move roach while &amp;#039;loop&amp;#039; is smaller than 50,000&lt;br /&gt;
 	while(LoopCount&amp;amp;lt;50000)&lt;br /&gt;
 	{&lt;br /&gt;
 		k = rand()%DIRECTION;&lt;br /&gt;
 &lt;br /&gt;
 		// prevent the roach moves outside of the board&lt;br /&gt;
 		if(xPos+direction_x[k]&amp;amp;lt;0 || xPos+direction_x[k]&amp;amp;gt;sizeX-1&lt;br /&gt;
 			|| yPos+direction_y[k]&amp;amp;lt;0 || yPos+direction_y[k]&amp;amp;gt;sizeY-1)&lt;br /&gt;
 			continue;&lt;br /&gt;
 &lt;br /&gt;
 		xPos += direction_x[k];&lt;br /&gt;
 		yPos += direction_y[k];&lt;br /&gt;
 &lt;br /&gt;
 		if(board[xPos][yPos]==0)&lt;br /&gt;
 			NumberOfUnvisitedBlocks--;&lt;br /&gt;
 &lt;br /&gt;
 		board[xPos][yPos]++;&lt;br /&gt;
 &lt;br /&gt;
 		if(NumberOfUnvisitedBlocks==0)&lt;br /&gt;
 			break;&lt;br /&gt;
 		&lt;br /&gt;
 		LoopCount++;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void printOutResult()&lt;br /&gt;
 {&lt;br /&gt;
 	int i,j;&lt;br /&gt;
 &lt;br /&gt;
 	// print outputs.&lt;br /&gt;
 	for(i=0; i&amp;amp;lt;sizeX; i++)&lt;br /&gt;
 	{&lt;br /&gt;
 		for(j=0; j&amp;amp;lt;sizeY; j++)&lt;br /&gt;
 		{&lt;br /&gt;
 			cout.width(4);&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; board[i][j];&lt;br /&gt;
 		}&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	}&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Total : &amp;quot; &amp;amp;lt;&amp;amp;lt; LoopCount &amp;amp;lt;&amp;amp;lt; &amp;quot; times repeated &amp;quot; &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
=== 소스 3 : Recursion 을 이용해봄 ===&lt;br /&gt;
 #include &amp;amp;lt;iostream&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;vector&amp;amp;gt;&lt;br /&gt;
 #include &amp;amp;lt;ctime&amp;amp;gt;&lt;br /&gt;
 using namespace std;&lt;br /&gt;
 &lt;br /&gt;
 #define NUMOFDIRECTIONS 8&lt;br /&gt;
 &lt;br /&gt;
 typedef vector&amp;amp;lt;vector&amp;amp;lt;int&amp;amp;gt; &amp;amp;gt; Board;&lt;br /&gt;
 Board roachJourney;&lt;br /&gt;
 &lt;br /&gt;
 int	 dir_x[]={-1,0,1,1,1,0,-1,-1};&lt;br /&gt;
 int	 dir_y[]={1,1,1,0,-1,-1,-1,0};&lt;br /&gt;
 int sizeX, sizeY;&lt;br /&gt;
 &lt;br /&gt;
 void moveRoachRecursively(int dirIdx);&lt;br /&gt;
 void printOutResult();&lt;br /&gt;
 &lt;br /&gt;
 int main()&lt;br /&gt;
 {&lt;br /&gt;
 	cout &amp;amp;lt;&amp;amp;lt; &amp;quot;Size of the board : &amp;quot;;&lt;br /&gt;
 	cin &amp;amp;gt;&amp;amp;gt; sizeX &amp;amp;gt;&amp;amp;gt; sizeY;&lt;br /&gt;
 &lt;br /&gt;
 	roachJourney.resize(sizeX);&lt;br /&gt;
 	Board::iterator iter;&lt;br /&gt;
 	for(iter=roachJourney.begin(); iter!=roachJourney.end(); ++iter)&lt;br /&gt;
 		(*iter).resize(sizeY);&lt;br /&gt;
 &lt;br /&gt;
 	moveRoachRecursively(rand()%NUMOFDIRECTIONS);&lt;br /&gt;
 	printOutResult();&lt;br /&gt;
 &lt;br /&gt;
 	return 0;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void moveRoachRecursively(int dirIdx)&lt;br /&gt;
 {&lt;br /&gt;
 	// starting point is 0,0&lt;br /&gt;
 	// i&amp;#039;m not sure that this is an excessive use of &amp;#039;static&amp;#039; keyword&lt;br /&gt;
 	static int posX = 0, posY = 0;&lt;br /&gt;
     static int numOfUnVstdPlces = sizeX*sizeY;&lt;br /&gt;
 	&lt;br /&gt;
 	// if the roach moved outside of the board ignore that case.&lt;br /&gt;
 	if(! (posX+dir_x[dirIdx]&amp;amp;lt;0 || posX+dir_x[dirIdx]&amp;amp;gt;sizeX-1&lt;br /&gt;
 		|| posY+dir_y[dirIdx]&amp;amp;lt;0 || posY+dir_y[dirIdx]&amp;amp;gt;sizeY-1) )&lt;br /&gt;
 	{&lt;br /&gt;
 		posX += dir_x[dirIdx];&lt;br /&gt;
 		posY += dir_y[dirIdx];&lt;br /&gt;
 &lt;br /&gt;
 		if( roachJourney[posX][posY] == 0 )&lt;br /&gt;
 			numOfUnVstdPlces--;&lt;br /&gt;
 &lt;br /&gt;
 		roachJourney[posX][posY]++;&lt;br /&gt;
 	}&lt;br /&gt;
     &lt;br /&gt;
 	if( numOfUnVstdPlces != 0) // choose next direction&lt;br /&gt;
         moveRoachRecursively((unsigned)(rand())%NUMOFDIRECTIONS);&lt;br /&gt;
 	else&lt;br /&gt;
 		return;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 void printOutResult()&lt;br /&gt;
 {&lt;br /&gt;
 	Board::iterator iterX;&lt;br /&gt;
 	for(iterX=roachJourney.begin(); iterX!=roachJourney.end(); ++iterX)&lt;br /&gt;
 	{&lt;br /&gt;
 		vector&amp;amp;lt;int&amp;amp;gt;::iterator iterY;&lt;br /&gt;
 		for(iterY=(*iterX).begin(); iterY!=(*iterX).end(); ++iterY)&lt;br /&gt;
 		{&lt;br /&gt;
 			cout.width(4);&lt;br /&gt;
 			cout &amp;amp;lt;&amp;amp;lt; (*iterY);&lt;br /&gt;
 		}&lt;br /&gt;
 		cout &amp;amp;lt;&amp;amp;lt; endl;&lt;br /&gt;
 	}&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
=== 소스 4 : OO 적으로 ===&lt;br /&gt;
* 별로 OO 적이지 못한것 같다...(Roach 와 Board 객체가 [[양방향참조]]를 한다). DesignPatterns 를 참고하면서 보았어야 하는데.. 나중에 [[Refactoring]] 해야 함..&lt;br /&gt;
* &lt;br /&gt;
 ~cpp  Roach.java&lt;br /&gt;
 &lt;br /&gt;
 import java.util.Random;&lt;br /&gt;
 &lt;br /&gt;
 public class Roach{&lt;br /&gt;
     int dir_x[]={-1,0,1,1,1,0,-1,-1};&lt;br /&gt;
     int dir_y[]={1,1,1,0,-1,-1,-1,0};&lt;br /&gt;
     Board _board;&lt;br /&gt;
     boolean bOnTrip;&lt;br /&gt;
     Random rand;&lt;br /&gt;
 &lt;br /&gt;
     public Roach() {&lt;br /&gt;
         bOnTrip = true;&lt;br /&gt;
         rand = new Random();&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void move() {&lt;br /&gt;
         int randNum;&lt;br /&gt;
 &lt;br /&gt;
         while( bOnTrip ) {&lt;br /&gt;
             randNum = rand.nextInt()%dir_x.length;&lt;br /&gt;
             try {&lt;br /&gt;
                 _board.walkOn(dir_x[randNum], dir_y[randNum]);&lt;br /&gt;
             }  catch (ArrayIndexOutOfBoundsException e) {&lt;br /&gt;
                 //System.err.println(e);&lt;br /&gt;
                 drink();&lt;br /&gt;
             }&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void finishJourney() {&lt;br /&gt;
         bOnTrip = false;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void drink() {&lt;br /&gt;
         System.out.println(&amp;quot;toast~!&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void putOnTheBoard(Board board) {&lt;br /&gt;
         _board = board;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
* &lt;br /&gt;
 ~cpp  Board.java&lt;br /&gt;
 &lt;br /&gt;
 public class Board {&lt;br /&gt;
     int _board[][];&lt;br /&gt;
     int sizeX, sizeY;&lt;br /&gt;
     int roaX, roaY; // watch position of the roach&lt;br /&gt;
                               // because the roach doesn&amp;#039;t know his position&lt;br /&gt;
     int visitedPlace = 1;&lt;br /&gt;
     Roach _roach;&lt;br /&gt;
 &lt;br /&gt;
     public Board(int x, int y) {&lt;br /&gt;
         sizeX = x;&lt;br /&gt;
         sizeY = y;&lt;br /&gt;
         roaX = roaY = 0;&lt;br /&gt;
         _board = new int[sizeX][sizeY];&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void walkOn(int x, int y) {&lt;br /&gt;
         System.out.println(&amp;quot;바퀴위치 : &amp;quot; + (roaX+x) + &amp;quot;, &amp;quot; + (roaY+y));&lt;br /&gt;
 &lt;br /&gt;
         if ( _board[roaX+x][roaY+y] == 0 )&lt;br /&gt;
             visitedPlace++;&lt;br /&gt;
 &lt;br /&gt;
         roaX += x;&lt;br /&gt;
         roaY += y;&lt;br /&gt;
 &lt;br /&gt;
         System.out.println(&amp;quot;바퀴위치 : &amp;quot; + roaX + &amp;quot;, &amp;quot; + roaY);&lt;br /&gt;
 &lt;br /&gt;
         _board[roaX][roaY]++;&lt;br /&gt;
 &lt;br /&gt;
         if( visitedPlace == sizeX*sizeY ) {&lt;br /&gt;
             _roach.finishJourney();&lt;br /&gt;
             printOutBoard();&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void putRoachOn(Roach roach) {&lt;br /&gt;
         _roach = roach;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void printOutBoard() {&lt;br /&gt;
         for(int i=0; i&amp;amp;lt;sizeX; i++) {&lt;br /&gt;
             for(int j=0; j&amp;amp;lt;sizeY; j++) {&lt;br /&gt;
                 System.out.print(_board[i][j] + &amp;quot;\t&amp;quot;);&lt;br /&gt;
             }&lt;br /&gt;
             System.out.println();&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
* &lt;br /&gt;
 ~cpp  RandomWalk.java&lt;br /&gt;
 &lt;br /&gt;
 public class RandomWalk {&lt;br /&gt;
 &lt;br /&gt;
     public static void main(String[] args){&lt;br /&gt;
         Roach myRoach = new Roach();&lt;br /&gt;
         Board myBoard = new Board(8,8);&lt;br /&gt;
 &lt;br /&gt;
         myRoach.putOnTheBoard(myBoard);&lt;br /&gt;
         myBoard.putRoachOn(myRoach);&lt;br /&gt;
 &lt;br /&gt;
         myRoach.move();&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
=== 소스 5 : 재미있을것 같은 CSP ===&lt;br /&gt;
 TokenRing 에서 아이디어를 얻어 나름대로 만들어봤는데 (아직 제대로 동작하는지 미확인. 이 글을 작성하는 도중에도 버그가 하나둘 보이고 BadSmell 이 많이 난다. PC가 많은 곳에서 추가작업필요... :( ) 이게 CSP 의 이념에 부합하는지 모르겠다. m by n 배열에 있는 셀들을 TokenRingNetwork 형태를 띠게 하면서 사실은 배열인것처럼 동작하게 했다. 이 방법 말고 마땅한 방법이 떠오르지 않았다. TestDrivenDevelopment 으로 작성해보려고 했지만 실천에 옮기지 못했다. 몸에 밴 습관이란건 극복하기가 쉽지 않은 것 같다.&lt;br /&gt;
* Cell.java&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * Created by IntelliJ IDEA.&lt;br /&gt;
  * Author: Intaek Lim&lt;br /&gt;
  * Date: 2003. 6. 7.&lt;br /&gt;
  * Time: 오후 10:29:36&lt;br /&gt;
  */&lt;br /&gt;
 &lt;br /&gt;
 import java.net.*;&lt;br /&gt;
 import java.io.*;&lt;br /&gt;
 import java.util.Random;&lt;br /&gt;
 &lt;br /&gt;
 // operates just like &amp;#039;token ring&amp;#039;&lt;br /&gt;
 public class Cell  implements Runnable {&lt;br /&gt;
     private String _nextHostName, _localHostName;&lt;br /&gt;
     private int _hostIndex, _nextHostIndex;&lt;br /&gt;
     private int _numOfVisited;&lt;br /&gt;
     private int _xSize, _ySize;&lt;br /&gt;
     private int _adjacentCellIdx[];&lt;br /&gt;
     private ServerSocket _serverSock;&lt;br /&gt;
     private Socket _nextSock;&lt;br /&gt;
     private final int _defaultPort = 38317;&lt;br /&gt;
     private boolean _bEndCondition;&lt;br /&gt;
 &lt;br /&gt;
     public Cell(int localHostNum, int hostIndex, String nextHostName, int nextHostNum) {&lt;br /&gt;
         _hostIndex = localHostNum;&lt;br /&gt;
         _hostIndex = hostIndex;&lt;br /&gt;
         _bEndCondition = false;&lt;br /&gt;
 &lt;br /&gt;
         try {&lt;br /&gt;
             _serverSock = new ServerSocket(_defaultPort);&lt;br /&gt;
         } catch(IOException e) {&lt;br /&gt;
             System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void setXY(int x, int y) {&lt;br /&gt;
         _xSize = x;&lt;br /&gt;
         _ySize = y;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void setAdjacentCells(String adjIdx) {&lt;br /&gt;
         // parse adjacent cell info&lt;br /&gt;
         String adjHostIdxes[] = adjIdx.split(&amp;quot; &amp;quot;);&lt;br /&gt;
         _adjacentCellIdx = new int[adjHostIdxes.length];&lt;br /&gt;
 &lt;br /&gt;
         for(int i=0; i&amp;amp;lt;_adjacentCellIdx.length; i++)&lt;br /&gt;
             _adjacentCellIdx[i] = Integer.parseInt(adjHostIdxes[i]);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void connect() {&lt;br /&gt;
         try {&lt;br /&gt;
             _nextSock = new Socket(getNextHostName(), _defaultPort);&lt;br /&gt;
         } catch(IOException e) {&lt;br /&gt;
             System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // accept after connection was estabilished to previous host.&lt;br /&gt;
     public void acceptConnection() {&lt;br /&gt;
         try {&lt;br /&gt;
             _nextSock = _serverSock.accept();&lt;br /&gt;
         } catch(IOException e) {&lt;br /&gt;
             System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public String getNextHostName() {&lt;br /&gt;
         return _nextHostName;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public String getHostName() {&lt;br /&gt;
         return _localHostName;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public int getHostIndex() {&lt;br /&gt;
         return _hostIndex;&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void run() {&lt;br /&gt;
         try {&lt;br /&gt;
             ObjectInputStream in&lt;br /&gt;
                     = new ObjectInputStream(_nextSock.getInputStream());&lt;br /&gt;
             while( !_bEndCondition ) {&lt;br /&gt;
                 Object obj = in.readObject();&lt;br /&gt;
                 parseMessage((Message)obj);&lt;br /&gt;
             }&lt;br /&gt;
         }  catch(IOException e) {&lt;br /&gt;
             System.err.println(e);&lt;br /&gt;
         } catch(ClassNotFoundException e) {&lt;br /&gt;
             System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void parseMessage(Message msg) {&lt;br /&gt;
         // if the roach visited all cells..&lt;br /&gt;
         if( msg.checkEndCondition(getHostIndex()) ) {&lt;br /&gt;
             processFinishing(msg);&lt;br /&gt;
         }&lt;br /&gt;
         else if( msg.killMessage) { // if the cell received kill message&lt;br /&gt;
             killClients(msg);&lt;br /&gt;
         } else {  // when the roach is on walking~~~&lt;br /&gt;
             if( msg.targetHostNum == getHostIndex() ) {&lt;br /&gt;
                 transmitRoach(msg);&lt;br /&gt;
             }&lt;br /&gt;
             relay(msg);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void relay(Message msg) {&lt;br /&gt;
         try {&lt;br /&gt;
             ObjectOutputStream out&lt;br /&gt;
                     = new ObjectOutputStream(_nextSock.getOutputStream());&lt;br /&gt;
             out.writeObject(msg);&lt;br /&gt;
         } catch(IOException e) {&lt;br /&gt;
             System.err.println(e);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void showEndStatus() {&lt;br /&gt;
         System.out.println(&amp;quot;Random walk finished.&amp;quot;);&lt;br /&gt;
         System.out.println(&amp;quot;There are&amp;quot; + _numOfVisited + &amp;quot; arrivals&amp;quot;);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void processFinishing(Message msg) {&lt;br /&gt;
         // if here is the starting point, then send kill signal to others.&lt;br /&gt;
         if( getHostIndex()==0 ) {&lt;br /&gt;
             msg.killMessage = true;&lt;br /&gt;
             relay(msg);&lt;br /&gt;
         }  else { // else, relay to the first point.&lt;br /&gt;
             relay(msg);&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void killClients(Message msg) {&lt;br /&gt;
         // if this is not the last point relay to the last point&lt;br /&gt;
         if( _nextHostIndex&amp;amp;lt;getHostIndex() ) {&lt;br /&gt;
             relay(msg);&lt;br /&gt;
         } else {&lt;br /&gt;
             showEndStatus();&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     public void transmitRoach(Message msg) {&lt;br /&gt;
         if( _numOfVisited==0 ) {&lt;br /&gt;
             msg.numOfRemainCell--;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         int nextIdx = new Random().nextInt() % _adjacentCellIdx.length;&lt;br /&gt;
 &lt;br /&gt;
         msg.sourceHostNum = getHostIndex();&lt;br /&gt;
         msg.targetHostNum = nextIdx;&lt;br /&gt;
 &lt;br /&gt;
         relay(msg);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
* Message.java&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * Created by IntelliJ IDEA.&lt;br /&gt;
  * Author: Intaek Lim&lt;br /&gt;
  * Date: 2003. 6. 7.&lt;br /&gt;
  * Time: 오후 10:58:58&lt;br /&gt;
  */&lt;br /&gt;
 public class Message {&lt;br /&gt;
     public int targetHostNum;&lt;br /&gt;
     public int sourceHostNum;&lt;br /&gt;
     public int numOfRemainCell;&lt;br /&gt;
     public boolean killMessage;&lt;br /&gt;
 &lt;br /&gt;
     public boolean checkEndCondition(int cellIdx) {&lt;br /&gt;
         return (numOfRemainCell==0);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
  &lt;br /&gt;
* RandomWalk.java&lt;br /&gt;
 &lt;br /&gt;
 /**&lt;br /&gt;
  * Created by IntelliJ IDEA.&lt;br /&gt;
  * Author: Intaek Lim&lt;br /&gt;
  * Date: 2003. 6. 8.&lt;br /&gt;
  * Time: 오후 4:7:20&lt;br /&gt;
  */&lt;br /&gt;
 public class RandomWalk {&lt;br /&gt;
     public static void main(String args[]) {&lt;br /&gt;
         // localhostname, localHostNum, nextHostName, nextHostNum&lt;br /&gt;
         // sizeX, sizeY, cellInfo&lt;br /&gt;
         String localHostName =args[0];&lt;br /&gt;
         int localNum = Integer.parseInt(args[1]);&lt;br /&gt;
         String nextHostName = args[2];&lt;br /&gt;
         int nextHostNum = Integer.parseInt(args[3]);&lt;br /&gt;
         int xSize = Integer.parseInt(args[4]);&lt;br /&gt;
         int ySize = Integer.parseInt(args[5]);&lt;br /&gt;
 &lt;br /&gt;
         String adjInfo = &amp;quot;&amp;quot;;&lt;br /&gt;
         for(int i=6; i&amp;amp;lt;args.length; i++) {&lt;br /&gt;
             adjInfo += args[i] + &amp;quot; &amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
 &lt;br /&gt;
         System.out.println(adjInfo);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
  &lt;br /&gt;
=== Thread ===&lt;br /&gt;
* 다른 방법들은 아직 개념 파악이 되지 않은것이 태반이다. 나중에 좀더 공부를 해서 나머지 방법으로도 해봐야지... :)&lt;br /&gt;
----&lt;br /&gt;
[[RandomWalk]]&lt;br /&gt;
&lt;/div&gt;</summary>
		<author><name>imported&gt;Unknown</name></author>
	</entry>
</feed>