<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.9.0">Jekyll</generator><link href="https://bakyeono.net/feed.xml" rel="self" type="application/atom+xml" /><link href="https://bakyeono.net/" rel="alternate" type="text/html" /><updated>2022-08-06T20:06:36+09:00</updated><id>https://bakyeono.net/feed.xml</id><title type="html">박연오</title><subtitle>Clojure, Common Lisp, Python, Javascript</subtitle><entry><title type="html">클로저 코드는 정말 읽기 어려운가?</title><link href="https://bakyeono.net/post/2022-06-17-is-clojure-hard-to-read.html" rel="alternate" type="text/html" title="클로저 코드는 정말 읽기 어려운가?" /><published>2022-06-17T12:00:00+09:00</published><updated>2022-06-17T12:00:00+09:00</updated><id>https://bakyeono.net/post/is-clojure-hard-to-read</id><content type="html" xml:base="https://bakyeono.net/post/2022-06-17-is-clojure-hard-to-read.html"></content><author><name>박연오(bakyeono@gmail.com)</name></author><category term="클로저" /><category term="코드" /><category term="S-식" /><category term="애리티" /><category term="재귀" /><category term="시퀀스" /><category term="함수형-프로그래밍" /><summary type="html"></summary></entry><entry><title type="html">프로그래머를 위한 이름 짓는 원리</title><link href="https://bakyeono.net/post/2021-09-24-programmers-naming.html" rel="alternate" type="text/html" title="프로그래머를 위한 이름 짓는 원리" /><published>2021-09-24T12:00:00+09:00</published><updated>2021-09-24T12:00:00+09:00</updated><id>https://bakyeono.net/post/programmers-naming</id><content type="html" xml:base="https://bakyeono.net/post/2021-09-24-programmers-naming.html"></content><author><name>박연오(bakyeono@gmail.com)</name></author><category term="이름" /><category term="클로저" /><category term="함수형-프로그래밍" /><summary type="html"></summary></entry><entry><title type="html">장고 ORM으로 역방향 참조 외래 키 찾기</title><link href="https://bakyeono.net/post/2020-11-29-django-reversed-foreign-keys.html" rel="alternate" type="text/html" title="장고 ORM으로 역방향 참조 외래 키 찾기" /><published>2020-11-29T12:00:00+09:00</published><updated>2020-11-29T12:00:00+09:00</updated><id>https://bakyeono.net/post/django-reversed-foreign-keys</id><content type="html" xml:base="https://bakyeono.net/post/2020-11-29-django-reversed-foreign-keys.html"></content><author><name>박연오(bakyeono@gmail.com)</name></author><category term="장고" /><category term="ORM" /><category term="SQL" /><summary type="html"></summary></entry><entry><title type="html">(번역) PWA 시대의 캐시 전략</title><link href="https://bakyeono.net/post/2020-09-23-request-with-intent.html" rel="alternate" type="text/html" title="(번역) PWA 시대의 캐시 전략" /><published>2020-09-23T12:00:00+09:00</published><updated>2020-09-23T12:00:00+09:00</updated><id>https://bakyeono.net/post/request-with-intent</id><content type="html" xml:base="https://bakyeono.net/post/2020-09-23-request-with-intent.html"></content><author><name>박연오(bakyeono@gmail.com)</name></author><category term="PWA" /><category term="캐시" /><summary type="html"></summary></entry><entry><title type="html">(번역) 서버에서 클라이언트로</title><link href="https://bakyeono.net/post/2020-06-22-server-to-client.html" rel="alternate" type="text/html" title="(번역) 서버에서 클라이언트로" /><published>2020-06-22T12:00:00+09:00</published><updated>2020-06-22T12:00:00+09:00</updated><id>https://bakyeono.net/post/server-to-client</id><content type="html" xml:base="https://bakyeono.net/post/2020-06-22-server-to-client.html"></content><author><name>박연오(bakyeono@gmail.com)</name></author><category term="HTTP" /><summary type="html"></summary></entry><entry><title type="html">리눅스에서 씽크패드 X1 카본 6세대 언더볼팅하기 (throttled)</title><link href="https://bakyeono.net/post/2020-04-27-thinkpad-x1-carbon-undervolting.html" rel="alternate" type="text/html" title="리눅스에서 씽크패드 X1 카본 6세대 언더볼팅하기 (throttled)" /><published>2020-04-27T21:00:00+09:00</published><updated>2020-04-27T21:00:00+09:00</updated><id>https://bakyeono.net/post/thinkpad-x1-carbon-undervolting</id><content type="html" xml:base="https://bakyeono.net/post/2020-04-27-thinkpad-x1-carbon-undervolting.html">&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#throttled&quot; id=&quot;markdown-toc-throttled&quot;&gt;throttled&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#throttled-설치&quot; id=&quot;markdown-toc-throttled-설치&quot;&gt;throttled 설치&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#throttled-설정&quot; id=&quot;markdown-toc-throttled-설정&quot;&gt;throttled 설정&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#throttled-사용&quot; id=&quot;markdown-toc-throttled-사용&quot;&gt;throttled 사용&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#sysbench-성능-테스트&quot; id=&quot;markdown-toc-sysbench-성능-테스트&quot;&gt;sysbench 성능 테스트&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#sysbench-설치&quot; id=&quot;markdown-toc-sysbench-설치&quot;&gt;sysbench 설치&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#sysbench-실행&quot; id=&quot;markdown-toc-sysbench-실행&quot;&gt;sysbench 실행&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#적절한-전압-조정치-찾기&quot; id=&quot;markdown-toc-적절한-전압-조정치-찾기&quot;&gt;적절한 전압 조정치 찾기&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#중요한-팁&quot; id=&quot;markdown-toc-중요한-팁&quot;&gt;중요한 팁&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#조정치-찾는-순서&quot; id=&quot;markdown-toc-조정치-찾는-순서&quot;&gt;조정치 찾는 순서&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#결과&quot; id=&quot;markdown-toc-결과&quot;&gt;결과&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;언더볼팅(CPU에 걸리는 전압을 낮추기)을 하면 CPU의 발열과 전력소모를 줄일 수 있다. 배터리 모드에서는 배터리 사용 시간을 늘릴 수 있고, 외부 전원을 사용할 때는 발열 감소로 쓰로틀링에 도달하는 시간을 늦춰 성능 향상을 노릴 수 있다. 하지만 전압을 과도하게 낮추면 CPU가 올바르게 동작하지 못해 시스템이 다운된다. 주의가 필요하긴 하지만 적절히 활용하면 노트북을 효율적으로 사용할 수 있다.&lt;/p&gt;

&lt;p&gt;언더볼팅 설명: &lt;a href=&quot;https://en.wikipedia.org/wiki/Dynamic_voltage_scaling&quot;&gt;https://en.wikipedia.org/wiki/Dynamic_voltage_scaling&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=&quot;https://github.com/erpalma/throttled&quot;&gt;throttled&lt;/a&gt;는 리눅스에서 언더볼팅을 할 수 있게 해주는 프로그램이다. 윈도우의 ThrottleStop 프로그램과 비슷하다. throttled는 원래 씽크패드 노트북의 리눅스 환경에서 쓰로틀링이 과다하게 걸리는 문제를 해결하기 위해 만든 것이라고 한다. 외부 전원 사용시의 CPU 온도가 80°C 미만일 때 쓰로틀링이 걸려서 성능을 제대로 내지 못하는 문제(&lt;a href=&quot;https://www.reddit.com/r/thinkpad/comments/870u0a/t480s_linux_throttling_bug/&quot;&gt;관련 내용&lt;/a&gt;)가 있다. 그러므로 언더볼팅을 하지 않더라도 사용을 고려해볼만하다.&lt;/p&gt;

&lt;p&gt;나는 이 프로그램을 이용해 씽크패드 X1 카본 6세대 노트북 + 만자로 리눅스(아크 리눅스 변종)에서 언더볼팅을 해봤다.&lt;/p&gt;

&lt;h2 id=&quot;throttled&quot;&gt;throttled&lt;/h2&gt;

&lt;h3 id=&quot;throttled-설치&quot;&gt;throttled 설치&lt;/h3&gt;

&lt;p&gt;아크 리눅스에서는 그냥 throttled 를 설치하면 된다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman -S --needed throttled
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;다른 배포판의 설치법은 &lt;a href=&quot;https://github.com/erpalma/throttled&quot;&gt;throttled 깃허브 문서&lt;/a&gt;에서 확인하기 바란다.&lt;/p&gt;

&lt;h3 id=&quot;throttled-설정&quot;&gt;throttled 설정&lt;/h3&gt;

&lt;p&gt;데몬을 실행하기 전에 설정 파일을 확인해보자. /etc/lenovo_fix.conf 파일을 열어보면 된다. 이 파일의 모든 항목은 위험할 수 있으니 문서를 자세히 읽어보고 수정해야 한다. 다음은 언더볼팅과 관련된 설정 항목만 꼽은 것이다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;[GENERAL]
Enabled: True    # 스크립트 사용 여부

[BATTERY]
Trip_Temp_C: 85  # 배터리 사용시 쓰로틀링 전까지 허용할 온도

[AC]
Trip_Temp_C: 95  # 외부 전원 사용시 쓰로틀링 전까지 허용할 온도

[UNDERVOLT.BATTERY]
CORE: 0          # 배터리 사용시 CPU 코어 전압 조정치
GPU: 0           # 배터리 사용시 내장 GPU 전압 조정치
CACHE: 0         # 배터리 사용시 CPU 캐시 전압 조정치
UNCORE: 0        # 배터리 사용시 시스템 에이전트 전압 조정치
ANALOGIO: 0      # 배터리 사용시 아날로그 입출력 전압 조정치

[UNDERVOLT.AC]
CORE: 0          # 외부 전원 사용시 CPU 코어 전압 조정치
GPU: 0           # 외부 전원 사용시 내장 GPU 전압 조정치
CACHE: 0         # 외부 전원 사용시 CPU 캐시 전압 조정치
UNCORE: 0        # 외부 전원 사용시 시스템 에이전트 전압 조정치
ANALOGIO: 0      # 외부 전원 사용시 아날로그 입출력 전압 조정치
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;전압 조정은 언더볼팅만 허용하기 때문에 음수로 입력해야 한다. (예: &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;CORE: -50&lt;/code&gt;) 적절한 언더볼팅 값은 테스트하면서 찾아야 하기 때문에 처음에는 설정치를 수정하지 않은 상태에서 throttled를 켜보자.&lt;/p&gt;

&lt;h3 id=&quot;throttled-사용&quot;&gt;throttled 사용&lt;/h3&gt;

&lt;p&gt;systemd를 이용해 throttled 데몬을 실행할 수 있다. 서비스 이름은 lenovo_fix다. 아래 명령으로 enabled 설정을 해 두면 부팅 때마다 자동으로 실행되며 언더볼팅 설정도 적용된다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo systemctl enable lenovo_fix.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이대로는 다음 부팅 때야 실행되므로, 지금 바로 사용해 보려면 start 명령으로 실행한다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo systemctl start lenovo_fix.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;설정을 수정한 경우에는 throttled 서비스를 재시작한다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo systemctl restart lenovo_fix.service
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h2 id=&quot;sysbench-성능-테스트&quot;&gt;sysbench 성능 테스트&lt;/h2&gt;

&lt;p&gt;sysbench 프로그램을 이용하면 시스템에 부하를 걸고 시간당 작업량을 확인할 수 있다. (시스템에 부하만 걸고 다른 방법으로 모니터링 하려면 stress 같은 프로그램을 이용해도 된다.)&lt;/p&gt;

&lt;h3 id=&quot;sysbench-설치&quot;&gt;sysbench 설치&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sudo pacman -S --needed sysbench
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;sysbench-실행&quot;&gt;sysbench 실행&lt;/h3&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sysbench cpu --threads=8 --time=120 run
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--threads&lt;/code&gt;는 CPU의 쓰레드 개수만큼 지정하고, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;--time&lt;/code&gt;은 120초 이상으로 설정해 준다. 위 명령을 실행하면 120초 동안 테스트를 진행하고 다음과 같이 결과를 낸다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;sysbench 1.0.18 (using system LuaJIT 2.0.5)

Running the test with following options:
Number of threads: 8
Initializing random number generator from current time


Prime numbers limit: 10000

Initializing worker threads...

Threads started!

CPU speed:
    events per second:  7785.85

General statistics:
    total time:                          120.0008s
    total number of events:              934320

Latency (ms):
         min:                                    0.92
         avg:                                    1.03
         max:                                   16.15
         95th percentile:                        1.03
         sum:                               959858.55

Threads fairness:
    events (avg/stddev):           116790.0000/74.80
    execution time (avg/stddev):   119.9823/0.00
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;결과에서 General statistics total number of events 를 확인하면 작업 시간동안 수행한 작업 총량을 확인할 수 있다.&lt;/p&gt;

&lt;p&gt;테스트 시간이 너무 짧으면 발열에 따른 성능 저하가 반영되지 않으므로 테스트 시간을 2분 이상으로 설정하는 것이 좋다. 또, 열이 쌓인 상태에서 테스트를 하면 측정치가 정확하지 않을 수 있으므로 테스트를 여러 번 할 때는 열이 완전히 식은 상태에서 시작할 수 있도록 테스트마다 5분 정도씩 간격을 두는 것이 좋다.&lt;/p&gt;

&lt;h2 id=&quot;적절한-전압-조정치-찾기&quot;&gt;적절한 전압 조정치 찾기&lt;/h2&gt;

&lt;p&gt;이제 조정치를 적절히 수정하고 테스트를 반복하면서 시스템에 맞는 조정치를 찾으면 된다. 윈도우에서 ThrottleStop으로 하는 것과 크게 다르지 않다.&lt;/p&gt;

&lt;h3 id=&quot;중요한-팁&quot;&gt;중요한 팁&lt;/h3&gt;

&lt;p&gt;외부 전원을 연결한 채로 언더볼팅을 한다. 처음에는 외부 전원을 연결했을 때의 전압 조정치만 수정한다. 조정치가 과도하면 시스템이 멈춘 뒤 부팅이 안 될 수 있다. 이 때는 전원을 빼고 배터리로 부팅한다. 배터리 모드의 전압을 조정하지 않았으므로 부팅이 될 것이다.&lt;/p&gt;

&lt;p&gt;시스템 에이전트(UNCORE)와 아날로그 입출력(ANALOGIO)의 조정치는 수정할 필요가 없다. 리스크에 비해 얻는 것이 별로 없다.&lt;/p&gt;

&lt;h3 id=&quot;조정치-찾는-순서&quot;&gt;조정치 찾는 순서&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;/etc/lenovo_fix.conf 파일에서 CORE, GPU, CACHE의 조정치를 -10 낮춘다.&lt;/li&gt;
  &lt;li&gt;throttled를 재시작한다. (&lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sudo systemctl restart lenovo_fix.service&lt;/code&gt;)&lt;/li&gt;
  &lt;li&gt;sysbench로 2분 이상 스트레스 테스트를 해본다.&lt;/li&gt;
  &lt;li&gt;A) sysbench가 성공했으면 점수를 기록하고, 1로 가서 조정치를 더 낮춰 본다.&lt;br /&gt;B) 시스템에 이상이 발생했으면 배터리 모드로 컴퓨터를 껐다 켜고, 마지막에 성공한 조정치를 사용한다. 마지막에 성공한 것보다 조금 더 안전한 조정치를 사용하는 것도 좋다.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;적절한 조정치를 찾았으면 /etc/lenovo_fix.conf 파일에 기록해두고 외부 전원을 뽑은 채로 배터리용 조정치도 같은 방법으로 찾으면 된다.&lt;/p&gt;

&lt;h2 id=&quot;결과&quot;&gt;결과&lt;/h2&gt;

&lt;p&gt;다음은 내가 씽크패드 X1 카본 6세대(Intel Core i5-8250U)를 언더볼팅한 결과다.&lt;/p&gt;

&lt;table&gt;
  &lt;thead&gt;
    &lt;tr&gt;
      &lt;th&gt;POWER&lt;/th&gt;
      &lt;th&gt;CORE&lt;/th&gt;
      &lt;th&gt;GPU&lt;/th&gt;
      &lt;th&gt;CACHE&lt;/th&gt;
      &lt;th&gt;SCORE&lt;/th&gt;
    &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
    &lt;tr&gt;
      &lt;td&gt;AC&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;901211&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AC&lt;/td&gt;
      &lt;td&gt;-80&lt;/td&gt;
      &lt;td&gt;-80&lt;/td&gt;
      &lt;td&gt;-80&lt;/td&gt;
      &lt;td&gt;931802&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AC&lt;/td&gt;
      &lt;td&gt;-110&lt;/td&gt;
      &lt;td&gt;-110&lt;/td&gt;
      &lt;td&gt;-110&lt;/td&gt;
      &lt;td&gt;935153&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AC&lt;/td&gt;
      &lt;td&gt;-115&lt;/td&gt;
      &lt;td&gt;-115&lt;/td&gt;
      &lt;td&gt;-115&lt;/td&gt;
      &lt;td&gt;935268&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AC&lt;/td&gt;
      &lt;td&gt;-120&lt;/td&gt;
      &lt;td&gt;-120&lt;/td&gt;
      &lt;td&gt;-120&lt;/td&gt;
      &lt;td&gt;934320&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;AC&lt;/td&gt;
      &lt;td&gt;-125&lt;/td&gt;
      &lt;td&gt;-125&lt;/td&gt;
      &lt;td&gt;-125&lt;/td&gt;
      &lt;td&gt;(dead)&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;BATTERY&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;0&lt;/td&gt;
      &lt;td&gt;659796&lt;/td&gt;
    &lt;/tr&gt;
    &lt;tr&gt;
      &lt;td&gt;BATTERY&lt;/td&gt;
      &lt;td&gt;-110&lt;/td&gt;
      &lt;td&gt;-110&lt;/td&gt;
      &lt;td&gt;-110&lt;/td&gt;
      &lt;td&gt;659691&lt;/td&gt;
    &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;-120 mV 에서는 화면이 이상해지는 문제가 생겼고, -125 mV에서는 시스템이 멈췄다. -110 mV 정도가 적당한 것 같다. 조정을 하지 않았을 때에 비해 성능이 3% 가량 향상되었다.&lt;/p&gt;

&lt;p&gt;배터리 모드에서는 쓰로틀링이 걸리기 때문에 -110 mV로 조정하더라도 점수의 향상은 없었다. 하지만 같은 연산을 하는 데 드는 발열이 덜한 만큼 배터리 소모가 덜해질 것이라고 기대해 본다. 아쉽게도 이 경우의 온도와 전력 소모를 정확하게 측정할 방법을 찾지 못했다.&lt;/p&gt;

&lt;p&gt;언더볼팅을 마치고, 시스템 안정성과 배터리 사용 시간을 고려해 쓰로틀링 진입 제한 온도를 전원: 92°C, 배터리: 69°C로 설정해 두었다.&lt;/p&gt;</content><author><name>박연오(bakyeono@gmail.com)</name></author><category term="리눅스" /><category term="씽크패드" /><category term="언더볼팅" /><category term="throttled" /><summary type="html"></summary></entry><entry><title type="html">날짜 구간에 값을 매핑하는 방법 (그리고 RangeKeyDict)</title><link href="https://bakyeono.net/post/2019-12-16-range-key-dict-date-mapping.html" rel="alternate" type="text/html" title="날짜 구간에 값을 매핑하는 방법 (그리고 RangeKeyDict)" /><published>2019-12-16T12:00:00+09:00</published><updated>2019-12-16T12:00:00+09:00</updated><id>https://bakyeono.net/post/range-key-dict-date-mapping</id><content type="html" xml:base="https://bakyeono.net/post/2019-12-16-range-key-dict-date-mapping.html"></content><author><name>박연오(bakyeono@gmail.com)</name></author><category term="날짜" /><category term="매핑" /><category term="파이썬" /><summary type="html"></summary></entry><entry><title type="html">[책소개] 『파이썬으로 데이터 주무르기』</title><link href="https://bakyeono.net/post/2018-03-28-book-review-manipulate-data-with-python.html" rel="alternate" type="text/html" title="[책소개] 『파이썬으로 데이터 주무르기』" /><published>2018-03-28T11:00:00+09:00</published><updated>2018-03-28T11:00:00+09:00</updated><id>https://bakyeono.net/post/book-review-manipulate-data-with-python</id><content type="html" xml:base="https://bakyeono.net/post/2018-03-28-book-review-manipulate-data-with-python.html">&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#데이터-분석-과정을-보여주는-책&quot; id=&quot;markdown-toc-데이터-분석-과정을-보여주는-책&quot;&gt;데이터 분석 과정을 보여주는 책&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#실습하고-응용하며-배우기&quot; id=&quot;markdown-toc-실습하고-응용하며-배우기&quot;&gt;실습하고 응용하며 배우기&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;페이스북 그룹 &lt;a href=&quot;https://www.facebook.com/groups/pythonkorea&quot;&gt;‘Python Korea’&lt;/a&gt;에 데이터 분석 학습 모임 광고가 뜬 걸 보고 참가 신청했다. &lt;a href=&quot;https://www.facebook.com/groups/dastudy&quot;&gt;‘데이터 분석 스터디’&lt;/a&gt;라는 페이스북 그룹의 모임이다. 지원자들이 스무 명 가까이 줄을 설 만큼 인기가 많았다. 나도 친구들과 함께 참가하고 싶었지만 모임에 빈 자리가 없어 혼자만 끼게 됐다. 이 모임에서 &lt;a href=&quot;http://pinkwink.kr/1070&quot;&gt;『파이썬으로 데이터 주무르기』&lt;/a&gt;를 교재로 학습했다.&lt;/p&gt;

&lt;h2 id=&quot;데이터-분석-과정을-보여주는-책&quot;&gt;데이터 분석 과정을 보여주는 책&lt;/h2&gt;

&lt;p&gt;&lt;img src=&quot;/img/book-manipulate-data-with-python.png&quot; alt=&quot;파이썬으로 데이터 주무르기&quot; /&gt;&lt;/p&gt;

&lt;p&gt;좋은 스토리를 쓰려면 설명하지 말고 보여주라고 했다. 저자가 그 격언에 따른 것인지, 이 책에는 설명이 별로 없는 대신 흥미진진한 예제로 가득하다. ‘저렴한 주유소 찾는 법’처럼 가벼운 일상 프로젝트부터 ‘인구 소멸 지역 분석’처럼 연구 주제로 다뤄볼만한 프로젝트까지, 데이터 분석가가 실제로 할 법한 중규모 프로젝트들을 보여준다.&lt;/p&gt;

&lt;p&gt;데이터 분석 전체 과정을 다루는만큼 소개하는 내용이 적지 않다. 수작업과 크롤링으로 데이터를 수집하는 과정, 수집한 데이터를 정리정돈하는 과정, 데이터의 특징을 요모조모 살펴보고 조작해보는 과정, 플롯팅·매핑 등 여러 가지 시각화해보는 과정 등이 소개된다. 실습에 쓰이는 도구도 많아서, 파이썬, &lt;a href=&quot;https://pandas.pydata.org&quot;&gt;팬더스(Pandas)&lt;/a&gt;, &lt;a href=&quot;http://www.numpy.org&quot;&gt;넘파이(NumPy)&lt;/a&gt;, &lt;a href=&quot;https://github.com/python-visualization/folium&quot;&gt;폴리엄(Folium)&lt;/a&gt;, &lt;a href=&quot;https://www.crummy.com/software/BeautifulSoup/bs4/doc&quot;&gt;뷰티플 솝(Beautiful Soup)&lt;/a&gt;, &lt;a href=&quot;https://www.seleniumhq.org&quot;&gt;셀레늄(Selenium)&lt;/a&gt;, 구글 맵스, &lt;a href=&quot;http://konlpy-ko.readthedocs.io&quot;&gt;KoNLPy&lt;/a&gt; 등 여러 도구가 쉴새 없이 등장한다. 분량이 다소 많을 수 있으나, 진행 과정이 처음부터 끝까지 차례차례 나오므로 조금 노력하면 대부분의 사람들이 따라할 수 있을 것 같다.&lt;/p&gt;

&lt;p&gt;데이터 분석에 필요한 지식과 도구를 모두 익힌 뒤에 일을 하고자 한다면 엄두를 내기 어려울 것이다. 저자는 독자들이 세부 사항을 스스로 학습할 것이라고 믿고, 독자들이 데이터 분석 실무 과정을 체험하도록 하는 데 집중한다. 덕분에 입문자들이 전체 그림을 파악하기에 좋은 책이 된 것 같다. 데이터 분석을 시작해볼까 고민하는 분들, 어떻게 시작해야 할지 알고 싶은 분들이 보기 좋다. 나도 이 책을 학습하고는 팬더스와 통계학을 좀 더 공부해보고 싶은 마음이 생겼다. 함께 학습한 스터디 그룹에서도 다음에 학습할 책으로 &lt;a href=&quot;http://www.hanbit.co.kr/store/books/look.php?p_code=B6540908288&quot;&gt;『파이썬 라이브러리를 활용한 데이터 분석』&lt;/a&gt;이 선정되었다.&lt;/p&gt;

&lt;h3 id=&quot;실습하고-응용하며-배우기&quot;&gt;실습하고 응용하며 배우기&lt;/h3&gt;

&lt;p&gt;1장부터 6장까지 책 내용에 따라 실습을 해 봤다. 설명이 많지 않아 스스로 고민하고 찾아 봐야 하는 부분도 적지 않지만, 전체적으로는 무난하게 실습이 가능했다. 7장과 8장은 읽어보기만 하고 실습은 생략했다.&lt;/p&gt;

&lt;p&gt;내가 진행한 실습 코드: &lt;a href=&quot;https://github.com/bakyeono/study-python-ds&quot;&gt;https://github.com/bakyeono/study-python-ds&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;데이터 분석을 파이썬으로만 하란 법은 없으니 책 내용을 응용해서 R, 클로저(Clojure), 자바스크립트 등 다른 언어로 해 보는 것도 재미있을 것 같다.&lt;/p&gt;

&lt;p&gt;미식가 친구 &lt;a href=&quot;http://kimdongwook.net&quot;&gt;김동욱&lt;/a&gt; 씨가 “더본코리아 프랜차이즈 기업의 음식점들을 안내하는 지도가 필요하다”고 얘기하곤 했는데, 책에 나온 내용을 응용해 볼 겸 하여 지도에 매장을 표시해 봤다. 음식점 정보는 더본코리아 웹사이트에서 구할 수 있고, 파이썬 스크립트를 작성해 수집했다. 지도에 표시하는 것은 &lt;a href=&quot;http://leafletjs.com&quot;&gt;리플릿(Leaflet)&lt;/a&gt; 라이브러리로 했다. 폴리엄도 이 라이브러리를 쓴다.&lt;/p&gt;

&lt;link rel=&quot;stylesheet&quot; href=&quot;https://unpkg.com/leaflet@1.3.1/dist/leaflet.css&quot; /&gt;

&lt;script src=&quot;https://unpkg.com/leaflet@1.3.1/dist/leaflet.js&quot;&gt;&lt;/script&gt;

&lt;div id=&quot;mapping1&quot; style=&quot;height: 480px;&quot;&gt;&lt;/div&gt;
&lt;script&gt;
      var i, len
      var thebornkorea_stores = [[&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2923719, 127.04937769999992]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.0553985, 129.37705430000005]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.00082657398124, 127.11380090484613]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.2749049, 127.04444349999994]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.6631693, 127.50733500000001]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3628905, 126.71728710000002]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.942325, 128.56123860000002]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.323454, 127.12355300000002]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5191308, 126.85364349999998]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.6761688, 126.74826000000007]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.5419391, 129.42697729999998]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.8670824, 128.59860000000003]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4933785, 126.49156059999996]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5483312, 126.86734330000002]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [36.792923, 127.16062940000006]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [34.8861709, 128.6244501]], [&quot;\ubcf8\uac00&quot;, [35.691335, 128.45342319999997]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3275024, 128.01146119999999]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.1248459, 128.3473583]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.5632078, 128.7001275]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.9927179, 127.10635130000003]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.3456845, 127.93124799999998]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.2808351, 127.4435856]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4120096, 127.12725610000007]], [&quot;\uc131\uc131\uc2dd\ub2f9&quot;, [37.5422453, 127.07140670000001]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4988392, 126.93007030000001]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.56766200000001, 126.82947000000001]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5309639, 126.65155890000005]], [&quot;\ubcf8\uac00&quot;, [35.2035201, 128.80579139999998]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6553244, 127.24681869999995]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3932795, 126.96315900000002]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5929425, 127.01851090000002]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.6450057, 126.62490189999994]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.8767334, 128.6291784]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [34.79790609999999, 126.43158629999994]], [&quot;\ubcf8\uac00&quot;, [37.4099707, 127.20214780000003]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.3709525, 126.72810290000007]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.43403199999999, 127.1363814]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [33.4867374, 126.49128139999993]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.7456617, 127.10884090000002]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.4949135, 127.0307206]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.2061916, 127.0748036]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.7971884, 127.06025410000007]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5477399, 126.83600879999995]], [&quot;\uc6d0\ud0a4\uce5c&quot;, [37.4860508, 126.98260570000002]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.4844484, 126.90059569999994]], [&quot;\ubc31's \ube44\uc5b4&quot;, [36.13804820000001, 128.41860500000007]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.7161734, 127.42885999999999]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.6092795, 127.50327219999997]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.51990929999999, 126.93178319999993]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.1583011, 127.06067710000002]], [&quot;\ubc31's \ube44\uc5b4&quot;, [36.634137, 127.46270789999994]], [&quot;\ubc31's \ube44\uc5b4&quot;, [35.2341919, 129.0118235]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.5694394, 127.07056319999992]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.2749413, 127.04455439999992]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5764888, 126.8307466]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5251801, 126.87535930000001]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4981873, 127.05365529999995]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4584045, 126.68981429999997]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3377616, 126.81116900000006]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2679975, 127.21835399999998]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [35.322794, 129.17872169999998]], [&quot;\ubcf8\uac00&quot;, [37.6931857, 126.77257179999992]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.2156082, 126.84627739999996]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.3744239, 126.72947959999999]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5913614, 127.01767219999999]], [&quot;\uc131\uc131\uc2dd\ub2f9&quot;, [37.5002493, 127.02751660000001]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5480716, 126.83537790000003]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.1551384, 129.06126159999997]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.8673622, 128.59870290000003]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5820254, 127.08849809999992]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4076241, 126.67228009999997]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.8248389, 128.5256468]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.8787744, 127.72716889999992]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.2101695, 129.00779120000004]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.466121, 127.13978900000006]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.492494, 126.7252307]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.532556, 126.65290490000007]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.1364058, 129.0995716]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4975512, 127.03296869999997]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.2686413, 127.00414619999992]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3217798, 127.09409779999999]], [&quot;\ubcf8\uac00&quot;, [33.259574, 126.40603950000002]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.4034281, 126.72342389999994]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.46152319999999, 126.68052510000007]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.3995581, 126.97743330000003]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.4862754, 126.98023269999999]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4929839, 127.01595520000001]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.2059531, 127.07269739999992]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [35.1706667, 129.17602910000005]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6389527, 127.02426349999996]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5368715, 126.96872080000003]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.46779799999999, 127.0413072]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3074958, 126.8166407]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.3614965, 127.34999859999994]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.877332388287805, 128.73220458626747]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.646663951203585, 127.12272377684712]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [36.3661878, 127.43706359999999]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4136212, 126.67628149999996]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.4923531, 126.72579050000002]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4792536, 126.85373400000003]], [&quot;\ud574\ubb3c\ub5a1\ucc1c0410&quot;, [37.510021, 127.08408310000004]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.491878, 126.72468140000001]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.483226062333216, 127.12187209416504]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.4136579, 126.67811759999995]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5078301, 126.7356039]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.47702779999999, 126.9626283]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.6123272, 127.03136770000003]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5538844, 126.85215840000001]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.6943206, 126.76809709999998]], [&quot;\ubcf8\uac00&quot;, [34.8889288, 128.62700799999993]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.2621061, 128.87128039999993]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.0992806, 129.02708389999998]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5342794, 126.90040429999999]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2054958, 127.07263319999993]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [36.6375895, 127.46981359999995]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.2960066, 126.86280060000001]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.0915155, 129.04266370000005]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.6543814, 127.06366559999992]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2382511, 128.58316119999995]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.31128770000001, 126.83144049999999]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.7659082, 128.87788160000002]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [35.1541921, 126.85443039999996]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.3927168, 126.64570129999993]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.3358955, 129.02754449999998]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.64534883825562, 126.62610728567506]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.1994932, 126.83118869999998]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.9010133, 126.6462335]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4014752, 126.72205659999997]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4898456, 126.89104969999994]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.64413402017776, 126.62583906477357]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.72846403409005, 126.73542402684689]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.8117482, 128.75538219999999]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [34.8583666, 128.42630029999998]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [36.625757, 127.43354499999998]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [34.8070658, 126.37383869999996]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.531318, 126.8466889]], [&quot;\ubcf8\uac00&quot;, [36.5184, 126.79999999999995]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.8335489, 127.13618919999999]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.838055056513426, 127.0566307939589]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [35.8657546, 128.58952120000004]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [35.0995844, 129.0266567]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.5568464, 128.7001616]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.69264725117326, 128.46067592855832]], [&quot;\ubc31's \ube44\uc5b4&quot;, [35.9611247, 126.9571995]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.50531459999999, 126.67246649999993]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.5999539, 127.14019970000004]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.9611247, 126.9571995]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.5410882, 127.06931740000005]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.6911195, 128.47528799999998]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.752196, 126.76623240000004]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.51302820000001, 126.94442100000003]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.3618157, 127.35051190000001]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.7775514, 127.00118070000008]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5143735, 127.10911020000003]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.4630715, 126.6817661]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [36.6401989, 127.43054970000003]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.6587754, 127.0684857]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1022259, 128.8118955]], [&quot;\ubcf8\uac00&quot;, [35.9658994, 126.71678769999994]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.3381667, 129.02810239999997]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.6015922, 126.65575020000006]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [34.9696155, 127.52342040000008]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.3263852, 127.42440569999997]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5727002, 127.01607209999997]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2646176, 127.03114789999995]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.4187357, 128.1546062]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [36.8327827, 127.13553639999998]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [35.1916057, 126.82928679999998]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5985883, 126.66417150000007]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.6372695, 126.63132150000001]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.13773680000001, 128.41951330000006]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.3207196, 127.11208720000002]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.2521918, 127.07614510000008]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5411313, 126.83943610000006]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.6510283, 127.07722719999992]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4297367, 127.13048290000006]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5690353, 126.98704969999994]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.224793788732825, 128.58508286455685]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.0832651, 128.90394249999997]], [&quot;\ud574\ubb3c\ub5a1\ucc1c0410&quot;, [37.50221990000001, 127.0272943]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4834102, 126.89970979999998]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.3070387, 126.98576379999997]], [&quot;\ubc31's \ube44\uc5b4&quot;, [35.1639461, 128.9844671]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.28395081740183, 127.4616150840302]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.973334, 129.3999506]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.4839339, 128.7519622]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [35.1455348, 126.9168108]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.1994932, 126.8311887]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6152464, 126.7156325]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.4000905, 126.9230311]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.4834123, 126.9291608]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5023802, 126.7725447]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.5253419, 126.8726779]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.6178665, 126.9194706]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.2136802, 127.0406912]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.3595003, 126.9306542]], [&quot;\ub9c8\uce74\uc624\ubc18\uc8100410&quot;, [35.5380178, 129.3483974]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.3988884, 126.9233148]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.3864229, 127.1259277]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [34.9522217, 127.5176635]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.519376, 127.099376]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.9842153, 127.9400399]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [35.1521117, 128.7029022]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5070996, 126.735882]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4426999532675, 126.79347038269043]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.444494, 126.7016991]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.5034537, 126.7622172]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.5171257, 127.1020148]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2681687, 127.0027013]], [&quot;\ubc31\ucca0\ud3100410&quot;, [35.1626379, 129.1593141]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.4326822, 127.1305924]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [34.8901336, 128.6235852]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1750317, 128.1485237]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.866731, 127.7535965]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.5409158, 127.0698537]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3910464, 126.9538211]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.7404909, 127.0479989]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4140073, 126.6767243]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.77419562, 126.4495953]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.4865038, 126.7815767]], [&quot;\ubcf8\uac00&quot;, [37.5414539, 127.0648612]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.9972792, 127.1026]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.8335395, 127.1356423]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.067292, 127.0602499]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [36.9916914, 127.0863277]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.2683594, 127.0041634]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3989096, 126.922376]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.4798346, 126.8824997]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.5921344, 127.0172261]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [36.3505664, 127.3886214]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1793115, 128.5589911]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5168004, 126.9067297]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.0990483, 129.0298142]], [&quot;\ubcf8\uac00&quot;, [35.1168302, 128.9599638]], [&quot;\ubcf8\uac00&quot;, [37.6509566, 126.6569857]], [&quot;\ubcf8\uac00&quot;, [37.4952973, 126.7777721]], [&quot;\ubcf8\uac00&quot;, [36.9873448, 127.9449925]], [&quot;\ubcf8\uac00&quot;, [36.6240751, 127.4829192]], [&quot;\ubcf8\uac00&quot;, [37.0591168, 127.0753566]], [&quot;\ubcf8\uac00&quot;, [35.9520478, 128.5541697]], [&quot;\ubcf8\uac00&quot;, [35.1995055, 126.8367922]], [&quot;\ubcf8\uac00&quot;, [35.1266337, 129.1020668]], [&quot;\ubcf8\uac00&quot;, [35.3169318, 129.1661425]], [&quot;\ubcf8\uac00&quot;, [33.4850323, 126.5435562]], [&quot;\ubcf8\uac00&quot;, [37.7578906, 126.7729094]], [&quot;\ubcf8\uac00&quot;, [35.2409154, 128.9035965]], [&quot;\ubcf8\uac00&quot;, [36.8312078, 127.1279306]], [&quot;\ubcf8\uac00&quot;, [37.7415886, 127.0866357]], [&quot;\ubcf8\uac00&quot;, [37.7233428, 126.7505133]], [&quot;\ubcf8\uac00&quot;, [36.994601, 127.1388581]], [&quot;\ubcf8\uac00&quot;, [37.3897865, 127.1098561]], [&quot;\ubcf8\uac00&quot;, [36.7803697, 127.1271922]], [&quot;\ubcf8\uac00&quot;, [35.1679675, 129.1687191]], [&quot;\ubcf8\uac00&quot;, [36.1222729, 128.3494588]], [&quot;\ubcf8\uac00&quot;, [37.5985883, 126.6641715]], [&quot;\ubcf8\uac00&quot;, [36.1376277, 128.4205572]], [&quot;\ubcf8\uac00&quot;, [37.6315601, 126.8310897]], [&quot;\ubcf8\uac00&quot;, [36.0768678, 129.39664]], [&quot;\ubcf8\uac00&quot;, [36.8982283, 126.6515053]], [&quot;\ubcf8\uac00&quot;, [35.1547373, 129.020766]], [&quot;\ubcf8\uac00&quot;, [37.5141796, 127.0185909]], [&quot;\ubcf8\uac00&quot;, [37.5027322, 127.0372573]], [&quot;\ubcf8\uac00&quot;, [35.1851707, 129.0940003]], [&quot;\ubcf8\uac00&quot;, [37.4907123, 127.0867524]], [&quot;\ubcf8\uac00&quot;, [33.4815133, 126.4905091]], [&quot;\ubcf8\uac00&quot;, [37.5063572, 127.02409969999997]], [&quot;\ubcf8\uac00&quot;, [37.4101131, 127.2593601]], [&quot;\ubcf8\uac00&quot;, [37.6556645, 127.0645822]], [&quot;\ubcf8\uac00&quot;, [37.4927153, 127.0585168]], [&quot;\ubcf8\uac00&quot;, [37.6624033, 126.7669109]], [&quot;\ubcf8\uac00&quot;, [37.517425, 126.8964798]], [&quot;\ubcf8\uac00&quot;, [37.5153194, 127.1115967]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.6334485, 127.4598779]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.44312, 126.79079790000003]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.6319254, 126.8311214]], [&quot;\ubc31\ucca0\ud3100410&quot;, [36.3513049, 127.377003]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.4979157, 127.053713]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [36.9921075, 127.1129451]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5106157, 127.0834978]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.6906188, 126.7621524]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.6566872, 126.7706105]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.2639529, 127.0351497]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.3771852, 127.112148]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5031991, 127.022908]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [35.1529151, 129.0583243]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.3604357, 126.9318679]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.3863669, 127.1248104]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.4828856, 126.929304]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.2639529, 127.0351497]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.3771852, 127.112148]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5031991, 127.022908]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [35.1529151, 129.0583243]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.3604357, 126.9318679]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.3863669, 127.1248104]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5309639, 126.6515589]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.3913836, 126.9548553]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.4450881, 126.7022211]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.3913836, 126.9548553]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5409175, 126.9492071]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [36.3505518, 127.3751685]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.6557243, 127.0635977]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.6557107, 127.1205764]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5996984, 127.1377814]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.48323, 126.9004813]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.4931863, 127.0163506]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.474826, 126.8694508]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.5354497, 126.7368371]], [&quot;\ub3cc\ubc30\uae30\uc9d1&quot;, [37.6557243, 127.0635977]], [&quot;\uc6d0\ud0a4\uce5c&quot;, [37.3799039, 127.132421]], [&quot;\uc808\uad6c\ubbf8\uc9d1&quot;, [37.4770244, 126.8826848]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4951294, 127.1207629]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1547373, 129.020766]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.0808217, 128.9763421]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4924404, 126.7242726]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3835014, 127.12176210000007]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4108335, 127.1267763]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3683459, 127.1105569]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5034563, 127.0518801]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5109367, 127.0808617]], [&quot;\ub300\ud55c\uad6d\ubc25&quot;, [37.4094099, 126.6783088]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.992297, 127.087035]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2159377, 127.0138617]], [&quot;\ub300\ud55c\uad6d\ubc25&quot;, [36.1406257, 128.3091883]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2234693, 127.0616791]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.268159, 127.0029416]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.2130893, 127.0403844]], [&quot;\ubc31's \ube44\uc5b4&quot;, [35.2054988, 129.0816184]], [&quot;\ubc31's \ube44\uc5b4&quot;, [35.1538387, 129.0607343]], [&quot;\ubc31's \ube44\uc5b4&quot;, [35.099054, 129.0307467]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.558649, 126.9364345]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.5172845, 126.9071525]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.6194614, 126.9181893]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.5528445, 126.9213279]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.4628308, 126.6819128]], [&quot;\ubc31's \ube44\uc5b4&quot;, [37.4748744, 126.629817]], [&quot;\ubc31's \ube44\uc5b4&quot;, [35.8431006, 127.1278466]], [&quot;\ubc31's \ube44\uc5b4&quot;, [35.8175513, 127.10876200000007]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.5707627, 126.9873772]], [&quot;\ubc31\ucca0\ud3100410&quot;, [35.1472365, 126.9151882]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.2677878, 127.0019893]], [&quot;\ubc31\ucca0\ud3100410&quot;, [37.4856189, 126.9807956]], [&quot;\ubc31\ucca0\ud3100410&quot;, [35.2218578, 128.6847708]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.5534566, 126.9231184]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.2527536, 127.0734351]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.2465778, 127.0568131]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.412155, 127.1298683]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.2130893, 127.0403844]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.3799039, 127.132421]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.4012318, 127.108642]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.5828631, 127.0014881]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.5698037, 126.9845081]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.5107691, 127.0816748]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.4934014, 127.0161069]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.5009564, 127.0250917]], [&quot;\ubbf8\uc815\uad6d\uc2180410&quot;, [37.5577105, 126.9364659]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5395537, 127.1272517]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.6336072, 127.46029720000001]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.1448098, 126.9176906]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.9829061, 127.9402723]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.3503363, 127.3763568]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.0666469, 127.0609426]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.9917523, 127.0889681]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.4450881, 126.7022211]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5599951, 127.0397615]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5449781, 126.6750258]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.1626379, 129.1593141]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5104857, 127.0817281]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5692325, 126.9852551]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.4631982, 126.6814146]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.2213623, 128.6847227]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.8326339, 127.1358946]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.41352, 126.6774671]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5207208, 126.9948731]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5186253, 126.909203]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.1590503, 127.0597041]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.1468973, 127.0754125]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.537879, 129.3352003]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.346842, 127.9321307]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.7374394, 127.0384317]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.4856189, 126.9807956]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.44312, 126.7907979]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.3457031, 126.7356168]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.6018392, 126.6550505]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.4834622, 126.9294937]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5567009, 126.9365267]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.7700947, 127.0013076]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.3183532, 126.8385212]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.3990577, 126.9238003]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.4747316, 126.6301222]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.662702, 126.7666057]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.237161, 128.5822833]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.3910464, 126.9538211]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.2053967, 129.0796249]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.1634252, 128.9845717]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.4927493, 126.725682]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.1533219, 129.0582933]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.6210076, 126.7162383]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5141841, 127.1092098]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.6559745, 127.0649273]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.2682005, 127.0038104]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5066789, 127.0245309]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.2652368, 127.0322628]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.8676836, 128.5984229]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5826952, 127.0025263]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5404707, 126.8372285]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [34.8891503, 128.624267]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2138286, 126.9767039]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5336701, 126.7355649]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.6325293, 126.831871]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.4743485, 126.86927370000001]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.410375, 127.2588706]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.1536003, 126.8533302]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.1910714, 126.8297743]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [35.1786851, 126.8945744]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5995281, 127.1386475]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.0945456, 128.4283421]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5378668, 127.0848594]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.5360803, 127.1368432]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [36.1346986, 128.1193248]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5547481, 126.9236715]], [&quot;\ud55c\uc2e0\ud3ec\ucc28&quot;, [37.552902, 126.8523126]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5600007, 127.0409001]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1628856, 129.1628201]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.561044422251264, 126.93285942077637]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1954404, 128.0827969]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2063477, 128.576138]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.221629, 128.6845777]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2236469, 128.6846402]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2355574, 127.2063495]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.8177597, 127.1561406]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.539058, 127.1265129]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.6309197, 127.4893668]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.8790201, 127.7270315]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3937118, 126.9629351]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.0768678, 129.39664]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.0291741, 129.3635322]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5338912, 127.0061366]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4630633, 126.6814351]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3230058, 127.12399]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5038148, 126.7616392]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4861005, 126.9810343]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5078246, 126.960673]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.9591346, 126.97655570000006]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4451525, 126.7015159]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.431977729190855, 126.72387543017976]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5082781, 126.7342753]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.392921, 126.646044]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5309639, 126.6515589]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.6557011, 126.7719572]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5617269, 127.0681643]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.8441601, 127.12490860000003]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.8197722, 127.14337160000002]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5695342, 126.988699]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5691376, 126.9858298]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5958202, 127.0621475]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.5401388, 129.3363184]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.5537119, 129.3198345]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.4980232, 129.426267]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3183017, 126.8395159]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3459014, 127.9292398]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3997714, 126.9219209]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3496474, 127.9507669]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4018045, 126.9554341]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.7418349, 127.04840390000004]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.525543, 127.0274856]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.31778658, 129.0018865]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5480588, 127.0723123]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5268991, 126.9166394]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4896239, 126.8176271]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.619209, 126.9197683]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4843796, 127.0116131]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.1527191, 127.07714039999996]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5637, 127.0322975]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4834339, 126.9277664]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.51827280000001, 127.02280989999997]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2785695, 127.0434914]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5793996, 126.9872263]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2951555, 126.8627547]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2680147, 127.0032491]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2507245, 127.0781594]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2647782, 127.0311486]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.2957492, 126.9941898]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.6360593, 127.0228193]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3209662, 127.0942249]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5580661, 126.9375418]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5443853, 126.96993040000007]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2215828, 126.8447106]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4990268, 126.9299874]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4691987, 126.9367807]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.50039758870085, 127.02898979187012]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4911643, 127.010897]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4572569, 127.1640592]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5920953, 127.0176263]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5042292, 126.7523467]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.515419, 127.1111991]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1728953, 129.1734726]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2445494, 129.2221542]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1078076, 128.9677283]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4851557, 126.7809462]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3507268, 127.1082992]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3774033, 127.1128218]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4714316, 126.9832228]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3596969, 126.9312711]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.15566, 129.061019]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2342044, 129.0109081]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1736775, 129.1292105]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1684247, 129.1168172]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1984277, 129.060399]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.3367764, 129.0281562]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1706794, 129.0698393]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1156261, 129.0395075]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4324467, 127.1304358]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.187895, 129.0815014]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5631978, 126.985192]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1684052, 129.1781146]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.482139, 126.9968963]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3907562, 126.9534327]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4911639, 126.9243844]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1367561, 129.1007986]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2038408, 129.0011218]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2330488, 129.0847985]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2101703, 129.0085556]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2038345, 129.1218034]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1562467, 129.057384]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2372177, 128.8672937]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5834599, 127.0003524]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4698257, 126.89753829999995]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.3534178, 127.3777204]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5815988, 127.0030708]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5353709, 126.8992817]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5682993, 127.00739569999996]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.2985735, 128.7440748]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.1042574, 129.0310089]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5306581, 126.8470237]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5131509, 126.9444408]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.3279693, 127.4286498]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [36.3770612, 127.3328339]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.498884, 127.0626001]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5926514, 127.0526981]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5851374, 127.029698]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4786593, 126.9525782]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4790871, 126.85393999999997]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4756497, 126.8692869]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4927691, 127.0161311]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4829405, 126.901035]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5996936, 127.1402174]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5375201, 127.0851205]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.5410367, 127.0682748]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.3719472, 126.9427397]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4524516, 126.9070357]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.6193681, 126.7180063]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4966545, 127.0304097]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.6432397, 126.6702043]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [34.8911104, 128.616421]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [35.8927332, 128.6087687]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5309786, 126.6505033]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.7516118, 126.7682586]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.235746, 129.0126734]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.6327314, 126.8319052]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5897211, 127.0563847]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3113004, 126.8308131]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3174449, 126.8358546]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5270213, 127.0357939]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4855072, 126.8110185]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5175615, 126.9094289]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.279982, 127.1129967]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.5402032, 129.3377409]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.5542028, 129.319365]], [&quot;\ud64d\ucf69\ubc18\uc8100410+&quot;, [37.4753403, 126.88593590000005]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5163816, 126.725951]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4451525, 126.7015159]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4937028, 126.7248686]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3799039, 127.132421]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3600685, 126.9310096]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.8184011, 128.5395945]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.1538387, 129.0607343]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4834621, 126.9742782]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5913614, 127.0176722]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5398315, 126.9433236]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.2726891, 127.0356703]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5229444, 126.8738458]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.6383595, 127.0247698]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.3908083, 127.1240709]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4826354, 126.9296355]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5011293, 126.9871614]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.48353, 126.9965566]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.2297531, 129.08895]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5101207, 126.7708801]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.504939, 126.7859443]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4854872, 126.78173]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5035622, 126.7614011]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.1500878, 126.9132835]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5359824, 126.9713509]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5119705, 126.9440367]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.8555354, 128.5095065]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5809501, 126.9996059]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.571546, 127.0112275]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [35.8687544, 128.598039]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4951564, 127.0302718]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5054942, 127.006719]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5405332, 127.0680762]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.5358149, 126.7352662]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.5381182, 126.7380707]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.4518673, 126.6357303]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.427978, 126.9929248]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.4095964, 126.7283345]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.2635727, 127.0286009]], [&quot;\uc5ed\uc804\uc6b0\ub3d90410&quot;, [37.4754134, 126.8696398]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.3454119, 127.1006434]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.2629988, 127.0313061]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.2629988, 127.0313061]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.3828027, 126.9616016]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.3314553, 127.119591]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.2096635, 127.0550717]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [34.8904997, 128.6198671]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [35.2236469, 128.6846402]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [36.3451008, 127.339087]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.5516381, 127.1426937]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.5041437, 126.9970518]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.4871249, 126.9844999]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.5191905, 126.903395]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.5722342, 127.0103411]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [36.50833402, 127.2623641]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.5035622, 126.7614011]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.8525564, 127.7440483]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.6310217, 126.8309464]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.0153299, 129.3545878]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.6705352, 126.7621233]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5600539, 127.0403678]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.4075471, 127.259827]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6137756, 126.8337015]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.6449061, 126.6695965]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5561608, 126.9258254]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2123783, 127.0393839]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.1307579, 126.9154256]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6324959, 126.8314236]], [&quot;\uc6d0\uc870\uc308\ubc25\uc9d1&quot;, [37.3422186, 127.9201621]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.6327006, 127.4280308]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.6118397, 127.4716098]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.6084066, 127.50402]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5629342, 126.9918681]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.6326036, 127.4587902]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6904476, 126.7620622]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.368041, 127.1013246]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.39555514225201, 126.94907455297653]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4627953, 126.6813155]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.9925968, 127.0898163]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3201439, 127.1195436]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.1518424, 128.7022392]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6527305, 127.0491717]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.2236469, 128.6846402]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.2205029, 128.6841519]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.8183079, 127.1569483]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.392921, 126.646044]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4131583, 126.6775932]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5108929, 127.0839208]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5638763, 127.0671168]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5697121, 126.9888517]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2529118, 127.4904851]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4013192, 126.9756101]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.444494, 126.7016991]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4025097, 126.7229866]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4706342, 126.7007496]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.5380888, 129.3361896]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.4971763, 129.4270569]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3466843, 127.9321184]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.7354662, 127.0631911]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.7410943, 127.0480717]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4871098, 126.9803423]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5200985, 126.9287872]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5029067, 127.0371126]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4985522, 127.0346565]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5186937, 126.9073457]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5256665, 126.8747772]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5629522, 127.0342259]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2354865, 127.204645]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.5420338, 129.2599993]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.574772, 129.2405338]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5559193, 127.0110062]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4639964, 127.0347756]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [34.9543058, 127.5245153]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.44312, 126.7907979]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3434101, 126.7355469]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4785725, 126.9461416]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.515415, 127.0184921]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5179623, 127.0227427]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5558369, 126.9371354]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.307254, 126.8482669]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3996001, 126.9235]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5246971, 127.0291472]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3873713, 127.1219624]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3681268, 127.1063005]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5113524, 127.0565578]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.480378, 126.9534373]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.503291, 127.0514272]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4409415, 127.1449504]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [38.1936724, 128.5744452]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5607774, 126.809941]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3793971, 127.1160909]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2912228, 127.0130223]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2972913, 126.9702631]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.2519587, 127.074456]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5677909, 127.0078371]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.9034112, 127.0605075]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.522219, 129.1146944]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6688149, 126.7791456]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5399268, 126.9440103]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5617209, 126.9853909]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4314841, 127.1304028]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [34.797043, 126.4311319]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5671141, 126.9784467]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [34.8122927, 126.4622908]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3509458, 127.110457]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.498657, 126.7763524]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.503942, 126.7606687]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.8750425, 128.6286722]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.2985735, 128.7440748]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5921344, 127.0172261]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4773371, 126.9594764]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4863772, 127.0140938]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5127558, 126.9444871]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6555504, 127.0639444]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.9008568, 126.6452254]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.3262186, 127.4240393]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.3521621, 127.3737462]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.3395046, 127.3893239]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.3504069, 127.3894917]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.3554563, 127.3637122]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.3189584, 127.3933108]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4982025, 127.053862]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5957646, 127.0375638]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.6204637, 126.715935]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5195578, 127.0305772]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5532699, 126.8518747]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [34.8887296, 128.624196]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5414289, 127.0702513]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.1799356, 128.5599121]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.1363028, 129.099997]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.8543509, 129.2065951]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5345187, 126.736725]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [36.4704507, 127.1351177]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.1770726, 126.9134163]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.1342426, 126.8588136]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.2198354, 126.8437967]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [35.1449373, 126.9169328]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4844507, 126.8998765]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5381721, 127.0848398]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.3707128, 126.9425448]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4957086, 127.1204804]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4770244, 126.8826848]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.4942737, 127.0305394]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.5358142, 127.1368055]], [&quot;\uc0c8\ub9c8\uc744\uc2dd\ub2f9&quot;, [37.766695, 128.8778511]]]

      var mapping1 = L.map('mapping1').setView([37.574515, 126.976930], 13)

      L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
        attribution: '&amp;copy; &lt;a href=&quot;https://www.openstreetmap.org/copyright&quot;&gt;OpenStreetMap&lt;/a&gt; contributors'
      }).addTo(mapping1)

      for (i = 0, len = thebornkorea_stores.length; i &lt; len; ++i) {
        L.marker(thebornkorea_stores[i][1]).addTo(mapping1).bindPopup(thebornkorea_stores[i][0])
      }
&lt;/script&gt;

&lt;p&gt;책을 눈으로만 보기보다는 이렇게 실습해보고, 응용도 해보는 편이 학습 효율이 좋다.&lt;/p&gt;</content><author><name>박연오(bakyeono@gmail.com)</name></author><category term="책소개" /><category term="파이썬" /><category term="데이터과학" /><summary type="html"></summary></entry><entry><title type="html">자바스크립트, 세미콜론을 써야 하나 말아야 하나</title><link href="https://bakyeono.net/post/2018-01-19-javascript-use-semicolon-or-not.html" rel="alternate" type="text/html" title="자바스크립트, 세미콜론을 써야 하나 말아야 하나" /><published>2018-01-19T02:29:00+09:00</published><updated>2018-01-19T02:29:00+09:00</updated><id>https://bakyeono.net/post/javascript-use-semicolon-or-not</id><content type="html" xml:base="https://bakyeono.net/post/2018-01-19-javascript-use-semicolon-or-not.html">&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#요약&quot; id=&quot;markdown-toc-요약&quot;&gt;요약&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#문장-부호와-문장의-끝&quot; id=&quot;markdown-toc-문장-부호와-문장의-끝&quot;&gt;문장 부호와 문장의 끝&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#세미콜론의-필요성&quot; id=&quot;markdown-toc-세미콜론의-필요성&quot;&gt;세미콜론의 필요성&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#세미콜론은-꼭-필요한가&quot; id=&quot;markdown-toc-세미콜론은-꼭-필요한가&quot;&gt;세미콜론은 꼭 필요한가?&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#자바스크립트에서의-세미콜론&quot; id=&quot;markdown-toc-자바스크립트에서의-세미콜론&quot;&gt;자바스크립트에서의 세미콜론&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#asi로-인한-문제&quot; id=&quot;markdown-toc-asi로-인한-문제&quot;&gt;ASI로 인한 문제&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#세미콜론을-써야-한다는-주장&quot; id=&quot;markdown-toc-세미콜론을-써야-한다는-주장&quot;&gt;세미콜론을 써야 한다는 주장&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#세미콜론을-쓰지-않아도-된다쓰지-말아야-한다는-주장&quot; id=&quot;markdown-toc-세미콜론을-쓰지-않아도-된다쓰지-말아야-한다는-주장&quot;&gt;세미콜론을 쓰지 않아도 된다(쓰지 말아야 한다)는 주장&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#결론&quot; id=&quot;markdown-toc-결론&quot;&gt;결론&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#참고&quot; id=&quot;markdown-toc-참고&quot;&gt;참고&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#ps&quot; id=&quot;markdown-toc-ps&quot;&gt;P.S.&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;자바스크립트에서는 문장의 끝에 세미콜론을 써도 되고 안 써도 된다. 물론, 한 코드 안에서는 세미콜론을 쓰거나 안 쓰거나 한 방식으로 통일하는 것이 바람직하다. 그렇다면, &lt;strong&gt;어느 쪽으로 통일해야 할까?&lt;/strong&gt;&lt;/p&gt;

&lt;h2 id=&quot;요약&quot;&gt;요약&lt;/h2&gt;

&lt;p&gt;자바스크립트에서는 &lt;strong&gt;세미콜론을 굳이 넣지 않아도 된다&lt;/strong&gt;. 나는 앞으로는 세미콜론을 생략하는 스타일로 코드를 작성할 생각이다. 이것이 과감한 주장이나 허튼 소리처럼 느껴진다면, 계속 읽어봐 주시길.&lt;/p&gt;

&lt;h2 id=&quot;문장-부호와-문장의-끝&quot;&gt;문장 부호와 문장의 끝&lt;/h2&gt;

&lt;h3 id=&quot;세미콜론의-필요성&quot;&gt;세미콜론의 필요성&lt;/h3&gt;

&lt;p&gt;C 계열 언어에서는 문장의 끝을 나타내기 위해 세미콜론을 사용한다. 이 방식의 장점은 코드의 스타일을 프로그래머가 좀 더 자유롭게 구사할 수 있다는 것이다. 예를 들어, 다음과 같이 C 코드를 작성해도 문법적으로 문제가 없다.&lt;/p&gt;

&lt;p&gt;C 코드:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;int       i =
1; double j =
2.0;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;세미콜론은 국어 문법에서 마침표와 같은 기능을 한다. 한국어로 치면 다음과 비슷한 양식으로 글을 쓴 셈이다.&lt;/p&gt;

&lt;p&gt;한국어 글:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;밥을
먹었다. 똥을
쌌다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;개행이 제멋대로 된 탓에 둘 다 똥같은 코드와 글이지만, 우리는 이것들이 각각 세 개씩의 문장이 아니라 두 개씩의 문장으로 이루어졌다는 것을 알 수 있다. 세미콜론과 마침표라는 문장 부호 덕분에 말이다.&lt;/p&gt;

&lt;h3 id=&quot;세미콜론은-꼭-필요한가&quot;&gt;세미콜론은 꼭 필요한가?&lt;/h3&gt;

&lt;p&gt;그런데 위의 예를 보면 알겠지만, 코드 작성 스타일이 자유로워진다는 장점은 곧, 나쁜 스타일이 허용된다는 단점도 동시에 의미한다. 그래서 C 계열 언어의 여러 스타일 가이드에서는 예외적인 경우를 제외하고는 한 행에 하나의 문장만을 작성하도록 하는 권고를 하고 있다. 그런 권고를 따른다면 위의 코드와 글은 다음과 같이 수정해야 한다.&lt;/p&gt;

&lt;p&gt;C 코드:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;int    i = 1;
double j = 2.0;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;한국어 글:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;밥을 먹었다.
똥을 쌌다.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이렇게 행 하나에 문장 하나씩이 되도록 정리하면, 코드가 더 정돈되어 보이고 구조 파악이 쉽고 혼란도 덜하다. 그런데 정리하고 보니, 굳이 마침표나 세미콜론같은 문장 부호가 없더라도 어디서부터 어디까지가 한 문장인지를 알 수 있지 않은가? 행의 시작이 문장의 시작이고, 개행이 문장의 끝이니 말이다. 위 코드와 글에서 문장 부호를 빼 보자.&lt;/p&gt;

&lt;p&gt;C 코드:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;int    i = 1
double j = 2.0
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;한국어 글:&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;밥을 먹었다
똥을 쌌다
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;정말로, 문장 부호가 없더라도 문제가 되지 않음을 알 수 있다. (물론, 세미콜론이 없어 C 컴파일러로 위의 코드를 컴파일 할 수는 없겠지만, 스타일에 관해서만 이야기하자.) 그런데 여기서 좀 더 생각을 발전시킬 수 있다. 굳이 별도의 문장 부호를 사용하기보다, 개행으로 문장의 끝을 나타내도록 약속한다면 어떨까? 어차피 스타일 권고안에 따라 모든 문장을 각각 한 행으로 기술한다면, 세미콜론은 과잉 정보 아닌가 말이다.&lt;/p&gt;

&lt;p&gt;이 점에 착안해 프로그래머가 특정한 스타일로 코드를 작성하도록 권하는 언어도 있다. 파이썬이 대표적이다. 파이썬은 기본적으로 문장을 한 행에 하나씩 작성하도록 한다.&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt; 즉, 파이썬에서는 개행이 곧 문장의 끝을 나타낸다.&lt;sup id=&quot;fnref:2&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:2&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;2&lt;/a&gt;&lt;/sup&gt; 덕분에 파이썬 코드는 여러 사람이 작성하더라도 스타일이 대동소이하다.&lt;/p&gt;

&lt;p&gt;나는 문장 부호를 제공함으로써 스타일을 자유롭게 하는 것보다는, 파이썬처럼 개행으로 문장을 끝내도록 하여 스타일을 통일하는 편이 더 낫다고 생각한다.&lt;/p&gt;

&lt;h2 id=&quot;자바스크립트에서의-세미콜론&quot;&gt;자바스크립트에서의 세미콜론&lt;/h2&gt;

&lt;p&gt;한편 자바스크립트에서도 문장의 끝에 세미콜론을 반드시 붙이지 않아도 된다. 하지만 파이썬의 방식과는 차이가 있다. 파이썬에서는 세미콜론을 붙이지 않는 것이 기본이지만, 자바스크립트에서는 세미콜론을 붙이는 것이 기본이다.&lt;/p&gt;

&lt;p&gt;자바스크립트에서는 엄연히 (개행이 아니라) 세미콜론으로 문장의 끝을 구별한다. 하지만 실제로는 세미콜론을 붙이지 않더라도 인터프리트 과정에서 구문 오류가 발생하지는 않는다. 그것은 인터프리터가 ‘문장의 끝이라고 생각되는 지점’에 세미콜론을 자동으로 붙여주기 때문이다. 이 기능을 세미콜론 자동 삽입(ASI, automatic semicolon insertion)이라고 한다. 이 기능을 만든 의도는 아마 초보 프로그래머들의 실수를 교정해주려는 배려였던 것 같다. 하지만 ASI는 규칙이 매우 복잡하고 동작을 예측하기 힘들어 말썽을 빚는다고 한다.&lt;/p&gt;

&lt;h3 id=&quot;asi로-인한-문제&quot;&gt;ASI로 인한 문제&lt;/h3&gt;

&lt;p&gt;인터프리터가 ‘세미콜론을 빠트렸음직한 부분’이라고 판단하는 곳은 어디일까? 그냥 코드를 작성하고 싶을 뿐인데 이런 것을 고민해야 하는 것은 참 성가시다. 하지만 그것을 무시하고 코딩하자니 ASI의 동작을 예측하지 못해 곤란을 겪을 우려가 있다. 세미콜론 논쟁의 핵심은 이런 ASI로 인한 문제를 어떻게 피할 것인가에 있는 것 같다.&lt;/p&gt;

&lt;p&gt;세미콜론을 반드시 넣어야 한다는 사람들은 ASI의 동작을 예측하기 힘들기 때문에 모든 문장의 끝에 세미콜론을 넣으라고 한다. 반대로, 세미콜론을 넣지 않아도 된다(그리고 더 나아가 넣지 말라)고 주장하는 사람들은 ASI의 동작을 예측하기가 어렵지 않으며, 세미콜론을 명시적으로 붙이는 것과 ASI의 동작과는 관계가 없다고 한다. 각각의 주장을 따져보자.&lt;/p&gt;

&lt;h3 id=&quot;세미콜론을-써야-한다는-주장&quot;&gt;세미콜론을 써야 한다는 주장&lt;/h3&gt;

&lt;p&gt;일단 자바스크립트의 기본 규칙은 문장의 끝에 세미콜론을 붙이는 것이다. 그래서인지, 과거에 나온 자바스크립트 교재를 보면 대부분 세미콜론을 넣는 것이 바람직하다고 설명하고 있다. 예를 들어, &lt;a href=&quot;http://www.hanbit.co.kr/store/books/look.php?p_code=B5877628718&quot;&gt;『읽기 좋은 자바스크립트 코딩 기법(Maintainable Javascript)』(니콜라스 자카스 지음, 김광호 옮김)&lt;/a&gt;에 다음과 같은 설명이 있다. 조금 길지만 해당 내용을 전체 인용해 본다.&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;ASI는 코드에서 세미콜론이 필요한 자리를 찾고 없으면 세미콜론을 넣어주는데. 대부분 정확하게 찾아 문제가 없습니다. 그러나 ASI가 세미콜론을 찾는 규칙은 기억하기 어려울 정도로 복잡하므로 명시적으로 세미콜론을 넣기를 권장합니다. 디음과 같은 상황을 고려해 봅시다.&lt;/p&gt;

  &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// 원래 코드
function getData() {
    return
        {
            title: 'Maintainable Javascript',
            author: 'Nicholas C. Zakas'
        }
}

// 파서가 생각하는 코드
function getData() {
    return;
        {
            title: 'Maintainable Javascript',
            author: 'Nicholas C. Zakas'
        };
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;

  &lt;p&gt;이 예제에서 우리가 보기에 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getData()&lt;/code&gt;는 데이터가 포함된 객체를 반환하는 힘수입니다. 하지만 ASI는 return 문 이후에 새로운 줄이 있으니 당연히 세미콜론을 삽입합니다. 따라서 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;getData&lt;/code&gt; 함수는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;undefined&lt;/code&gt;를 반환합니다. 이 문장을 다음 예제처럼 return 문과 같은 줄에 중괄호를 표기하면 정상 값을 반환합니다.&lt;/p&gt;

  &lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;// 세미콜론은 빠졌지만 정상 동작합니다.
function getData() {
    return {
        title: 'Maintainable Javascript',
        author: 'Nicholas C. Zakas'
    }
}
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;  &lt;/div&gt;

  &lt;p&gt;일반적으로 ASI가 수행되는 시나리오는 정해져 있습니다. 보통 두 가지 상황에서 ASI 에러가 발생하는데 ASI 동작 방식에 대한 이해 없이 코드를 작성하거나 ‘세미콜론이 없어도 ASI에서 알아서 넣어주겠지.’라는 안일한 생각으로 코드를 작성할 때입니다. 특히 경험이 부족한 개발자가 세미콜론을 빠뜨리는 실수를 자주 합니다.&lt;/p&gt;

  &lt;p&gt;더글라스 크락포드의 자바스크립트를 위한 코드 컨벤션, jQuery 코어 스타일 가이드, 구글 자바스크립트 스타일 가이드, Dojo 스타일 가이드에서도 모두 세미콜론 사용을 권장합니다. 또 JSLint와 JSHint 모두 기본적으로 세미콜론이 없으면 경고 메시지를 출력합니다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;자카스가 지적하는 것처럼, ASI의 동작을 잘 모른 채로 특정한 스타일로 코드를 작성할 경우 ASI로 인한 오류를 겪을 수 있다. 그런데 곰곰이 따져 보면, 문제를 일으키는 스타일은 ‘세미콜론을 넣느냐 안 넣느냐’가 아니라, ‘어디에서 개행하느냐’라는 것을 알 수 있다. 자카스가 ASI 문제를 우회한 코드에서도 세미콜론은 붙이지 않았다. (“세미콜론은 빠졌지만 정상 동작합니다.”라는 주석은 원문에서 그대로 인용한 것.) 즉, 세미콜론을 모든 문장의 끝에 붙인다 하더라도 자카스가 소개한 ASI 문제는 그대로 겪을 수 있다는 말이다.&lt;/p&gt;

&lt;p&gt;결국 세미콜론을 넣느냐 마느냐는 기호의 문제이지, ASI 문제를 피하는 것과는 관계 없는 것 아닌가?&lt;/p&gt;

&lt;h3 id=&quot;세미콜론을-쓰지-않아도-된다쓰지-말아야-한다는-주장&quot;&gt;세미콜론을 쓰지 않아도 된다(쓰지 말아야 한다)는 주장&lt;/h3&gt;

&lt;p&gt;내가 세미콜론에 대해 다시 생각하게 된 것은 유명 자바스크립트 라이브러리에서 세미콜론을 사용하지 않는 코드를 종종 봤기 때문이다. 그 전까지는 세미콜론을 전혀 넣지 않는 자바스크립트 코드는 생각해 본 적도 없었기에 이상하게 생각되었다. 고집스럽게 세미콜론을 계속 넣기보다는 고수들이 왜 세미콜론을 안 넣는지 찾아 봐야 했다.&lt;/p&gt;

&lt;p&gt;몇몇 블로그 글들을 읽어봤는데, &lt;a href=&quot;https://standardjs.com&quot;&gt;JavaScript Standard Style&lt;/a&gt;(코드 형식 통일 프로그램)을 만든 Feross Aboukhadijeh의 글 &lt;a href=&quot;https://feross.org/never-use-semicolons&quot;&gt;「Never Use Semicolons」&lt;/a&gt;이 가장 근거가 분명하고 이해하기 쉬웠다. 장황한 내 글보다 훨씬 간결하니 직접 읽어보셔도 좋다. 그의 논점을 간단히 요약하자면, ASI와 명시적 세미콜론 삽입 스타일은 연관이 없으며, 세미콜론을 붙이는 것보다는 ASI의 동작을 이해하는 것이 중요하다는 것이다.&lt;/p&gt;

&lt;p&gt;자카스도 지적했듯이, ASI는 대개는 적절한 위치를 추론하기 때문에 문제를 자주 일으키지는 않는다. 게다가 자카스가 든 예도 세미콜론을 명시적으로 붙여야 할 근거가 되기 보다는, ASI 문제가 특정한 코딩 스타일에서 발생한다는 것을 보여줄 뿐이다. ASI는 우리가 세미콜론을 명시적으로 넣든 안 넣든, 동작할 곳에서 동작한다. ASI 문제를 피하려면 ASI의 동작 원리를 이해하고 그에 맞게 코딩 스타일을 정립하는 것이 핵심이지, 세미콜론을 넣는 것을 강제할 필요는 없다.&lt;/p&gt;

&lt;p&gt;그런데 Aboukhadijeh는 세미콜론을 넣지 않아도 된다는 데서 더 나아가, 세미콜론을 쓰지 말아야 한다고 주장하는 데까지 나아간다. 그 근거는 “모든 문장에 세미콜론을 넣어라”라는 규칙이 생각보다 따르기가 쉽지 않다는 것이다. 예를 들어, 다음과 같이 세미콜론을 붙이면 안 되는 위치들이 있다. (&lt;a href=&quot;https://feross.org/never-use-semicolons&quot;&gt;「Never Use Semicolons」&lt;/a&gt;에서 인용한 코드)&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;function foo () {
  return 42; // ok
};           // &amp;lt;– AVOID!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;함수 정의는 그나마 간단하지만 클래스 정의 구문에서는 더 성가시다. (역시 &lt;a href=&quot;https://feross.org/never-use-semicolons&quot;&gt;「Never Use Semicolons」&lt;/a&gt;에서 인용한 코드)&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;class Foo {
  constructor () {
    if (baz) {
      return 42; // ok
    };           // &amp;lt;– AVOID!
    return 12;   // ok
  };             // &amp;lt;– AVOID!
};               // &amp;lt;– AVOID!
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;물론, 충분한 주의를 기울이고 편집기와 Lint 도구 등의 도움을 받으면 세미콜론을 찍을 위치와 안 찍을 위치를 가려내는 것이 크게 어렵지는 않다. 하지만 굳이 세미콜론을 고집해야 할까? 세미콜론을 아예 생략하기로 한다면 이런 성가신 문제를 전혀 신경쓰지 않아도 된다. 바로 이 순간, ASI가 일을 방해하는 기능에서 정말로 편의를 제공하는 기능으로 탈바꿈한다!&lt;/p&gt;

&lt;p&gt;게다가 Aboukhadijeh에 따르면, ASI가 일을 방해하지 않도록 하려면 딱 한 가지 규칙만 기억하면 된다고 한다. 그것은 바로 행의 시작을 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;[&lt;/code&gt;, &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;(&lt;/code&gt;, &lt;code&gt;`&lt;/code&gt;으로 하지 않는 것이다. 꼭 그렇게 해야 한다면, 다음과 같이 세미콜론으로 행을 시작하면 된다고 한다.  (역시 &lt;a href=&quot;https://feross.org/never-use-semicolons&quot;&gt;「Never Use Semicolons」&lt;/a&gt;에서 인용한 코드)&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;;[1, 2, 3].forEach(bar)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;물론 이런 코드를 작성해야 할 경우는 거의 없을 것이니 안심해도 된다. 자바스크립트에서 식(expression)만을 덩그러니 써 놓는 코드를 쓸 일이 거의 없을 테니까 말이다. 즉, 대개는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;let foo = [1, 2, 3].forEach(bar)&lt;/code&gt;, 또는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;return [1, 2, 3].forEach(bar)&lt;/code&gt;와 같이 문을 나타내는 키워드를 먼저 쓰기 마련이다.&lt;/p&gt;

&lt;h2 id=&quot;결론&quot;&gt;결론&lt;/h2&gt;

&lt;p&gt;자바스크립트에서는 세미콜론을 굳이 넣지 않아도 된다. 그 전까지는 세미콜론을 반드시 넣자는 것이 압도적 다수파였던 것 같지만, 현재는 세미콜론을 넣지 말자는 주장도 힘이 커지고 있다. 여전히 논쟁거리인 것 같긴 하다. 내가 보기에는 세미콜론을 넣지 않아도 된다는 주장이 좀 더 설득력 있게 느껴진다. 나는 앞으로는 세미콜론을 생략하는 스타일로 코드를 작성할 생각이다.&lt;/p&gt;

&lt;h2 id=&quot;참고&quot;&gt;참고&lt;/h2&gt;

&lt;p&gt;니콜라스 자카스의 책 &lt;a href=&quot;http://www.hanbit.co.kr/store/books/look.php?p_code=B5877628718&quot;&gt;『읽기 좋은 자바스크립트 코딩 기법(Maintainable Javascript)』&lt;/a&gt;의 일부 내용을 비판하기는 했지만, 전체적으로 매우 훌륭한 책이다. 번역도 꼼꼼하게 잘 되어 있다. 나도 이 책에서 많은 도움을 받았고, 이 책에서 제시하는 코딩 스타일을 대부분 따르고 있다. 자바스크립트 코딩 스타일에 관심이 있다면 읽어봐도 좋다.&lt;/p&gt;

&lt;p&gt;세미콜론을 꼭 써야 한다고 생각하는 근거가 있거나, 내가 쓴 글에서 잘못된 내용이 있다면 알려주시기 바란다.&lt;/p&gt;

&lt;h2 id=&quot;ps&quot;&gt;P.S.&lt;/h2&gt;

&lt;p&gt;그런데 간단히 정리하고 싶지만 또 그러기가 어려운 것이…&lt;/p&gt;

&lt;p&gt;TC39(ECMA 인터내셔널의 ECMA 스크립트 담당 기술 위원회)에서는 향후에 언어가 확장되면서 발생할 수 있는 문제를 방지하기 위해서, 세미콜론을 넣는 스타일을 권장하는 듯하다.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;관련 트위터 반응: &lt;a href=&quot;https://twitter.com/BrendanEich/status/951554266535141377&quot;&gt;https://twitter.com/BrendanEich/status/951554266535141377&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;나는 일단은 세미콜론 생략을 해 보려 하지만 나중에 가면 또 분위기가 변할 수도 있을 것 같다.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;원한다면 파이썬에서도 세미콜론으로 문장의 끝을 표시하여 한 행에 여러 문장을 서술할 수도 있지만, 가능하다는 것이지 권장사항은 아니다. &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
    &lt;li id=&quot;fn:2&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;값·식·문이 한 행에서 끝나지 않는 경우는 예외. 이와 관련된 구문 규칙은 합리적이고 파서가 잘 해석한다. &lt;a href=&quot;#fnref:2&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name>박연오(bakyeono@gmail.com)</name></author><category term="자바스크립트" /><summary type="html"></summary></entry><entry><title type="html">(번역) 2차원 회문(사토르 마방진) 탐색</title><link href="https://bakyeono.net/post/2018-01-11-finding-magic-word-squares.html" rel="alternate" type="text/html" title="(번역) 2차원 회문(사토르 마방진) 탐색" /><published>2018-01-11T19:20:00+09:00</published><updated>2018-01-11T19:20:00+09:00</updated><id>https://bakyeono.net/post/finding-magic-word-squares</id><content type="html" xml:base="https://bakyeono.net/post/2018-01-11-finding-magic-word-squares.html">&lt;ul id=&quot;markdown-toc&quot;&gt;
  &lt;li&gt;&lt;a href=&quot;#2차원-회문-탐색&quot; id=&quot;markdown-toc-2차원-회문-탐색&quot;&gt;2차원 회문 탐색&lt;/a&gt;    &lt;ul&gt;
      &lt;li&gt;&lt;a href=&quot;#사토르-마방진&quot; id=&quot;markdown-toc-사토르-마방진&quot;&gt;사토르 마방진&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#파이썬으로-찾아-보자&quot; id=&quot;markdown-toc-파이썬으로-찾아-보자&quot;&gt;파이썬으로 찾아 보자&lt;/a&gt;&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
  &lt;li&gt;&lt;a href=&quot;#한국어-2차원-회문&quot; id=&quot;markdown-toc-한국어-2차원-회문&quot;&gt;한국어 2차원 회문&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 id=&quot;2차원-회문-탐색&quot;&gt;2차원 회문 탐색&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;이 글은 블라드스톤 필루(Wladston Filho)의 글 &lt;a href=&quot;https://code.energy/finding-magic-word-squares/&quot;&gt;「Finding Magic Word Squares」&lt;/a&gt;를 허락을 구하여 번역한 것이다.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;‘회문’에 관해서는 들어본 적이 있을 것이다. 회문은 그 속의 글자들을(대소문자 구별이나 문장 부호는 빼고) 앞에서부터 읽든, 뒤에서부터 읽든, 똑같은 문장으로 읽을 수 있다. 다음 회문들을 한번 앞뒤로 읽어 보시라.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;Live not on evil.
Race fast, safe car!
Never odd or even.
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;h3 id=&quot;사토르-마방진&quot;&gt;사토르 마방진&lt;/h3&gt;

&lt;p&gt;하지만 흔해 빠진 그냥 회문을 소개하려고 이 글을 쓰는 것은 아니다. 오늘 소개하려는 것은 두둥~ ‘2차원 회문’이라는 물건이다. 아래 그림은 ‘사토르 마방진’이라는 것으로, 고대 로마 시대에 만들어진 유명한 2차원 회문이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/sator-rectangle.jpg&quot; alt=&quot;고대 로마의 사토르 마방진&quot; /&gt;&lt;/p&gt;

&lt;p&gt;그림: 고대 로마의 사토르 마방진&lt;/p&gt;

&lt;p&gt;이 사토르 마방진은 라틴어 표현 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;sator arepo tenet opera rotas&lt;/code&gt;&lt;sup id=&quot;fnref:1&quot; role=&quot;doc-noteref&quot;&gt;&lt;a href=&quot;#fn:1&quot; class=&quot;footnote&quot; rel=&quot;footnote&quot;&gt;1&lt;/a&gt;&lt;/sup&gt;을 써 둔 것이다. 이 마방진의 대단한 점은 위에서 아래, 아래에서 위, 좌에서 우, 우에서 좌 어떤 방향으로든 읽을 수가 있다는 것이다.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;/img/sator-square-read.png&quot; alt=&quot;사토르 마방진 읽기&quot; /&gt;&lt;/p&gt;

&lt;p&gt;그림: 사토르 마방진 읽기&lt;/p&gt;

&lt;p&gt;그야말로 궁극의 회문이다. 고대 로마인들은 이 마방진에 매료되어 이것을 집집마다, 신전마다, 온갖 비석에, 그리고 심지어 물그릇에까지 새겨두곤 했다. 완벽한 대칭 속에 잡귀를 쫓고 행운을 불러오는 힘이 있다고 믿었던 것이다.&lt;/p&gt;

&lt;p&gt;로마인들이 이런 2차원 라틴어 회문을 찾은 것은 굉장한 우연이었거나, 아니면 엄청난 수고를 들여 이뤄낸 일이었을 것이다. 2차원 회문의 존재를 알게 된 후, 나는 혹시 영어 단어 중에는 5x5 크기의 2차원 회문이 없을지 계속 고민해왔다.&lt;/p&gt;

&lt;h3 id=&quot;파이썬으로-찾아-보자&quot;&gt;파이썬으로 찾아 보자&lt;/h3&gt;

&lt;p&gt;컴퓨터를 이용하면 쉽게 찾을 수 있지 않을까? 그래서 간단한 파이썬 프로그램을 짜 봤다. 처리과정을 소개해본다.&lt;/p&gt;

&lt;p&gt;먼저, 다섯 글자로 된 모든 영어 단어가 필요하다. 인터넷에 공개된 단어 목록을 활용하면 된다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;import urllib.request
src = &quot;http://raw.githubusercontent.com&quot;
src += &quot;/codenrg/sator-square/master/words-en.txt&quot;
fp = urllib.request.urlopen(src)
words = [str(line, 'utf-8').rstrip() for line in fp]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이것을 실행하면 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;words&lt;/code&gt;에 모든 영어 단어의 리스트가 저장된다. 2차원 회문을 만들려면 다섯 글자로 된 단어만 필요하므로 그것들만 선별하자.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;words = filter(lambda x: len(x) == 5, words)
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;단어를 2차원 회문에서 쓸 수 있으려면 그것을 뒤집은 단어도 2차원 회문 속에 있어야 한다. 예를 들어, ‘stop’이라는 단어는 후보가 될 수 있다. 그것을 뒤집은 ‘pots’도 올바른 영어 단어이니까. 하지만 ‘coder’는 그렇지가 못하다. ‘redoc’은 올바른 영어 단어가 아니기 때문이다.&lt;/p&gt;

&lt;p&gt;뒤집었을 때 탈락하는 단어들을 걸러내자. 먼저 단어들을 모두 집합에 넣고, 각 단어마다 그것을 뒤집은 단어가 집합에 들어있는지 검사한다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;words = set(words)
rev = lambda w: &quot;&quot;.join(reversed(list(w)))
words = [w for w in words if rev(w) in words]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이제 후보가 될 수 있는 단어들은 다 추렸다. 이것들을 조합해 2차원 회문을 찾아보는 일만 남았다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;squares = []
for w1 in words:
    w2_match = lambda x: x[0] == w1[1] and x[-1] == w1[-2]
    for w2 in filter(w2_match, words):
        w3_match = lambda x: x[0] == w1[2] and x[1] == w2[2]
        for w3 in filter(w3_match, words):
            if w3 == rev(w3):
                square = [w1, w2, w3, rev(w2), rev(w1)]
                squares.append(square)

for x in squares:
    print(&quot;%s\n%s\n%s\n%s\n%s\n\n&quot; % tuple(x))
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이렇게 뽑아낸 단어들을 이용해 2차원 회문을 세 개 발견할 수 있었다. 그 중 가장 그럴듯한 것을 소개한다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;P A R T S
A P A R T
R A D A R
T R A P A
S T R A P
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;다른 언어에서도 2차원 회문을 찾을 수 있는지 확인해봐주면 좋곘다. 코드에서 개선할 점도 환영한다. 깃허브(&lt;a href=&quot;https://github.com/codenrg/sator-square&quot;&gt;https://github.com/codenrg/sator-square&lt;/a&gt;)에서 풀 요청을 보내주면 된다.&lt;/p&gt;

&lt;h2 id=&quot;한국어-2차원-회문&quot;&gt;한국어 2차원 회문&lt;/h2&gt;

&lt;blockquote&gt;
  &lt;p&gt;여기서부터는 내가 추가한 내용이다. -박연오&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;필로의 프로그램을 이용해 한국어로 2차원 회문을 만들 수 있는지 찾아 보자.&lt;/p&gt;

&lt;p&gt;먼저, 한국어 단어 목록이 필요하다. 나는 &lt;a href=&quot;http://konlpy-ko.readthedocs.io&quot;&gt;KoNLPy (파이썬 한국어 NLP)&lt;/a&gt;에 포함된 ‘Hannanum 시스템 사전’을 사용했다. 이것은 다음과 같이 하여 다운로드할 수 있다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;import urllib.request
fp = urllib.request.urlopen('https://raw.githubusercontent.com/konlpy/konlpy/master/konlpy/java/data/kE/dic_system.txt')
words = [str(line, 'utf-8').rstrip() for line in fp]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;다운로드한 사전을 확인해 보면 한글로 시작하지 않는 단어들이 있다. 이것들을 걸러내자.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;def is_hangul(ch):
    return '가' &amp;lt;= ch &amp;lt;= '힣'

def starts_with_hangul(word):
    return is_hangul(word[0])

words = [word for word in words if starts_with_hangul(word)]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;또, 사전에는 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;가치체계	ncn&lt;/code&gt;처럼 품사가 태그되어 있다. 품사를 제거하여 &lt;code class=&quot;language-plaintext highlighter-rouge&quot;&gt;가치체계&lt;/code&gt;와 같이 단어만 남기자.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;def remove_tag(word):
    return word.split()[0]

words = [remove_tag(word) for word in words]
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;이제 한국어 단어 목록이 준비됐다. 나머지는 필로가 작성한 코드에 단어 목록을 적용해 2차원 회문을 찾아보는 것뿐이다.&lt;/p&gt;

&lt;p&gt;이렇게 해서 만든 한국어 2차원 회문 탐색 프로그램은 깃허브에 올려두었다. &lt;a href=&quot;https://github.com/bakyeono/sator-square/blob/master/find-sator-squares-in-korean.py&quot;&gt;https://github.com/bakyeono/sator-square/blob/master/find-sator-squares-in-korean.py&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;하지만 아쉽게도 별 재미는 보지 못했다. 적어도 내가 사용한 사전에서는 다섯 글자로 된 2차원 회문은발견할 수 없었기 때문이다. 글자 제한을 조금 줄이면 더 나오지 않을까? 그래서 네 글자로 찾아 보니 “하하하하” 처럼 모두 같은 글자로 이루어진 단어들밖에 안 나왔다. 세 글자로 된 2차원 회문을 찾아보니 개수가 너무 많이 나오는데, 대부분 사람 이름이 섞여 있어 마음에 들지 않는다. 아래는 그 가운데 그나마 쓸만한 것을 몇 개 추린 것이다.&lt;/p&gt;

&lt;div class=&quot;language-plaintext highlighter-rouge&quot;&gt;&lt;div class=&quot;highlight&quot;&gt;&lt;pre class=&quot;highlight&quot;&gt;&lt;code&gt;대구대
구로구
대구대

경성대
성장성
대성경

주사파
사회사
파사주

대전대
전격전
대전대

식용유
용불용
유용식
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;

&lt;p&gt;알파벳보다 글자수가 훨-씬- 많은 한글의 특성상 2차원 회문이 되기가 좀 더 어려운 것이 아닌가 싶다. 사전을 다른 것(인명이 포함되지 않고, 한국어 단어의 활용을 어느 정도 반영한 것)으로 하면 더 찾을 수 있을지도 모른다.&lt;/p&gt;

&lt;div class=&quot;footnotes&quot; role=&quot;doc-endnotes&quot;&gt;
  &lt;ol&gt;
    &lt;li id=&quot;fn:1&quot; role=&quot;doc-endnote&quot;&gt;
      &lt;p&gt;적당히 번역하면 “농부 아레포가 쟁기(바퀴)로 작업한다”라는 뜻이라고 한다. (&lt;a href=&quot;https://en.wikipedia.org/wiki/Sator_Square&quot;&gt;https://en.wikipedia.org/wiki/Sator_Square&lt;/a&gt;) &lt;a href=&quot;#fnref:1&quot; class=&quot;reversefootnote&quot; role=&quot;doc-backlink&quot;&gt;&amp;#8617;&lt;/a&gt;&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ol&gt;
&lt;/div&gt;</content><author><name>Wladston Filho(hi@code.energy), 박연오(bakyeono@gmail.com)</name></author><category term="파이썬" /><category term="알고리즘" /><summary type="html"></summary></entry></feed>