Jekyll2021-02-24T09:27:47+00:00https://rockpell.github.io/feed.xmlrockpell’s blog프로그래밍을 공부하는중입니다. aythffk@gmail.com임채욱aythffk@gmail.com블로그이전2021-02-24T00:00:00+00:002021-02-24T00:00:00+00:00https://rockpell.github.io/%EB%B8%94%EB%A1%9C%EA%B7%B8%EC%9D%B4%EC%A0%84<h1 id="블로그-이전">블로그 이전</h1>
<p>지금처럼 메모장 용도의 블로그가 아닌 기술을 공유하기 위한 블로그를 만들기 위해 이전하게 되었다.</p>
<p>새로운 블로그 주소는 다음과 같다.</p>
<p>https://velog.io/@rockpell</p>임채욱aythffk@gmail.com블로그 이전html2020-07-25T19:00:20+00:002020-07-25T19:00:20+00:00https://rockpell.github.io/html<h2 id="html">HTML</h2>
<p><code class="language-plaintext highlighter-rouge"><!DOCTYPE html></code>: document type declaration, It must only appear once, at the top of the page</p>
<h2 id="tags">tags</h2>
<ul>
<li>html</li>
<li>head</li>
<li>title</li>
<li>body</li>
<li>h1</li>
<li>p: <code class="language-plaintext highlighter-rouge"><a href=link></code></li>
<li>br: line break</li>
<li>img: <code class="language-plaintext highlighter-rouge"><img src="" alt="" width="" height=""></code>, img tag should also contain the <code class="language-plaintext highlighter-rouge">width</code>, <code class="language-plaintext highlighter-rouge">height</code></li>
<li>hr: element is used to separate content</li>
<li>pre: element defines preformatted text</li>
</ul>
<h2 id="attributes">attributes</h2>
<ul>
<li>href: specifies the URL</li>
<li>src: specifies the path to image to be displayed</li>
<li>width, height: which specifies the width and height of the image</li>
<li>alt: specifies an alternate text for an image</li>
<li>style: used to add styles to an element, such as color, font, size, and more.
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><p style="color:red;">""</p></code></li>
</ul>
</li>
<li>lang: <code class="language-plaintext highlighter-rouge">lang</code> attribute inside the <code class="language-plaintext highlighter-rouge"><html></code>
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><html lang="en"></code></li>
</ul>
</li>
<li>title: a tooltip when you mouse over the element
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><p title="I'm a tooltip">This is a paragraph.</p></code></li>
</ul>
</li>
</ul>
<h2 id="styles-attribute">styles attribute</h2>
<p><code class="language-plaintext highlighter-rouge"><tagname_ style="property:value;"></code>
The <em><strong>property</strong></em> is a CSS property. The <em><strong>value</strong></em> is a CSS value.</p>
<ul>
<li>background-color
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><body style="background-color:powderblue;"></code></li>
</ul>
</li>
<li>Text Color
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><h1 style="color:blue;">This is a heading</h1></code></li>
</ul>
</li>
<li>Fonts
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><h1 style="font-family:verdana;">This is a heading</h1></code></li>
</ul>
</li>
<li>Text Size
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><h1 style="font-size:300%;">This is a heading</h1></code></li>
</ul>
</li>
<li>Text Alignment
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><h1 style="text-align:center;">Centered Heading</h1></code></li>
</ul>
</li>
</ul>
<h2 id="formatting-elements">Formatting Elements</h2>
<ul>
<li><code class="language-plaintext highlighter-rouge"><b></code> - Bold text</li>
<li><code class="language-plaintext highlighter-rouge"><strong></code> - Important text</li>
<li><code class="language-plaintext highlighter-rouge"><i></code> - Italic text</li>
<li><code class="language-plaintext highlighter-rouge"><em></code> - Emphasized text</li>
<li><code class="language-plaintext highlighter-rouge"><mark></code> - Marked text</li>
<li><code class="language-plaintext highlighter-rouge"><small></code> - Smaller text</li>
<li><code class="language-plaintext highlighter-rouge"><del></code> - Deleted text</li>
<li><code class="language-plaintext highlighter-rouge"><ins></code> - Inserted text</li>
<li><code class="language-plaintext highlighter-rouge"><sub></code> - Subscript text</li>
<li><code class="language-plaintext highlighter-rouge"><sup></code> - Superscript text</li>
</ul>
<h2 id="html--quotation-and-citation-elements">HTML Quotation and Citation Elements</h2>
<ul>
<li>blockquote: a section that is quoted from another source.</li>
<li>q: a short quotation</li>
</ul>
<h2 id="html-comments">HTML Comments</h2>
<ul>
<li><code class="language-plaintext highlighter-rouge"><!-- Write your comments here --></code></li>
</ul>
<h2 id="html-color">HTML Color</h2>
<ul>
<li>text color</li>
<li>border color
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><h1 style="border:2px solid Tomato;">Hello World</h1></code></li>
</ul>
</li>
<li>color values
<ul>
<li><code class="language-plaintext highlighter-rouge"><h1 style="background-color:rgb(255, 99, 71);">...</h1></code></li>
<li><code class="language-plaintext highlighter-rouge"><h1 style="background-color:#ff6347;">...</h1></code></li>
<li><code class="language-plaintext highlighter-rouge"><h1 style="background-color:hsl(9, 100%, 64%);">...</h1></code></li>
<li><code class="language-plaintext highlighter-rouge"><h1 style="background-color:rgba(255, 99, 71, 0.5);">...</h1></code></li>
<li><code class="language-plaintext highlighter-rouge"><h1 style="background-color:hsla(9, 100%, 64%, 0.5);">...</h1></code></li>
</ul>
</li>
</ul>
<h2 id="html-css">HTML CSS</h2>
<p>CSS can be added to HTML documents in 3 ways:</p>
<ul>
<li><strong>Inline</strong> - by using the <code class="language-plaintext highlighter-rouge">style</code> attribute inside HTML elements</li>
<li><strong>Internal</strong> - by using a <code class="language-plaintext highlighter-rouge"><style></code> element in the <code class="language-plaintext highlighter-rouge"><head></code> section
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><style> body {background-color: powderblue;} h1 {color: blue;} </style></code></li>
</ul>
</li>
<li><strong>External</strong> - by using a <code class="language-plaintext highlighter-rouge"><link></code> element to link to an external CSS file
<ul>
<li><code class="language-plaintext highlighter-rouge"><head> <link rel="stylesheet" href="styles.css"> </head></code></li>
</ul>
</li>
</ul>
<h2 id="html-links">HTML Links</h2>
<p>The target Attribute</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">_self</code>: Default. Opens the document in the same window/tab as it was clicked</li>
<li><code class="language-plaintext highlighter-rouge">_blank</code>: Opens the document in a new window or tab</li>
<li><code class="language-plaintext highlighter-rouge">_parent</code>: Opens the document in the parent frame</li>
<li><code class="language-plaintext highlighter-rouge">_top</code>: Opens the document in the full body of the window</li>
</ul>
<p>ex) <code class="language-plaintext highlighter-rouge"><a href="https://www.w3schools.com/" target="_blank">Visit W3Schools!</a></code></p>
<p>ex) <code class="language-plaintext highlighter-rouge"><button onclick="document.location='default.asp'">HTML Tutorial</button></code></p>
<p>ex) <code class="language-plaintext highlighter-rouge"><a href="https://www.w3schools.com/html/" title="Go to W3Schools HTML section">Visit our HTML Tutorial</a></code></p>
<h2 id="html-images">HTML Images</h2>
<p>The <code class="language-plaintext highlighter-rouge"><img></code> tag has two required attributes:</p>
<ul>
<li>src: Specifies the path to the image</li>
<li>alt: Specifies an alternate text for the image
ex) <code class="language-plaintext highlighter-rouge"><img src="img_chania.jpg" alt="Flowers in Chania"></code></li>
</ul>
<h2 id="image-size">Image Size</h2>
<p>ex) <code class="language-plaintext highlighter-rouge"><img src="img_girl.jpg" alt="Girl in a jacket" style="width:500px;height:600px;"></code></p>
<p>ex) <code class="language-plaintext highlighter-rouge"><img src="img_girl.jpg" alt="Girl in a jacket" width="500" height="600"></code></p>
<p>ex) <code class="language-plaintext highlighter-rouge"><a href="default.asp"> <img src="smiley.gif" alt="HTML tutorial" style="width:42px;height:42px;"> </a></code></p>
<p>Use the CSS <code class="language-plaintext highlighter-rouge">float</code> property to let the image float to the left or to the right</p>
<p>ex) <code class="language-plaintext highlighter-rouge"><p><img src="smiley.gif" alt="Smiley face" style="float:right;width:42px;height:42px;"> The image will float to the right of the text.</p></code></p>
<h2 id="html-tables">HTML Tables</h2>
<ul>
<li><code class="language-plaintext highlighter-rouge"><table></code>: defines an HTML Table</li>
<li><code class="language-plaintext highlighter-rouge"><tr></code>: each table row</li>
<li><code class="language-plaintext highlighter-rouge"><th></code>: each table header</li>
<li><code class="language-plaintext highlighter-rouge"><td></code>: each table data/cell</li>
<li>css
<ul>
<li><code class="language-plaintext highlighter-rouge">border: 1px solid black;</code></li>
<li><code class="language-plaintext highlighter-rouge">border-collapse: collapse;</code></li>
<li><code class="language-plaintext highlighter-rouge">padding: 15px;</code></li>
<li><code class="language-plaintext highlighter-rouge">text-align: left;</code></li>
<li><code class="language-plaintext highlighter-rouge">border-spacing: 5px;</code></li>
</ul>
</li>
<li>colspan: cell span more than one column
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><th colspan="2">Telephone</th></code></li>
</ul>
</li>
<li>rowspan: cell span more than one row
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><th rowspan="2">Telephone:</th></code></li>
</ul>
</li>
<li>caption: add a caption to table</li>
</ul>
<h2 id="html-lists">HTML Lists</h2>
<ul>
<li><code class="language-plaintext highlighter-rouge"><ul></code>: unordered list starts, list items will be marked with bullets (small black circles)
<ul>
<li>ex)<code class="language-plaintext highlighter-rouge"><ul style="list-style-type:disc;"></code></li>
<li>disc, circle, square, none</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge"><li></code>: Each list item starts</li>
<li><code class="language-plaintext highlighter-rouge"><ol></code>: ordered list starts, list items will be marked with numbers
<ul>
<li>type attribute
<ul>
<li><code class="language-plaintext highlighter-rouge"><ol type="1"></code></li>
<li><code class="language-plaintext highlighter-rouge"><ol type="A"></code></li>
<li><code class="language-plaintext highlighter-rouge"><ol type="a"></code></li>
<li><code class="language-plaintext highlighter-rouge"><ol type="I"></code></li>
<li><code class="language-plaintext highlighter-rouge"><ol type="i"></code></li>
</ul>
</li>
<li>start attribute
<ul>
<li><code class="language-plaintext highlighter-rouge"><ol start="50"></code></li>
</ul>
</li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge"><dl></code>: defines the description list</li>
<li><code class="language-plaintext highlighter-rouge"><dt></code>: defines the term (name)</li>
<li><code class="language-plaintext highlighter-rouge"><dd></code>: describes each term</li>
<li>CSS property <code class="language-plaintext highlighter-rouge">float:left</code> to display a list horizontal</li>
</ul>
<h2 id="html-block-and-inline-elements">HTML Block and Inline Elements</h2>
<ul>
<li><code class="language-plaintext highlighter-rouge"><div></code>: element is a block-level element.
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><div style="background-color:black;color:white;padding:20px;"></div></code></li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge"><span></code>: element inside a paragraph.
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><span style="color:blue;font-weight:bold"></span></code></li>
</ul>
</li>
</ul>
<h2 id="html-the-class-attribute">HTML The class Attribute</h2>
<ul>
<li>The <code class="language-plaintext highlighter-rouge">class</code> attribute is often used to point to a class name in a style sheet.</li>
<li>ex) <code class="language-plaintext highlighter-rouge"><div class="city"></code>, <code class="language-plaintext highlighter-rouge"><span class="note"></code></li>
</ul>
<h2 id="html-the-id-attribute">HTML The id Attribute</h2>
<ul>
<li><code class="language-plaintext highlighter-rouge">id</code> attribute is used to specify a unique id for an HTML element.</li>
<li>The <code class="language-plaintext highlighter-rouge">id</code> attribute is used to point to a specific style declaration in a style sheet.</li>
<li>ex) <code class="language-plaintext highlighter-rouge"><h1 id="myHeader">My Header</h1> <style>#myHeader{color...}</style></code></li>
<li>ex <code class="language-plaintext highlighter-rouge"><a href="#C4">Jump to Chapter 4</a></code></li>
</ul>
<h2 id="html-iframes">HTML Iframes</h2>
<ul>
<li>An inline frame is used to embed another document within the current HTML document.</li>
<li>ex) <code class="language-plaintext highlighter-rouge"><iframe src="_url_" title="_description_"></code></li>
</ul>
<h2 id="html--javascript">HTML JavaScript</h2>
<ul>
<li><code class="language-plaintext highlighter-rouge"><script></code> tag is used to define a client-side script (JavaScript).</li>
<li>To select an HTML element, JavaScript most often uses the <code class="language-plaintext highlighter-rouge">document.getElementById()</code> method.</li>
</ul>
<h2 id="html--entities">HTML Entities</h2>
<ul>
<li>Some characters are reserved in HTML.</li>
<li>ex) <code class="language-plaintext highlighter-rouge">&_entity_name_; OR &#_entity_number_;</code></li>
<li>ex) sign( < ): <code class="language-plaintext highlighter-rouge">&it;</code> or <code class="language-plaintext highlighter-rouge">&#60;</code></li>
</ul>
<h2 id="xhtml">XHTML</h2>
<ul>
<li>XHTML stands for E<strong>X</strong>tensible <strong>H</strong>yper<strong>T</strong>ext <strong>M</strong>arkup <strong>L</strong>anguage</li>
<li>XML is a markup language where all documents must be marked up correctly (be “well-formed”).</li>
</ul>
<h2 id="html-forms">HTML Forms</h2>
<h3 id="the-form-element">The <code class="language-plaintext highlighter-rouge"><form></code> Element</h3>
<ul>
<li>The HTML <code class="language-plaintext highlighter-rouge"><form></code> element is used to create an HTML form for user input</li>
<li>type: “text”, “radio”, “submit”
<h3 id="the-label-element">The <code class="language-plaintext highlighter-rouge"><label></code> Element</h3>
</li>
<li>Notice the use of the <code class="language-plaintext highlighter-rouge"><label></code> element in the example above.
<h3 id="the-submit-button">The Submit Button</h3>
</li>
<li><code class="language-plaintext highlighter-rouge"><input type="submit"></code> defines a button for <strong>submitting</strong> the form data to a <strong>form-handler</strong>.</li>
<li>The <code class="language-plaintext highlighter-rouge">action</code> attribute defines the action to be performed when the form is submitted.</li>
<li>ex) <code class="language-plaintext highlighter-rouge"><form **action="/action_page.php**"></code></li>
<li>The <code class="language-plaintext highlighter-rouge">target</code> attribute specifies if the submitted result will open in a new browser tab, a frame, or in the current window.(“_self”, “_blank”)</li>
<li><code class="language-plaintext highlighter-rouge"><form action="/action_page.php" target="_blank"></code></li>
<li>The <code class="language-plaintext highlighter-rouge">method</code> attribute specifies the HTTP method (<strong>GET</strong> or <strong>POST</strong>) to be used when submitting the form data.</li>
<li>ex) <code class="language-plaintext highlighter-rouge"><form action="/action_page.php" method="get"></code></li>
<li>ex) <code class="language-plaintext highlighter-rouge"><form action="/action_page.php" method="post"></code>
<h3 id="the-select-element">The <code class="language-plaintext highlighter-rouge"><select></code> Element</h3>
</li>
<li>The <code class="language-plaintext highlighter-rouge"><select></code> element defines a <strong>drop-down list</strong></li>
<li><code class="language-plaintext highlighter-rouge">selected</code> attribute: pre-selected option</li>
<li><code class="language-plaintext highlighter-rouge">size</code> attribute to specify the number of visible values
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><select id="cars" name="cars" size="3"></code></li>
</ul>
</li>
<li><code class="language-plaintext highlighter-rouge">multiple</code> attribute to allow the user to select more than one value
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><select id="cars" name="cars" size="4" multiple></code>
<h3 id="the-textarea-element">The <code class="language-plaintext highlighter-rouge"><textarea></code> Element</h3>
</li>
</ul>
</li>
<li>The <code class="language-plaintext highlighter-rouge"><textarea></code> element defines a multi-line input field (a text area)
<ul>
<li>ex) <code class="language-plaintext highlighter-rouge"><textarea name="message" rows="10" cols="30"></code></li>
<li>ex) <code class="language-plaintext highlighter-rouge"><textarea name="message" style="width:200px; height:600px;"></code>
<h3 id="the-button-element">The <code class="language-plaintext highlighter-rouge"><button></code> Element</h3>
</li>
</ul>
</li>
<li>The <code class="language-plaintext highlighter-rouge"><button></code> element defines a clickable <strong>button</strong></li>
<li>ex) <code class="language-plaintext highlighter-rouge"><button type="button" onclick="alert('Hello World!')">Click Me!</button></code>
<h3 id="the-fieldset-and-legend-elements">The <code class="language-plaintext highlighter-rouge"><fieldset></code> and <code class="language-plaintext highlighter-rouge"><legend></code> Elements</h3>
</li>
<li>The <code class="language-plaintext highlighter-rouge"><fieldset></code> element is used to group related data in a form.</li>
<li>The <code class="language-plaintext highlighter-rouge"><legend></code> element defines a caption for the <code class="language-plaintext highlighter-rouge"><fieldset></code> element.
<h3 id="the-datalist-element">The <code class="language-plaintext highlighter-rouge"><datalist></code> Element</h3>
</li>
<li>Users will see a drop-down list of the pre-defined options as they input data.</li>
<li>The <code class="language-plaintext highlighter-rouge">list</code> attribute of the <code class="language-plaintext highlighter-rouge"><input></code> element, must refer to the <code class="language-plaintext highlighter-rouge">id</code> attribute of the <code class="language-plaintext highlighter-rouge"><datalist></code> element.</li>
</ul>
<h3 id="the-output-element">The <code class="language-plaintext highlighter-rouge"><output></code> Element</h3>
<ul>
<li>The <code class="language-plaintext highlighter-rouge"><output></code> element represents the result of a calculation (like one performed by a script).</li>
</ul>
<h2 id="html-input-types">HTML Input Types</h2>
<ul>
<li>input types you can use in HTML
<ul>
<li>button</li>
<li>checkbox</li>
<li>color</li>
<li>date</li>
<li>datetime-local</li>
<li>email</li>
<li>file</li>
<li>hidden</li>
<li>image</li>
<li>month</li>
<li>number</li>
<li>password</li>
<li>radio</li>
<li>range</li>
<li>reset</li>
<li>search</li>
<li>submit</li>
<li>tel</li>
<li>text</li>
<li>time</li>
<li>url</li>
<li>week</li>
</ul>
</li>
</ul>임채욱aythffk@gmail.comHTMLdocker2020-07-20T20:30:00+00:002020-07-20T20:30:00+00:00https://rockpell.github.io/docker<h1 id="도커">도커</h1>
<h2 id="docker-관련-명령어">Docker 관련 명령어</h2>
<ul>
<li>docker build -t “이름” .</li>
<li>docker run -it -p 80:80 <이미지 이름=""> /bin/bash</이미지></li>
<li>docker run -d -p 80:80 <이미지 이름=""></이미지></li>
<li>docker restart <컨테이너 이름="">: 컨테이너 재시작</컨테이너></li>
<li>docker attach <컨테이너 이름="">: 실행중인 프로세스에 접속하는 명령어</컨테이너></li>
<li>docker exec -it <컨테이너 이름=""> 명령어: 외부에서 컨테이너 안의 명령을 실행하는 명령어</컨테이너></li>
</ul>
<p>http://pyrasis.com/book/DockerForTheReallyImpatient/Chapter20/08</p>
<h2 id="alpine-linux">Alpine Linux</h2>
<p>기본 명령어:
https://www.lesstif.com/docker/alpine-linux-35356819.html</p>
<p>알파인은 bash가 없기때문에 도커 생성 후 접속시 /bin/sh로 접속해야한다.</p>
<p>https://wiki.alpinelinux.org/wiki/Nginx</p>
<p>apk update && apk add nginx
apk add openrc –no-cache</p>임채욱aythffk@gmail.com도커선형대수학2020-07-19T00:50:00+00:002020-07-19T00:50:00+00:00https://rockpell.github.io/%EC%84%A0%ED%98%95%EB%8C%80%EC%88%98%ED%95%99<h1 id="선형대수학">선형대수학</h1>
<h3 id="내적">내적</h3>
<p>벡터의 길이, 크기를 구하는 법, 벡터의 곱하기</p>
<h3 id="노름">노름</h3>
<p>||x||
벡터의 길이</p>
<h3 id="벡터-방정식">벡터 방정식</h3>
<p>p - p0 = ta</p>
<h3 id="매개방정식">매개방정식</h3>
<p>x = x0 + ta</p>
<p>y = y0 + tb</p>
<p>z = z0 + tc</p>
<h3 id="대칭방정식">대칭방정식</h3>
<p>(x - x0) / a = (y - y0) / b = (z - z0) / c ( = t), (a, b, c != c)</p>
<h3 id="평면의-벡터방정식">평면의 벡터방정식</h3>
<p>x - x0 = t1v1 + t2v2</p>
<h3 id="벡터의-정사영">벡터의 정사영</h3>
<p>projxy = tx = ((y•x) / x • x) *x</p>임채욱aythffk@gmail.com선형대수학리눅스 명령어2020-06-29T18:54:00+00:002020-06-29T18:54:00+00:00https://rockpell.github.io/%EB%A6%AC%EB%88%85%EC%8A%A4%EB%AA%85%EB%A0%B9%EC%96%B4<h1 id="리눅스-명령어">리눅스 명령어</h1>
<p>cat : 파일 내용 보여주는 명령어</p>
<p>ls -al : 숨겨진 파일도 보여줌</p>
<p>mv : 이름 변경, 파일 이동</p>
<p>/etc/hosts : ip번호 허용 목록</p>
<p>/etc/services : 서비스 포트번호 적혀 있는 파일</p>
<p>/etc/group : 그룹 리스트 저장된 파일</p>
<p>하드링크 : ln 원본 대상</p>
<p>심볼릭 링크 : ln -s 원본 대상</p>
<p>stat 대상 : 대상의 시간 정보를 확인</p>
<p>touch 대상 : 대상의 시간 정보를 갱신</p>
<p>touch -t 시간 대상 : 대상의 시간 정보를 변경</p>
<p>find . -mtime -숫자 : 숫자 날짜에 이내에 생성된 파일 보여줌</p>
<p>grep : 파일 내용 검색</p>
<p>grep -i : grep의 대소문자 무시 옵션</p>
<p>egrep : grep의 기능을 확장한 명령</p>
<p>find : 파일찾기</p>
<ul>
<li>name : 이름으로 찾는 옵션</li>
<li>type : 타입으로 찾는 옵션</li>
<li>mtime(+/-:24시간 기준) : 생성 시간으로 찾기</li>
<li>size</li>
<li>perm : 권한으로 찾기</li>
<li>and(조건을 생략하면 자동으로 and처리)</li>
<li>o(or)</li>
<li>exec(삭제) : 삭제 옵션</li>
<li>ex) <code class="language-plaintext highlighter-rouge">find . -name find.dat -exec rm {} \;</code></li>
</ul>
<p>tar 기능 [아카이브파일] 파일이름</p>
<p>e : tar 파일 생성</p>
<p>tvf : 목록 보기</p>
<p>xvf : 풀기</p>
<p>cvf : 아카이브 생성과 압축하기</p>
<p>c0vf : 아카이브만 생성하기</p>
<p>file: file은 지정된 파일의 종류(타입)을 확인하는 명령어, /usr/share/file 디렉토리의 magic 파일을 참조하여 파일종류를 표시해준다.</p>
<h3 id="권한-관련">권한 관련</h3>
<p>리눅스에서 파일의 권한은 rwx로 표기한다</p>
<p>rwx는 각각 읽기(read), 쓰기(write), 실행(execute) 권한을 나타낸다</p>
<p><code class="language-plaintext highlighter-rouge">-rwxr-xr-x</code> 의 경우 아래와 같은 의미를 가지고 있다</p>
<ul>
<li><code class="language-plaintext highlighter-rouge">-</code> 파일(-), 디렉토리(d)를 구분</li>
<li>rwx 사용자(owner, 소유자) 권한(퍼미션)</li>
<li>r-x 그룹(group) 권한</li>
<li>r-x 다른 사용자(other) 권한</li>
</ul>
<p>디렉토리의 경우 실행권한이 있어야 디렉토리에 들어갈 수 있다</p>
<p>권한은 숫자로 표기시에 이진수로 표기되며 r은 4, w는 2, x는 1의 값을 가진다.</p>
<p>ex) 777, 755, 700</p>
<p>chmod : 권한 변경 명령어</p>
<p>umask : 새로 생성되는 파일 및 디렉토리의 권한을 설정하는 명령어, 파일 및 디렉토리가 생성 될 때 최대 권한 수치에서 umask를 뺀 값 만큼 권한을 준다.</p>
<h3 id="brew-설치">brew 설치</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>rm -rf $HOME/.brew && git clone --depth=1 https://github.com/Homebrew/brew $HOME/.brew && echo 'export PATH=$HOME/.brew/bin:$PATH' >> $HOME/.zshrc && source $HOME/.zshrc && brew update
</code></pre></div></div>임채욱aythffk@gmail.com리눅스 명령어Heap2020-06-18T23:00:00+00:002020-06-18T23:00:00+00:00https://rockpell.github.io/Heap<h1 id="heap">Heap</h1>
<p>heap 자료구조 구현</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include <string>
#include <vector>
#include <iostream>
</span>
<span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>
<span class="kt">void</span> <span class="nf">swap</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">n1</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">n2</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">temp</span> <span class="o">=</span> <span class="o">*</span><span class="n">n1</span><span class="p">;</span>
<span class="o">*</span><span class="n">n1</span> <span class="o">=</span> <span class="o">*</span><span class="n">n2</span><span class="p">;</span>
<span class="o">*</span><span class="n">n2</span> <span class="o">=</span> <span class="n">temp</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">class</span> <span class="nc">Heap</span>
<span class="p">{</span>
<span class="nl">private:</span>
<span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span> <span class="n">heap</span><span class="p">;</span>
<span class="cm">/*
계산상의 편의를 위해 0번 인덱스를 사용하지 않음
*/</span>
<span class="nl">public:</span>
<span class="n">Heap</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">heap</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="p">}</span>
<span class="cm">/*
0번 인덱스를 사용하지 않기 위해 push한 데이터를 고려하여 size - 1 반환
*/</span>
<span class="kt">int</span> <span class="n">size</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">heap</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="n">top</span><span class="p">()</span>
<span class="p">{</span>
<span class="k">return</span> <span class="n">heap</span><span class="p">[</span><span class="mi">1</span><span class="p">];</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">push</span><span class="p">(</span><span class="kt">int</span> <span class="n">value</span><span class="p">)</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">child</span> <span class="o">=</span> <span class="n">heap</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
<span class="kt">int</span> <span class="n">parent</span> <span class="o">=</span> <span class="n">child</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
<span class="n">heap</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">value</span><span class="p">);</span>
<span class="k">while</span> <span class="p">(</span><span class="n">child</span> <span class="o">></span> <span class="mi">1</span> <span class="o">&&</span> <span class="n">heap</span><span class="p">[</span><span class="n">parent</span><span class="p">]</span> <span class="o"><</span> <span class="n">heap</span><span class="p">[</span><span class="n">child</span><span class="p">])</span>
<span class="p">{</span>
<span class="n">swap</span><span class="p">(</span><span class="o">&</span><span class="n">heap</span><span class="p">[</span><span class="n">child</span><span class="p">],</span> <span class="o">&</span><span class="n">heap</span><span class="p">[</span><span class="n">parent</span><span class="p">]);</span>
<span class="n">child</span> <span class="o">=</span> <span class="n">parent</span><span class="p">;</span>
<span class="n">parent</span> <span class="o">=</span> <span class="n">child</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">pop</span><span class="p">()</span>
<span class="p">{</span>
<span class="kt">int</span> <span class="n">child</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">parent</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="n">heap</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">heap</span><span class="p">.</span><span class="n">back</span><span class="p">();</span>
<span class="n">heap</span><span class="p">.</span><span class="n">pop_back</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">child</span> <span class="o">+</span> <span class="mi">1</span> <span class="o"><=</span> <span class="n">heap</span><span class="p">.</span><span class="n">size</span><span class="p">())</span>
<span class="p">{</span>
<span class="n">child</span> <span class="o">=</span> <span class="p">(</span><span class="n">heap</span><span class="p">[</span><span class="n">child</span><span class="p">]</span> <span class="o">></span> <span class="n">heap</span><span class="p">[</span><span class="n">child</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span> <span class="o">?</span> <span class="n">child</span> <span class="o">:</span> <span class="n">child</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">while</span> <span class="p">(</span><span class="n">child</span> <span class="o"><=</span> <span class="n">heap</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&&</span> <span class="n">heap</span><span class="p">[</span><span class="n">parent</span><span class="p">]</span> <span class="o"><</span> <span class="n">heap</span><span class="p">[</span><span class="n">child</span><span class="p">])</span>
<span class="p">{</span>
<span class="n">swap</span><span class="p">(</span><span class="o">&</span><span class="n">heap</span><span class="p">[</span><span class="n">parent</span><span class="p">],</span> <span class="o">&</span><span class="n">heap</span><span class="p">[</span><span class="n">child</span><span class="p">]);</span>
<span class="n">parent</span> <span class="o">=</span> <span class="n">child</span><span class="p">;</span>
<span class="n">child</span> <span class="o">=</span> <span class="n">child</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">child</span> <span class="o">+</span> <span class="mi">1</span> <span class="o"><=</span> <span class="n">heap</span><span class="p">.</span><span class="n">size</span><span class="p">())</span>
<span class="p">{</span>
<span class="n">child</span> <span class="o">=</span> <span class="p">(</span><span class="n">heap</span><span class="p">[</span><span class="n">child</span><span class="p">]</span> <span class="o">></span> <span class="n">heap</span><span class="p">[</span><span class="n">child</span> <span class="o">+</span> <span class="mi">1</span><span class="p">])</span> <span class="o">?</span> <span class="n">child</span> <span class="o">:</span> <span class="n">child</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>임채욱aythffk@gmail.comHeapDisjoint Set2020-06-16T19:00:00+00:002020-06-16T19:00:00+00:00https://rockpell.github.io/Disjoint_Set<h1 id="disjoint-set">Disjoint Set</h1>
<p>참고사이트: [https://bowbowbow.tistory.com/26]</p>
<p>이해가 잘 되지 않아 공부가 좀 더 필요할것 같다.</p>임채욱aythffk@gmail.comDisjoint Setc++2020-01-10T03:00:00+00:002020-01-10T03:00:00+00:00https://rockpell.github.io/c++<h1 id="c-기본-개념-학습을-위한-정리">c++ 기본 개념 학습을 위한 정리</h1>
<h2 id="상속-가상함수">상속, 가상함수</h2>
<h3 id="상속">상속</h3>
<p>오버라이딩: 기반 클래스(부모클래스)의 함수와 같은 이름의 함수를 파생 클래스(자식클래스)에서 정의하여 해당 함수가 호출되게 만드는 것</p>
<p>is-a: 모든 상속관계는 is-a 관계라고 볼 수 있다.</p>
<p>has-a: 한 클래스가 다른 클래스를 가지고 있는 관계</p>
<p>업캐스팅: 파생 클래스를 기반 클래스로 캐스팅하는 것</p>
<p>다운 캐스팅: 기반 클래스를 파생클래스로 캐스팅하는 것</p>
<h3 id="가상-함수">가상 함수</h3>
<p>virtual 키워드를 붙여 가상 함수를 사용 할 수 있다. ex)<code class="language-plaintext highlighter-rouge">virtual void method()</code></p>
<p>가상 함수는 어떤 함수를 실행 할 지 런타임시에 결정되는 동적바인딩이 수행된다.</p>
<p>정적바인딩은 컴파일시에 실행할 함수가 정해진다.</p>
<p>가상함수를 오버라이드하는 경우 override 키워드를 이용하여 명시적으로 나타낼 수 있음 ex)<code class="language-plaintext highlighter-rouge">void method() override</code></p>
<p>다형성(polymorphism)은 가상함수를 이용하여 하나의 메소드를 호출하여도 여러 객체에 따라 다른 일을 하게 만드는 것을 의미한다.</p>
<p>가상함수가 포함된 클래스들은 각자 vtable을 가지고 있으며 함수 호출 시 vtable에 정의된 바에 따라 기반 클래스 혹은 파생 클래스의 함수를 호출한다.</p>
<p>순수 가상 함수: 반드시 오버라이딩 해야하는 가상 함수 ex) <code class="language-plaintext highlighter-rouge">virtual void speak() = 0;</code></p>
<p>본체가 없기 때문에, 이 함수를 호출하는 것은 불가능하다.</p>
<p>추상 클래스: 순수 가상 함수를 하나 이상 포함하고 있는 클래스, 순수 가상 함수를 구현하지 않으면 인스턴스화가 불가능하다.</p>
<h2 id="템플릿">템플릿</h2>
<p>template <typename T=""> 과 같이 사용</typename></p>
<p>컴파일시 컴파일러가 타입에 맞도록 치환하여 코드로 생성한다.</p>
<p>인스턴스화 되지 않은 코드에서는 치환되지 않는다.(생성되지 않기 때문에)</p>
<p>ex) T -> string, Vector<string></string></p>
<p>c++11 using을 이용하면 typedef 대신에 사용가능하다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="nf">void</span> <span class="p">(</span><span class="o">*</span><span class="n">func</span><span class="p">)(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">);</span>
<span class="k">using</span> <span class="n">func</span> <span class="o">=</span> <span class="kt">void</span> <span class="p">(</span><span class="o">*</span><span class="p">)(</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="p">);</span>
</code></pre></div></div>
<p>auto: 오른쪽의 연산자를 통해서 컴파일러가 타입을 추론, 템플릿과 같은 방식으로 타입을 추론한다.</p>
<h2 id="리터럴-연산자">리터럴 연산자</h2>
<ul>
<li>L””: wchar_t[]으로 정의</li>
<li>u8””: UTF-8 문자열</li>
<li>u””: UTF-16 문자열</li>
<li>R”()”: Raw string literal, 모든 문자가 그대로 저장(개행문자, 주석 표시 표함), c++11부터 사용 가능 <code class="language-plaintext highlighter-rouge">R"(db-\d*-log\.txt)"</code></li>
<li>"”s: string으로 추론하여 정의, c++14부터 사용 가능 <code class="language-plaintext highlighter-rouge">auto str = "hello"s;</code></li>
</ul>
<h2 id="정규-표현식-라이브러리regex">정규 표현식 라이브러리(regex)</h2>
<p>regex 라이브러리를 include해서 사용 가능</p>
<h3 id="regex_match">regex_match</h3>
<p>생성한 regex 객체를 이용하여 주어진 문자열이 주어진 패턴과 일치하는지 여부를 검사</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">regex</span> <span class="nf">re</span><span class="p">(</span><span class="s">"db-</span><span class="se">\\</span><span class="s">d*-log</span><span class="se">\\</span><span class="s">.txt"</span><span class="p">);</span>
<span class="c1">//std::regex re(R"(db-\d*-log\.txt)");</span>
<span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span> <span class="o">&</span><span class="n">file_name</span> <span class="o">:</span> <span class="n">file_names</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// std::boolalpha 는 bool 을 0 과 1 대신에 false, true 로 표현하게 해줍니다.</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">file_name</span> <span class="o"><<</span> <span class="s">": "</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">boolalpha</span>
<span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">regex_match</span><span class="p">(</span><span class="n">file_name</span><span class="p">,</span> <span class="n">re</span><span class="p">)</span> <span class="o"><<</span> <span class="sc">'\n'</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<h3 id="패턴-일부-뽑아내기">패턴 일부 뽑아내기</h3>
<p>캡처 그룹을 이용하여 주어진 패턴과 일치하는 문자열에서 패턴 일부분을 뽑아낼 수 있다.</p>
<p>smatch를 이용하여 매칭된 문자열을 보관할 수 있다.</p>
<p>smatch는 string을 저장하며 cmatch는 const char*을 보관한다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">regex</span> <span class="nf">re</span><span class="p">(</span><span class="s">"[01]{3}-(</span><span class="se">\\</span><span class="s">d{3,4})-</span><span class="se">\\</span><span class="s">d{4}"</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">smatch</span> <span class="n">match</span><span class="p">;</span> <span class="c1">// 매칭된 결과를 string 으로 보관</span>
<span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span> <span class="o">&</span><span class="n">number</span> <span class="o">:</span> <span class="n">phone_numbers</span><span class="p">)</span> <span class="p">{</span>
<span class="k">if</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">regex_match</span><span class="p">(</span><span class="n">number</span><span class="p">,</span> <span class="n">match</span><span class="p">,</span> <span class="n">re</span><span class="p">))</span> <span class="p">{</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">match</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"Match : "</span> <span class="o"><<</span> <span class="n">match</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">str</span><span class="p">()</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>
<h3 id="regex_search">regex_search</h3>
<p>패턴을 만족하는 문자열 일부를 검색 할 수 있다.</p>
<p>suffix 함수는 원 문자열에서 검색된 패턴 바로 뒤 부터, 이전 문자열의 끝까지에 해당하는 std::sub_match 객체를 리턴한다.</p>
<p>sub_match클래스에는 string으로 변환할 수 있는 캐스팅 연산자가 들어있다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">regex</span> <span class="nf">re</span><span class="p">(</span><span class="s">R"(<div class="sk[\w -]*">\w*</div>)"</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">smatch</span> <span class="n">match</span><span class="p">;</span>
<span class="k">while</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">regex_search</span><span class="p">(</span><span class="n">html</span><span class="p">,</span> <span class="n">match</span><span class="p">,</span> <span class="n">re</span><span class="p">))</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">match</span><span class="p">.</span><span class="n">str</span><span class="p">()</span> <span class="o"><<</span> <span class="sc">'\n'</span><span class="p">;</span>
<span class="n">html</span> <span class="o">=</span> <span class="n">match</span><span class="p">.</span><span class="n">suffix</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>
<h3 id="regex_iterator">regex_iterator</h3>
<p>iterator를 이용하여 문자열 검색 가능</p>
<p>regex_iterator는 처음 생성될 때와 ++ 연산자로 증감 될 때마다 regex_search를 통해 문자열을 검색한다.</p>
<p>*연산자를 통해서 역참조하면 현재 검색된 패턴에 대한 match_results 객체를 얻을 수 있다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">regex</span> <span class="nf">re</span><span class="p">(</span><span class="s">R"(<div class="sk[\w -]*">\w*</div>)"</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">smatch</span> <span class="n">match</span><span class="p">;</span>
<span class="k">auto</span> <span class="n">start</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">sregex_iterator</span><span class="p">(</span><span class="n">html</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">html</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">re</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">end</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">sregex_iterator</span><span class="p">();</span>
<span class="k">while</span> <span class="p">(</span><span class="n">start</span> <span class="o">!=</span> <span class="n">end</span><span class="p">)</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">start</span><span class="o">-></span><span class="n">str</span><span class="p">()</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="o">++</span><span class="n">start</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<h3 id="regex_replace">regex_replace</h3>
<p>원하는 패턴의 문자들을 다른 문자열로 치환</p>
<p>캡쳐 그룹을 이용하여 다른 문자열로 치환 시에 매칭된 문자열을 활용하여 치환할 수 있다.</p>
<p>치환시에 사용하는 $는 back reference라고 부르며 숫자는 캡쳐 그룹의 순서를 나타낸다.</p>
<p>캡쳐 그룹의 순서는 괄호가 열리는 순서대로 $1, $2, …순으로 진행된다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">regex</span> <span class="nf">re</span><span class="p">(</span><span class="s">R"(sk-circle(\d))"</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">smatch</span> <span class="n">match</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">modified_html</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">regex_replace</span><span class="p">(</span><span class="n">html</span><span class="p">,</span> <span class="n">re</span><span class="p">,</span> <span class="s">"$1-sk-circle"</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">modified_html</span><span class="p">;</span>
</code></pre></div></div>
<h2 id="string_view">string_view</h2>
<ul>
<li>문자열 읽기만 필요할 때 사용</li>
<li>C++ 17부터 도입</li>
<li>메모리 할당을 하지 않는다</li>
<li>원본이 사라지면 문제가 생긴다</li>
<li><code class="language-plaintext highlighter-rouge">const char*</code>을 매개변수로 사용하면 문자열 길이를 다시 계산해야하지만 string_view는 문자열 길이를 가지고 있다.</li>
</ul>
<h2 id="stl">STL</h2>
<h3 id="vector">vector</h3>
<ul>
<li>[]연산자, at(): 임의의 위치 원소에 접근</li>
<li>begin(): 첫번째 원소를 가리키는 iterator 반환</li>
<li>end(): 마지막 원소 한 칸 뒤를 가리키는 iterator 반환</li>
<li>push_back(const T& x): 벡터 끝에 원소를 추가한다. 현재의 마지막 원소 뒤에 새로운 원소를 추가하며, 그 원소의 값은 x 의 복사본으로 초기화 된다.
capacity 와 벡터 size 가 같다면 내부적으로 재할당이 일어나게 된다. 이 때 이전에 사용되었던 반복자(iterator) , 레퍼런스, 포인터들은 사용할 수 없음
시간복잡도는 amortized O(1)이 된다.</li>
<li>insert, erase: 임의의 위치에 원소 삽입 및 제거, 시간복잡도 O(n)</li>
</ul>
<p>유니폼 초기화를 이용하여 간단하게 초기화</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span> <span class="n">inputs</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">3</span><span class="p">,</span><span class="mi">4</span><span class="p">,</span><span class="mi">5</span><span class="p">};</span>
<span class="n">vector</span><span class="o"><</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">>></span> <span class="n">inputs</span><span class="p">{</span>
<span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="mi">6</span><span class="p">},</span>
<span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">},</span>
<span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">},</span>
<span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">},</span>
<span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">},</span>
<span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="mi">4</span><span class="p">},</span>
<span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span><span class="p">{</span><span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">}</span>
<span class="p">};</span>
</code></pre></div></div>
<h3 id="list">list</h3>
<p>링크드리스트</p>
<ul>
<li>begin(): 첫번째 원소를 가리키는 iterator 반환</li>
<li>end(): 마지막 원소 한 칸 뒤를 가리키는 iterator 반환</li>
<li>push_back(const T& x): 마지막 위치에 원소 삽입, 시간복잡도 O(1)</li>
<li>insert, erase: 임의의 위치에 원소 삽입 및 제거, 시간복잡도 O(1)</li>
</ul>
<h3 id="algorithm">algorithm</h3>
<ul>
<li>sort: 정렬</li>
<li>stable_sort: 순서를 보장하여 정렬, sort보다 느림</li>
<li>partial_sort: 원하는 범위의 정렬된 원소를 원할때 사용하는 정렬함수, 그 외의 원소는 무작위로 나타난다. ex) 0~2번째 순서까지만 정렬되도록</li>
<li>
<p>remove: 원하는 원소의 뒤에 있는 원소를 앞으로 이동시킨다. erase와 함께 사용하여 원소 제거시에 사용</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> vec.erase(remove(vec.begin(), vec.end(), 3), vec.end());
</code></pre></div> </div>
</li>
<li>remove_if: remove와 기본적으로 동일하게 작동하며 조건을 추가할 수 있다.</li>
<li>
<p>람다함수
[capture list] (받는 인자) -> 리턴 타입 { 함수 본체 } 또는</p>
<p>[capture list] (받는 인자) { 함수 본체 }</p>
<ul>
<li>
<p>캡처리스트</p>
<p>this는 캡처리스트에 표기하지 않아도 암묵적으로 레퍼런스 타입으로 캡쳐된다.</p>
</li>
<li>[] : 아무것도 캡쳐 안함</li>
<li>[&a, b] : a 는 레퍼런스로 캡쳐하고 b 는 (변경 불가능한) 복사본으로 캡쳐</li>
<li>[&] : 외부의 모든 변수들을 레퍼런스로 캡쳐</li>
<li>[=] : 외부의 모든 변수들을 복사본으로 캡쳐, const 타입으로 캡쳐된다.</li>
</ul>
</li>
<li>transform (시작 반복자, 끝 반복자, 결과를 저장할 컨테이너의 시작 반복자, Pred): 전체 혹은 일부를 순회하면서 값을 수정, 모든 원소에 1을 더하는 것과 같은 단순 작업에 사용</li>
<li>find: 원하는 원소를 찾을 때 사용, 반복자를 반환, 선형탐색을 하기 때문에 사용하는 컨테이너에 탐색 함수가 있다면 이 함수를 사용하면 느리다.(vector에는 없기때문에 이 함수를 사용)</li>
<li>find_if: 조건에 맞는 원소 찾을 때 사용</li>
<li>any_of: 조건 중 하나라도 일치하는 원소가 있는지 true, false 반환</li>
<li>all_of: 모든 원소가 조건에 일치하는지 true, false반환</li>
</ul>
<h2 id="예외처리">예외처리</h2>
<h3 id="throw">throw</h3>
<p>예외를 던질때 사용</p>
<p>예외로 전달하는 객체는 아무거나 가능하다</p>
<p>std::exception을 상속받은 객체를 만들어 쓰거나 사용하는것이 좋다.</p>
<p>ex) <code class="language-plaintext highlighter-rouge">throw std::out_of_range("vector 의 index 가 범위를 초과하였습니다.");</code></p>
<p>overflow_error, length_error, runtime_error등</p>
<h3 id="try-catch">try, catch</h3>
<p>try문 내에서 throw 발생시 가장 가까운 catch로 점프</p>
<h3 id="catch">catch(…)</h3>
<p>모든 예외 상황을 처리할 때 사용</p>
<h3 id="stack-unwinding">stack unwinding</h3>
<p>throw 호출 후 가장 가까운 catch로 점프할때 스택 상에 정의된 객체들을 소멸시키는 과정
(생성자에서 예외 발생 시 소멸자가 호출되지 않는다, catch안에서 알아서 해제시켜줘야함)</p>
<h3 id="noexcept-키워드">noexcept 키워드</h3>
<p>이 키워드가 붙은 함수는 예외가 발생하지 않는다는 것을 컴파일러에게 알려줌(최적화용)</p>
<p>이 키워드가 붙은 함수내에서 throw로 예외 호출시 제대로 처리되지 않고 프로그램이 종료된다 , 소멸자는 기본적으로 noexcept이다.</p>
<h2 id="이동-우측값-레퍼런스">이동, 우측값 레퍼런스</h2>
<h3 id="복사-생략copy-elision">복사 생략(copy elision)</h3>
<p>일반 생성자로 생성한 객체를 복사 생성자로 복사하는 것과 같은 경우 컴파일러 자체에서 복사를 생략하는 최적화가 가능하다.</p>
<p>C++ 표준 상으로는 필수는 아니고 할 수도 있는 기능</p>
<h3 id="lvalue">lvalue</h3>
<p>주소값을 취할 수 있는 값</p>
<h3 id="rvalue">rvalue</h3>
<p>주소값을 취할 수 없는 값, 임시로 사용되고 연산이 끝나면 사라지는 값</p>
<h3 id="우측값-레퍼런스">우측값 레퍼런스</h3>
<p>&&를 사용하여 정의</p>
<p>우측값을 레퍼런스 변수로 사용할 수 있게 하는 기능</p>
<p>레퍼런스 하는 임시 객체가 소멸되지 않도록 한다.</p>
<h3 id="이동생성자">이동생성자</h3>
<p>T(T &&target); 와 같은 식으로 사용</p>
<p>객체를 이동시에 객체내부에 존재하는 객체 변수들을 복사하지 않고 주소값만 변경하는 생성자</p>
<p>임시객체의 값을 이용하기 때문에 임시 객체 소멸시 값이 소멸되지 않도록 nullprt을 지정해줘야한다(얕은 복사이기 때문에 원본이 지워지면 같이 사라진다.)</p>
<p>vector와 같은 컨테이너에서 사용시에는 noexcept로 명시하지 않으면 복사생성자를 호출한다.</p>
<h3 id="move함수">move함수</h3>
<p>좌측값을 우측값으로 캐스팅하는 함수</p>
<h2 id="스마트포인터-raiiresource-acquisition-is-initialization">스마트포인터, RAII(Resource Acquisition Is Initialization)</h2>
<h3 id="raiiresource-acquisition-is-initialization">RAII(Resource Acquisition Is Initialization)</h3>
<p>자원의 획득은 초기화한다
자원 관리를 스택에 할당한 객체를 통해 수행</p>
<h3 id="스마트포인터">스마트포인터</h3>
<p>자원 관리를 스택의 객체(포인터 객체)를 통해 수행하는 것
스마트 포인터를 사용하면 소멸자를 통해 delete가 수행된다.</p>
<h3 id="unique_ptr">unique_ptr</h3>
<p>특정 객체에 유일한 소유권을 부여하는 포인터 객체</p>
<p><code class="language-plaintext highlighter-rouge">data</code>에 <code class="language-plaintext highlighter-rouge">new Data()</code>로 생성된 객체의 소유권을 보유하면 <code class="language-plaintext highlighter-rouge">delete data</code>만 가능하다</p>
<p>unique_ptr은 복사 생성자가 명시적으로 삭제되어있다.</p>
<p>std::move함수를 통해 소유권을 이전 시킬수 있다.(소유권을 이전한 포인터는 절대 다시 참조하면 안된다.)</p>
<p>std::unique_ptr<>를 통해 생성하거나 auto ptr = std::make_unique<Foo>(3, 5); 와 같이 make_unique함수를 통해 생성</Foo></p>
<p>make_unique 함수가 좀더 효율적(템플릿 인자로 전달된 클래스의 생성자에 인자들을 전달하여 생성하기 때문)</p>
<h3 id="삭제된-함수">삭제된 함수</h3>
<p>사용을 원치 않는 함수를 삭제시키는 방법</p>
<p>삭제된 함수 호출시 컴파일 오류를 발생시킨다.</p>
<p>C++ 11에 추가됨</p>
<p>ex) A(const A& a) = delete;</p>
<h3 id="shared_ptr">shared_ptr</h3>
<p>여러개의 shared_ptr이 같은 객체를 가리킬 수 있으며 참조 개수가 0이 되면 가리키고 있는 객체를 해제한다.</p>
<p>제어 블록을 동적으로 할당한 후 shared_ptr에 필요한 정보를 공유한다.</p>
<p>make_shared 함수로 생성</p>
<h3 id="enable_shared_from_this">enable_shared_from_this</h3>
<p>shared_ptr의 인자가 주소 값일 경우 여러개의 제어 블록이 생성될 수 있다.(최대한 지양해야함)</p>
<p>객체 내부에서 자기 자신을 가리키는 shared_ptr을 만들때는 enable_shared_from_this을 사용해야한다.</p>
<p>enable_shared_from_this을 해당 객체가 상속받고 shared_from_this()함수를 이용하여 shared_ptr을 생성하여 사용한다.</p>
<p>shared_from_this()함수는 기존에 정의된 제어 블록이 있을때만 사용가능(shared_ptr이 이미 생성된 이후에 사용가능)</p>
<h3 id="weak_ptr">weak_ptr</h3>
<p>shared_ptr이 서로 참조하는 순환 참조 문제를 해결하기 위해 사용</p>
<p>shared_ptr과는 달리 참조 횟수를 늘리지 않는다.</p>
<p>weak_ptr이 객체를 가리키고 있더라도 다른 shared_ptr들이 가리키고 있지 않다면 메모리에서 소멸된다.</p>
<p>weak_ptr 자체로는 객체를 참조할 수 없고 shared_ptr로 변환 후에 사용할 수 있다.(가리키고 있는 객체가 이미 소멸되었다면 빈 shared_ptr로 변환된다.)</p>
<p>lock함수를 통해 shared_ptr로 변환</p>
<p>제어 블록에는 약한 참조 개수(weak count)를 기록하며 weak_ptr이 0개일 때 제어 블록이 메모리에서 해제된다.</p>
<h2 id="callable">Callable</h2>
<p>()를 붙여서 호출할 수 있는 모든 것</p>
<h3 id="stdfunction">std::function</h3>
<p>Callable들을 객체의 형태로 보관할 수 있는 클래스</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">some_func1</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&</span> <span class="n">a</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"Func1 호출! "</span> <span class="o"><<</span> <span class="n">a</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">struct</span> <span class="nc">S</span>
<span class="p">{</span>
<span class="kt">void</span> <span class="k">operator</span><span class="p">()(</span><span class="kt">char</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"Func2 호출! "</span> <span class="o"><<</span> <span class="n">c</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span> <span class="p">}</span>
<span class="p">};</span>
<span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o"><</span><span class="kt">int</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&</span><span class="p">)</span><span class="o">></span> <span class="n">f1</span> <span class="o">=</span> <span class="n">some_func1</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o"><</span><span class="kt">void</span><span class="p">(</span><span class="kt">char</span><span class="p">)</span><span class="o">></span> <span class="n">f2</span> <span class="o">=</span> <span class="n">S</span><span class="p">();</span>
<span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o"><</span><span class="kt">void</span><span class="p">()</span><span class="o">></span> <span class="n">f3</span> <span class="o">=</span> <span class="p">[]()</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"Func3 호출! "</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span> <span class="p">};</span>
</code></pre></div></div>
<p>멤버 함수를 가지는 std::function은 다른 방법을 사용해야한다.(멤버 함수들은 자신을 호출한 객체를 인자로 암묵적으로 받고 있기 때문에)</p>
<p>&연산자를 통해 명시적으로 주소값을 전달해야함</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">function</span><span class="o"><</span><span class="kt">int</span><span class="p">(</span><span class="n">A</span><span class="o">&</span><span class="p">)</span><span class="o">></span> <span class="n">f1</span> <span class="o">=</span> <span class="o">&</span><span class="n">A</span><span class="o">::</span><span class="n">some_func</span><span class="p">;</span>
</code></pre></div></div>
<p>mem_fn 함수를 이용하여 멤버 객체를 함수 객체로 변환할 수 있다.(자주 사용 안함, 람다함수를 이용하면 동일한 작업 수행 가능)</p>
<h3 id="stdbind">std::bind</h3>
<p>함수 객체 생성 시에 인자를 특정한 것을 지정하는 함수</p>
<p>std::placeholders는 _1부터 _29까지 정의되어 있으며 bind로 생성한 함수 객체 호출시 인자를 전달한다.</p>
<p>인자를 여러개 전달하더라도 지정하지 않은 뒤의 인자는 무시된다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">add</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">x</span> <span class="o"><<</span> <span class="s">" + "</span> <span class="o"><<</span> <span class="n">y</span> <span class="o"><<</span> <span class="s">" = "</span> <span class="o"><<</span> <span class="n">x</span> <span class="o">+</span> <span class="n">y</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="nf">subtract</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">x</span> <span class="o"><<</span> <span class="s">" - "</span> <span class="o"><<</span> <span class="n">y</span> <span class="o"><<</span> <span class="s">" = "</span> <span class="o"><<</span> <span class="n">x</span> <span class="o">-</span> <span class="n">y</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">auto</span> <span class="n">add_with_2</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">bind</span><span class="p">(</span><span class="n">add</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">placeholders</span><span class="o">::</span><span class="n">_1</span><span class="p">);</span> <span class="n">add_with_2</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
<span class="k">auto</span> <span class="n">negate</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">bind</span><span class="p">(</span><span class="n">subtract</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">placeholders</span><span class="o">::</span><span class="n">_2</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">placeholders</span><span class="o">::</span><span class="n">_1</span><span class="p">);</span>
<span class="n">negate</span><span class="p">(</span><span class="mi">4</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</code></pre></div></div>
<p>레퍼런스를 인자로 받는 경우 bind 함수로 인자가 복사되서 전달 되기 때문에 std::ref함수를 이용하여 명시적으로 레퍼런스를 전달해줘야한다.</p>
<h2 id="thread">Thread</h2>
<h3 id="사용법">사용법</h3>
<p><code class="language-plaintext highlighter-rouge">#include <thread></code> 사용</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">func1</span><span class="p">()</span>
<span class="p">{</span>
<span class="p">....</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="nf">worker</span><span class="p">(</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">>::</span><span class="n">iterator</span> <span class="n">start</span><span class="p">,</span> <span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">>::</span><span class="n">iterator</span> <span class="n">end</span><span class="p">,</span>
<span class="kt">int</span><span class="o">*</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
<span class="p">...</span>
<span class="p">}</span>
<span class="kr">thread</span> <span class="nf">t1</span><span class="p">(</span><span class="n">func1</span><span class="p">);</span>
<span class="kr">thread</span> <span class="nf">t2</span><span class="p">(</span><span class="n">worker</span><span class="p">,</span> <span class="n">data</span><span class="p">.</span><span class="n">begin</span><span class="p">()</span> <span class="o">+</span> <span class="n">i</span> <span class="o">*</span> <span class="mi">2500</span><span class="p">,</span> <span class="n">data</span><span class="p">.</span><span class="n">begin</span><span class="p">()</span> <span class="o">+</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">2500</span><span class="p">,</span> <span class="o">&</span><span class="n">partial_sums</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
<span class="n">t1</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
<span class="n">t2</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
</code></pre></div></div>
<h3 id="join함수">join함수</h3>
<p>해당하는 쓰레드들이 실행을 종료하면 리턴하는 함수</p>
<p>join, detach 되지 않는 쓰레드들의 소멸자가 호출되면 예외가 발생한다.</p>
<h3 id="뮤텍스">뮤텍스</h3>
<p>한번에 하나의 스레드만 접근 하도록 제어하는 기능을 가진 객체</p>
<p>lock을 호출한 스레드는 해당 객체의 소유권을 갖게 되고 unlock을 호출하기 전까지 다른 스레드는 lock에서 대기한다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">mutex</span> <span class="n">m</span><span class="p">;</span>
<span class="n">m</span><span class="p">.</span><span class="n">lock</span><span class="p">();</span>
<span class="c1">// critical section</span>
<span class="n">m</span><span class="p">.</span><span class="n">unlock</span><span class="p">();</span>
</code></pre></div></div>
<h3 id="lock_guard-unique_lock">lock_guard, unique_lock</h3>
<p>뮤텍스를 인자로 받아서 생성하며 생성자에서 뮤텍스를 lock한다.</p>
<p>생성한 스코프 밖으로 나가면 뮤텍스를 unlock한다.</p>
<p>lock_guard은 생성 될때만 lock이 가능하지만 unique_lock은 생성자가 아닌곳에서도 lock이 가능하다.</p>
<h3 id="데드락">데드락</h3>
<p>서로의 스레드가 상대가 필요로 하는 객체의 lock을 호출한 후 unlock을 호출하지 않아 프로그램이 종료되지 않는 현상</p>
<p>데드락을 피하기 위한 방법</p>
<ul>
<li>중첩된 Lock 을 사용하는 것을 피해라</li>
<li>Lock 을 소유하고 있을 때 유저 코드를 호출하는 것을 피해라</li>
<li>Lock 들을 언제나 정해진 순서로 획득해라</li>
</ul>
<h3 id="sleep">sleep</h3>
<p>sleep_for 함수는 인자로 전달된 시간 만큼 스레드를 sleep 시키는 함수이다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">sleep_for</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">milliseconds</span><span class="p">(</span><span class="mi">100</span> <span class="o">*</span> <span class="n">index</span><span class="p">));</span>
</code></pre></div></div>
<h3 id="condition_variable">condition_variable</h3>
<p>스레드를 특정한 조건을 만족할때 까지 재울수 있는 변수</p>
<p>wait함수를 이용하여 특정 조건까지 쓰레드를 재울 수 있다.</p>
<p>wait함수는 unique_lock을 매개변수로 받으며 조건이 참이 아니면 다른 누가 깨워주기 전까지 계속 sleep 상태로 기다리게 된다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">unique_lock</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">mutex</span><span class="o">></span> <span class="n">lk</span><span class="p">(</span><span class="o">*</span><span class="n">m</span><span class="p">);</span>
<span class="n">cv</span><span class="o">-></span><span class="n">wait</span><span class="p">(</span><span class="n">lk</span><span class="p">,</span> <span class="p">[</span><span class="o">&</span><span class="p">]</span> <span class="p">{</span> <span class="k">return</span> <span class="o">!</span><span class="n">downloaded_pages</span><span class="o">-></span><span class="n">empty</span><span class="p">()</span> <span class="o">||</span> <span class="o">*</span><span class="n">num_processed</span> <span class="o">==</span> <span class="mi">25</span><span class="p">;</span> <span class="p">});</span>
</code></pre></div></div>
<h3 id="notify-함수">notify 함수</h3>
<p>notify_one는 자고 있는 스레드 하나를 깨우는 함수</p>
<p>notify_all는 자고 있는 스레드를 모두 깨우는 함수</p>
<h3 id="atomic">atomic</h3>
<p>연산 중에 다른 스레드가 개입할 수 없는 원자적인 연산을 보장하는 객체</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include <atomic>
</span><span class="n">std</span><span class="o">::</span><span class="n">atomic</span><span class="o"><</span><span class="kt">int</span><span class="o">></span> <span class="n">counter</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</code></pre></div></div>
<h3 id="memory_order">memory_order</h3>
<p>memory_order_release와 memory_order_accquire를 이용하여 동기화를 수행 가능하다.</p>
<ul>
<li>memory_order_relexed: 메모리에서 읽거나 쓸 경우, 주위의 다른 메모리 접근들과 순서가 바뀌어도 무방</li>
</ul>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">t1</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">atomic</span><span class="o"><</span><span class="kt">int</span><span class="o">>*</span> <span class="n">a</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">atomic</span><span class="o"><</span><span class="kt">int</span><span class="o">>*</span> <span class="n">b</span><span class="p">)</span>
<span class="p">{</span>
<span class="n">b</span><span class="o">-></span><span class="n">store</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">memory_order_relaxed</span><span class="p">);</span> <span class="c1">// b = 1 (쓰기)</span>
<span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="n">a</span><span class="o">-></span><span class="n">load</span><span class="p">(</span><span class="n">memory_order_relaxed</span><span class="p">);</span> <span class="c1">// x = a (읽기)</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"x : %d </span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>
<ul>
<li>
<p>memory_order_release: 해당 명령 이전의 모든 메모리 명령들이 해당 명령 이후로 재배치 되는 것을 금지</p>
</li>
<li>
<p>memory_order_accquire: 해당 명령 뒤에 오는 모든 메모리 명령들이 해당 명령 위로 재배치 되는 것을 금지</p>
</li>
<li>
<p>memory_order_acq_rel:acquire 와 release 를 모두 수행, 읽기와 쓰기를 모두 수행하는 명령인 fetch_add 와 같은 함수에서 사용할 수 있음</p>
</li>
<li>
<p>memory_order_seq_cst: 메모리 명령의 순차적 일관성을 보장, 비싼 연산, ++와 같은 후위연산자가 이에 속한다.</p>
</li>
</ul>
<h3 id="stdpromise-stdfuture">std::promise, std::future</h3>
<p>어떤 스레드 T를 사용해서 비동기적으로 값을 받아내기 위해 사용하</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">worker</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">promise</span><span class="o"><</span><span class="n">string</span><span class="o">>*</span> <span class="n">p</span><span class="p">)</span> <span class="p">{</span>
<span class="c1">// 약속을 이행하는 모습. 해당 결과는 future 에 들어간다.</span>
<span class="n">p</span><span class="o">-></span><span class="n">set_value</span><span class="p">(</span><span class="s">"some data"</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">promise</span><span class="o"><</span><span class="n">string</span><span class="o">></span> <span class="n">p</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">future</span><span class="o"><</span><span class="n">string</span><span class="o">></span> <span class="n">data</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">get_future</span><span class="p">();</span>
<span class="n">std</span><span class="o">::</span><span class="kr">thread</span> <span class="n">t</span><span class="p">(</span><span class="n">worker</span><span class="p">,</span> <span class="o">&</span><span class="n">p</span><span class="p">);</span>
<span class="n">data</span><span class="p">.</span><span class="n">wait</span><span class="p">();</span> <span class="c1">// 데이터를 받을때 까지 기다린다.</span>
<span class="n">cout</span> <span class="o"><<</span> <span class="s">"data: "</span> <span class="o"><<</span> <span class="n">data</span><span class="p">.</span><span class="n">get</span><span class="p">()</span> <span class="o"><<</span> <span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>wait함수는 호출하지 않아도 알아서 promise가 future에 객체를 전달할 때 까지 기다린다음에 리턴한다.</p>
<p>future에서 get을 호출하면 설정된 객체가 이동되며 절대로 두 번 호출하면 안된다.</p>
<p>future는 예외도 전달 할 수 있다.</p>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">p</span><span class="o">-></span><span class="n">set_exception</span><span class="p">(</span><span class="n">current_exception</span><span class="p">());</span>
<span class="p">...</span>
<span class="k">try</span> <span class="p">{</span>
<span class="n">data</span><span class="p">.</span><span class="n">get</span><span class="p">();</span>
<span class="p">}</span> <span class="k">catch</span> <span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">exception</span><span class="o">&</span> <span class="n">e</span><span class="p">)</span> <span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"예외 : "</span> <span class="o"><<</span> <span class="n">e</span><span class="p">.</span><span class="n">what</span><span class="p">()</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>wait_for 함수는 전달된 시간 만큼 기다렸다가 future_status를 바로 리턴한다.</p>
<p>future_status는 3가지 상태를 가질 수 있다.</p>
<p>future_status::ready, future_status::timeout, future_status::deferred가 있으며 순서대로 future에 값이 설정 됬을 때 나타나는 상태, 지정한 시간이 지났지만 값이 설정되지 않아서 리턴한 상태, 결과값을 계산하는 함수가 채 실행되지 않은 상태로 구분된다.</p>
<h3 id="shared_future">shared_future</h3>
<p>여러 개의 다른 스레드에서 future를 get하기 위해 사용</p>
<h3 id="packaged_task">packaged_task</h3>
<p>packaged_task는 전달된 함수를 실행하고 그 함수의 리턴값을 promise에 설정한다.</p>
<p>스레드에 move를 이용하여 전달하면 사용할 수 있다.</p>
<p>비동기적으로 실행된 함수의 결과 값은 추후에 future의 get함수로 받을 수 있다.</p>
<h3 id="stdasync">std::async</h3>
<p>std::async에 어떤 함수를 전달하면 스레드를 알아서 만들어 해당 함수를 비동기적으로 실행하고, 그 결과값을 future에 전달한다.</p>
<p>첫번째 인자로 std::launch::async을 전달하면 함수를 바로 실행하고 결과값을 future에 전달한다.</p>
<p>첫번째 인자로 std::launch::deferred을 전달하면 get 함수가 호출될 때 함수를 실행하고 결과값을 future에 전달한다.(인자 값 생략시에도 이와 같이 작동)</p>
<p>람다함수를 이용하면 깔끔하게 사용 할 수 있다.</p>
<h2 id="유니폼-초기화uniform-initialization">유니폼 초기화(Uniform initialization)</h2>
<p><code class="language-plaintext highlighter-rouge">{}</code>을 이용하여 초기화</p>
<p>Narrow-conversion이 안되도록 지정된 형식으로만 초기화가 이루어지도록 한다.(생성자의 인자 값이 암시적인 변환이 이루어지지않는다. ex)double- > int)</p>
<p>유니폼 초기화를 이용하면 <code class="language-plaintext highlighter-rouge">std::initializer_list</code>을 인자로 받는 생성자를 호출할 수 있다.</p>
<p><code class="language-plaintext highlighter-rouge">std::initializer_list</code>는 <code class="language-plaintext highlighter-rouge">{}</code>의 안에 있는 값들을 지니고 있다.</p>
<p><code class="language-plaintext highlighter-rouge">{}</code>을 이용하여 생성할 때 auto를 타입으로 지정하면 initializer_list 객체가 생성된다.</p>
<p><code class="language-plaintext highlighter-rouge">auto list = {"a", "b", "cc"};</code>과 같이 문자열을 생성하면 initializer_list<std::string>이 아닌 initializer_list<const char*> 이 생성된다. (string 타입으로 지정하기 위해서는 리터럴 연산자를 사용하면 된다)</p>
<h2 id="constexpr">constexpr</h2>
<p>어떠한 식이 상수식 이라고 명시해주는 키워드, 컴파일 타임에 값을 지정한다.</p>
<h3 id="constexpr-함수">constexpr 함수</h3>
<p>constexpr을 함수의 리턴 타입으로 사용하면 해당 함수의 리턴 값을 컴파일 타임 상수로 만들 수 있다.</p>
<p>constexpr 함수에 인자로 컴파일 타임 상수가 아닌 값을 전달하면 그낭 일반 함수처럼 동작한다.</p>
<p>constexpr 함수 내부에서는 아래와 같은 조건에서 컴파일 타임 오류가 발생한다.</p>
<ul>
<li>goto문 사용</li>
<li>예외처리(try문, c++20부터는 예외처리 사용 가능)</li>
<li>리터럴 타입이 아닌 변수의 정의</li>
<li>초기화 되지 않는 변수의 정의</li>
<li>실행 중간에 constexpr이 아닌 함수 호출</li>
</ul>
<h3 id="constexpr-생성자">constexpr 생성자</h3>
<p>사용자가 리터럴 타입을 직접 만들 수 있게하는 생성자</p>
<p>constexpr 생성자의 인자들은 반드시 리터럴 타입이어야만 하고, 해당 클래스는 다른 클래스를 가상 상속 받을 수 없다.</p>
<h3 id="if-constexpr">if constexpr</h3>
<p>if constexpr이 참이라면 else에 해당하는 문장은 컴파일되지 않고 거짓이라면 else에 해당하는 부분만 컴파일된다.</p>
<p>if constexpr의 조건은 반드시 bool로 타입 변환 될 수 있는 컴파일 타입 상수식만 가능하다.</p>
<h2 id="참고-자료">참고 자료</h2>
<ul>
<li>모두의 코드 C++</li>
</ul>임채욱aythffk@gmail.comc++ 기본 개념 학습을 위한 정리2019 NHN Forward 창원2019-12-27T02:30:00+00:002019-12-27T02:30:00+00:00https://rockpell.github.io/NHNForward<h1 id="nhn-forward-경남-창원-후기">NHN Forward 경남 창원 후기</h1>
<p>https://forward.nhn.com/2019/gyeongnam-changwon/</p>
<p>2019년 12월 26일 오전 9시에 창원중앙역에서 컨퍼런스 장소인 그랜드 머큐어 앰배서더 호텔로 가는 셔틀버스를 타고 갔다.</p>
<p>행사 시작은 10시 반이지만 등록 선착순 400명에게 점심 식사를 제공한다고 하여 빠르게 출발하였다.</p>
<p>막상 도착하고 나니 400명이 넘지는 않아서 모든 사람이 점심 식사를 제공받았다.</p>
<p>행사는 10:30 ~ 18:00까지 진행되었는데 총 6개의 세션이 진행되었다.</p>
<p>내가 들은 세션은 대부분 스몰 스텝이라는 주로 주니어 개발자를 위한 세션을 들었다.</p>
<p>16:00까지 진행되는 총 4개의 스몰 스텝 세션을 들었고 나머지 2개의 세션은 트랙2에서 머신러닝 접목 사례와 딥러닝 관련 내용을 들었다.</p>
<p>스몰 스텝의 세션은 대체로 어떻게 성장하는지에 대한 내용이 주요 내용이었다.</p>
<p>현재 알고리즘 문제를 풀거나 공부한 내용을 정리하는 일과 같은 꾸준한 공부에 대한 내용도 있었으며</p>
<p>풀어본 알고리즘 문제를 다른 특성을 가진 언어로 다시 풀어보는 등의 공부 방법도 들을 수 있었다.</p>
<p>그 외로 깃허브를 이용한 협업이나 깃플로우 같은 내용도 있었고 NHN의 신입사원이 베이스캠프에서 배우는 것에 관한 내용도 있었다.</p>
<p>대체로 알고 있던 내용이거나 기존에 접했던 내용이 많긴 했지만, 현업 개발자에게 이 내용을 들으니 새롭게 다가왔다.</p>
<p>스몰 스텝의 마지막 세션은 React를 1시간 동안 간략하게 알려주는 세션이었다.</p>
<p>예전에 React가 무엇인지 궁금하여 다른 프레임워크랑 뭐가 다른지와 장점이 뭔지 정도는 알아본 적이 있었다.</p>
<p>그래서 모르는 내용도 있었고 세션의 발표를 보고 나니 재미있겠다는 생각이 들어 React를 제대로 공부해보고 싶어졌다. (C++ 학습을 끝내고 다음 목표로 삼아야겠다)</p>
<p>딥러닝 관련 세션은 학과 수업 시간에 배웠던 딥러닝의 기초적인 이론이었으며 배운 이후로 사용하지 않았기에 까먹어 가던 차에 다시 떠올리는 리마인드를 할 수 있었다.</p>
<h2 id="총평">총평</h2>
<p>전체적으로 만족스러웠다.</p>
<p>다음에도 참가할 수 있다면 참가하고 싶다.</p>
<p>다음에는 스몰 스텝과 같은 내용의 주니어 개발자를 위한 세션보다는 좀 더 기술적인 내용의 세션을 들을 수 있도록 성장해야겠다는 생각이 들었다.</p>
<p>무엇보다 호텔에서 제공하는 점심과 쿠키가 맛있었다.</p>임채욱aythffk@gmail.comNHN Forward 경남 창원 후기다익스트라2019-12-19T18:00:00+00:002019-12-19T18:00:00+00:00https://rockpell.github.io/%EB%8B%A4%EC%9D%B5%EC%8A%A4%ED%8A%B8%EB%9D%BC<h1 id="다익스트라">다익스트라</h1>
<p>참고사이트: [https://hsp1116.tistory.com/42]</p>
<h3 id="배열을-이용한-다익스트라java">배열을 이용한 다익스트라(JAVA)</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">class</span> <span class="nc">Graph</span><span class="o">{</span>
<span class="kt">boolean</span><span class="o">[]</span> <span class="n">visited</span><span class="o">;</span>
<span class="kt">int</span><span class="o">[]</span> <span class="n">dist</span><span class="o">;</span>
<span class="kt">int</span><span class="o">[][]</span> <span class="n">vertex</span><span class="o">;</span>
<span class="kt">int</span> <span class="no">N</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">Graph</span><span class="o">(</span><span class="kt">int</span> <span class="no">N</span><span class="o">){</span>
<span class="k">this</span><span class="o">.</span><span class="na">N</span> <span class="o">=</span> <span class="no">N</span><span class="o">;</span>
<span class="n">visited</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">boolean</span><span class="o">[</span><span class="no">N</span><span class="o">];</span>
<span class="n">dist</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="no">N</span><span class="o">];</span>
<span class="n">vertex</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="no">N</span><span class="o">][</span><span class="no">N</span><span class="o">];</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">dist</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span>
<span class="n">dist</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">MAX_VALUE</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">setStartVertex</span><span class="o">(</span><span class="kt">int</span> <span class="n">index</span><span class="o">){</span>
<span class="n">visited</span><span class="o">[</span><span class="n">index</span><span class="o">]</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span> <span class="c1">// 시작 정점 지정</span>
<span class="n">dist</span><span class="o">[</span><span class="n">index</span><span class="o">]</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">inputVertexs</span><span class="o">(</span><span class="kt">int</span><span class="o">[][]</span> <span class="n">road</span><span class="o">){</span>
<span class="kt">int</span> <span class="n">u</span><span class="o">,</span> <span class="n">v</span><span class="o">;</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">road</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++){</span> <span class="c1">// 입력값 저장</span>
<span class="n">u</span> <span class="o">=</span> <span class="n">road</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">0</span><span class="o">]</span> <span class="o">-</span> <span class="mi">1</span><span class="o">;</span>
<span class="n">v</span> <span class="o">=</span> <span class="n">road</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">1</span><span class="o">]</span> <span class="o">-</span> <span class="mi">1</span><span class="o">;</span>
<span class="k">if</span><span class="o">(</span><span class="n">vertex</span><span class="o">[</span><span class="n">u</span><span class="o">][</span><span class="n">v</span><span class="o">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">){</span> <span class="c1">// 같은 연결의 새로운 입력이 들어올시 거리가 더 짧은 것을 저장</span>
<span class="k">if</span><span class="o">(</span><span class="n">vertex</span><span class="o">[</span><span class="n">u</span><span class="o">][</span><span class="n">v</span><span class="o">]</span> <span class="o">></span> <span class="n">road</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">2</span><span class="o">]){</span>
<span class="n">vertex</span><span class="o">[</span><span class="n">u</span><span class="o">][</span><span class="n">v</span><span class="o">]</span> <span class="o">=</span> <span class="n">road</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">2</span><span class="o">];</span>
<span class="n">vertex</span><span class="o">[</span><span class="n">v</span><span class="o">][</span><span class="n">u</span><span class="o">]</span> <span class="o">=</span> <span class="n">road</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">2</span><span class="o">];</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">else</span><span class="o">{</span>
<span class="n">vertex</span><span class="o">[</span><span class="n">u</span><span class="o">][</span><span class="n">v</span><span class="o">]</span> <span class="o">=</span> <span class="n">road</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">2</span><span class="o">];</span>
<span class="n">vertex</span><span class="o">[</span><span class="n">v</span><span class="o">][</span><span class="n">u</span><span class="o">]</span> <span class="o">=</span> <span class="n">road</span><span class="o">[</span><span class="n">i</span><span class="o">][</span><span class="mi">2</span><span class="o">];</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span><span class="o">[]</span> <span class="nf">dijkstra</span><span class="o">(){</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="no">N</span> <span class="o">-</span> <span class="mi">1</span><span class="o">;</span> <span class="n">i</span><span class="o">++){</span>
<span class="kt">int</span> <span class="n">minValue</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">MAX_VALUE</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">minIndex</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">p</span> <span class="o"><</span> <span class="no">N</span><span class="o">;</span> <span class="n">p</span><span class="o">++){</span> <span class="c1">// 방문 안한 노드 중 최소값 찾기</span>
<span class="k">if</span><span class="o">(!</span><span class="n">visited</span><span class="o">[</span><span class="n">p</span><span class="o">]){</span>
<span class="k">if</span><span class="o">(</span><span class="n">dist</span><span class="o">[</span><span class="n">p</span><span class="o">]</span> <span class="o"><</span> <span class="n">minValue</span><span class="o">){</span>
<span class="n">minIndex</span> <span class="o">=</span> <span class="n">p</span><span class="o">;</span>
<span class="n">minValue</span> <span class="o">=</span> <span class="n">dist</span><span class="o">[</span><span class="n">p</span><span class="o">];</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="n">visited</span><span class="o">[</span><span class="n">minIndex</span><span class="o">]</span> <span class="o">=</span> <span class="kc">true</span><span class="o">;</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">p</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">p</span> <span class="o"><</span> <span class="no">N</span><span class="o">;</span> <span class="n">p</span><span class="o">++){</span> <span class="c1">// 인점 정점 중 가장 짧은 경로 찾기</span>
<span class="k">if</span><span class="o">(</span><span class="n">vertex</span><span class="o">[</span><span class="n">minIndex</span><span class="o">][</span><span class="n">p</span><span class="o">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">){</span>
<span class="k">if</span><span class="o">(</span><span class="n">dist</span><span class="o">[</span><span class="n">p</span><span class="o">]</span> <span class="o">></span> <span class="n">dist</span><span class="o">[</span><span class="n">minIndex</span><span class="o">]</span> <span class="o">+</span> <span class="n">vertex</span><span class="o">[</span><span class="n">minIndex</span><span class="o">][</span><span class="n">p</span><span class="o">])</span>
<span class="n">dist</span><span class="o">[</span><span class="n">p</span><span class="o">]</span> <span class="o">=</span> <span class="n">dist</span><span class="o">[</span><span class="n">minIndex</span><span class="o">]</span> <span class="o">+</span> <span class="n">vertex</span><span class="o">[</span><span class="n">minIndex</span><span class="o">][</span><span class="n">p</span><span class="o">];</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">dist</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="우선순위-큐를-이용한-다익스트라java">우선순위 큐를 이용한 다익스트라(JAVA)</h3>
<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">java.util.*</span><span class="o">;</span>
<span class="kd">public</span> <span class="kd">class</span> <span class="nc">Main</span> <span class="o">{</span>
<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span> <span class="n">args</span><span class="o">[])</span> <span class="kd">throws</span> <span class="nc">Exception</span> <span class="o">{</span>
<span class="nc">Graph</span> <span class="n">graph</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Graph</span><span class="o">(</span><span class="mi">6</span><span class="o">);</span>
<span class="n">graph</span><span class="o">.</span><span class="na">inputVertex</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="n">graph</span><span class="o">.</span><span class="na">inputVertex</span><span class="o">(</span><span class="mi">1</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">2</span><span class="o">);</span>
<span class="n">graph</span><span class="o">.</span><span class="na">inputVertex</span><span class="o">(</span><span class="mi">2</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">2</span><span class="o">);</span>
<span class="n">graph</span><span class="o">.</span><span class="na">inputVertex</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
<span class="n">graph</span><span class="o">.</span><span class="na">inputVertex</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="mi">2</span><span class="o">);</span>
<span class="n">graph</span><span class="o">.</span><span class="na">inputVertex</span><span class="o">(</span><span class="mi">3</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
<span class="n">graph</span><span class="o">.</span><span class="na">inputVertex</span><span class="o">(</span><span class="mi">5</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
<span class="kt">int</span><span class="o">[]</span> <span class="n">dist</span> <span class="o">=</span> <span class="n">graph</span><span class="o">.</span><span class="na">dijkstra</span><span class="o">(</span><span class="mi">1</span><span class="o">);</span>
<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">dist</span><span class="o">);</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">class</span> <span class="nc">Adjacent</span> <span class="kd">implements</span> <span class="nc">Comparable</span><span class="o"><</span><span class="nc">Adjacent</span><span class="o">>{</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="n">index</span><span class="o">;</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="n">weight</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">Adjacent</span><span class="o">(</span><span class="kt">int</span> <span class="n">index</span><span class="o">,</span> <span class="kt">int</span> <span class="n">weight</span><span class="o">){</span>
<span class="k">this</span><span class="o">.</span><span class="na">index</span> <span class="o">=</span> <span class="n">index</span><span class="o">;</span>
<span class="k">this</span><span class="o">.</span><span class="na">weight</span> <span class="o">=</span> <span class="n">weight</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span> <span class="nf">compareTo</span><span class="o">(</span><span class="nc">Adjacent</span> <span class="n">target</span><span class="o">){</span>
<span class="k">return</span> <span class="k">this</span><span class="o">.</span><span class="na">weight</span> <span class="o">></span> <span class="n">target</span><span class="o">.</span><span class="na">weight</span> <span class="o">?</span> <span class="mi">1</span> <span class="o">:</span> <span class="o">-</span> <span class="mi">1</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="kd">class</span> <span class="nc">Graph</span><span class="o">{</span>
<span class="kd">private</span> <span class="kt">int</span><span class="o">[]</span> <span class="n">dist</span><span class="o">;</span>
<span class="kd">private</span> <span class="kt">int</span> <span class="no">N</span><span class="o">;</span>
<span class="kd">private</span> <span class="nc">ArrayList</span><span class="o"><</span><span class="nc">Adjacent</span><span class="o">>[]</span> <span class="n">adjs</span><span class="o">;</span>
<span class="kd">private</span> <span class="nc">PriorityQueue</span><span class="o"><</span><span class="nc">Adjacent</span><span class="o">></span> <span class="n">priorityQueue</span><span class="o">;</span>
<span class="kd">public</span> <span class="nf">Graph</span><span class="o">(</span><span class="kt">int</span> <span class="no">N</span><span class="o">){</span>
<span class="k">this</span><span class="o">.</span><span class="na">N</span> <span class="o">=</span> <span class="no">N</span><span class="o">;</span>
<span class="n">dist</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="no">N</span><span class="o">];</span>
<span class="n">adjs</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o">[</span><span class="no">N</span><span class="o">];</span>
<span class="n">priorityQueue</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">PriorityQueue</span><span class="o"><>();</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">dist</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span>
<span class="n">dist</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="nc">Integer</span><span class="o">.</span><span class="na">MAX_VALUE</span><span class="o">;</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">void</span> <span class="nf">inputVertex</span><span class="o">(</span><span class="kt">int</span> <span class="n">index</span><span class="o">,</span> <span class="kt">int</span> <span class="n">to</span><span class="o">,</span> <span class="kt">int</span> <span class="n">weight</span><span class="o">){</span>
<span class="k">if</span><span class="o">(</span><span class="n">adjs</span><span class="o">[</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span><span class="o">]</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span>
<span class="n">adjs</span><span class="o">[</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o"><>();</span>
<span class="n">adjs</span><span class="o">[</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span><span class="o">].</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nc">Adjacent</span><span class="o">(</span><span class="n">to</span> <span class="o">-</span> <span class="mi">1</span><span class="o">,</span> <span class="n">weight</span><span class="o">));</span>
<span class="k">if</span><span class="o">(</span><span class="n">adjs</span><span class="o">[</span><span class="n">to</span> <span class="o">-</span> <span class="mi">1</span><span class="o">]</span> <span class="o">==</span> <span class="kc">null</span><span class="o">)</span>
<span class="n">adjs</span><span class="o">[</span><span class="n">to</span> <span class="o">-</span> <span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">ArrayList</span><span class="o"><>();</span>
<span class="n">adjs</span><span class="o">[</span><span class="n">to</span> <span class="o">-</span> <span class="mi">1</span><span class="o">].</span><span class="na">add</span><span class="o">(</span><span class="k">new</span> <span class="nc">Adjacent</span><span class="o">(</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span><span class="o">,</span> <span class="n">weight</span><span class="o">));</span>
<span class="o">}</span>
<span class="kd">public</span> <span class="kt">int</span><span class="o">[]</span> <span class="nf">dijkstra</span><span class="o">(</span><span class="kt">int</span> <span class="n">start</span><span class="o">){</span>
<span class="n">dist</span><span class="o">[</span><span class="n">start</span> <span class="o">-</span> <span class="mi">1</span><span class="o">]</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="n">priorityQueue</span><span class="o">.</span><span class="na">offer</span><span class="o">(</span><span class="k">new</span> <span class="nc">Adjacent</span><span class="o">(</span><span class="n">start</span> <span class="o">-</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">0</span><span class="o">));</span>
<span class="k">while</span><span class="o">(!</span><span class="n">priorityQueue</span><span class="o">.</span><span class="na">isEmpty</span><span class="o">()){</span>
<span class="kt">int</span> <span class="n">cost</span> <span class="o">=</span> <span class="n">priorityQueue</span><span class="o">.</span><span class="na">peek</span><span class="o">().</span><span class="na">weight</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">index</span> <span class="o">=</span> <span class="n">priorityQueue</span><span class="o">.</span><span class="na">peek</span><span class="o">().</span><span class="na">index</span><span class="o">;</span>
<span class="n">priorityQueue</span><span class="o">.</span><span class="na">poll</span><span class="o">();</span>
<span class="k">if</span><span class="o">(</span><span class="n">dist</span><span class="o">[</span><span class="n">index</span><span class="o">]</span> <span class="o"><</span> <span class="n">cost</span><span class="o">)</span> <span class="c1">// 방문할 정점의 비용이 현재 찾은 경로보다 크다면 방문하지 않음</span>
<span class="k">continue</span><span class="o">;</span>
<span class="k">for</span><span class="o">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">adjs</span><span class="o">[</span><span class="n">index</span><span class="o">].</span><span class="na">size</span><span class="o">();</span> <span class="n">i</span><span class="o">++){</span> <span class="c1">// 인접 정점 중 현재 찾은 경로보다 짧은 경로 찾기</span>
<span class="kt">int</span> <span class="n">targetIndex</span> <span class="o">=</span> <span class="n">adjs</span><span class="o">[</span><span class="n">index</span><span class="o">].</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">index</span><span class="o">;</span>
<span class="kt">int</span> <span class="n">targetDist</span> <span class="o">=</span> <span class="n">cost</span> <span class="o">+</span> <span class="n">adjs</span><span class="o">[</span><span class="n">index</span><span class="o">].</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">).</span><span class="na">weight</span><span class="o">;</span>
<span class="k">if</span><span class="o">(</span><span class="n">dist</span><span class="o">[</span><span class="n">targetIndex</span><span class="o">]</span> <span class="o">></span> <span class="n">targetDist</span><span class="o">){</span>
<span class="n">dist</span><span class="o">[</span><span class="n">targetIndex</span><span class="o">]</span> <span class="o">=</span> <span class="n">targetDist</span><span class="o">;</span>
<span class="n">priorityQueue</span><span class="o">.</span><span class="na">offer</span><span class="o">(</span><span class="k">new</span> <span class="nc">Adjacent</span><span class="o">(</span><span class="n">targetIndex</span><span class="o">,</span> <span class="n">targetDist</span><span class="o">));</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="o">}</span>
<span class="k">return</span> <span class="n">dist</span><span class="o">;</span>
<span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>
<h3 id="우선순위-큐를-이용한-다익스트라c">우선순위 큐를 이용한 다익스트라(C++)</h3>
<div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
</span>
<span class="k">class</span> <span class="nc">Graph</span><span class="p">{</span>
<span class="nl">private:</span>
<span class="n">std</span><span class="o">::</span><span class="n">priority_queue</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o"><</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">></span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o"><</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">>></span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">greater</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o"><</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">>>></span> <span class="n">priorityQueue</span><span class="p">;</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o"><</span><span class="kt">int</span><span class="p">,</span> <span class="kt">int</span><span class="o">>>></span> <span class="n">adj</span><span class="p">;</span> <span class="c1">// pair에는 가중치, 연결된 정점 번호 순으로 저장</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span> <span class="n">dist</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">N</span><span class="p">;</span>
<span class="k">const</span> <span class="kt">int</span> <span class="n">maxValue</span> <span class="o">=</span> <span class="mi">2100000000</span><span class="p">;</span>
<span class="nl">public:</span>
<span class="n">Graph</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
<span class="k">this</span><span class="o">-></span><span class="n">N</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
<span class="n">dist</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">n</span><span class="p">,</span> <span class="n">maxValue</span><span class="p">);</span>
<span class="n">adj</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
<span class="p">}</span>
<span class="kt">void</span> <span class="n">inputVertex</span><span class="p">(</span><span class="kt">int</span> <span class="n">index</span><span class="p">,</span> <span class="kt">int</span> <span class="n">to</span><span class="p">,</span> <span class="kt">int</span> <span class="n">weight</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span> <span class="n">dijkstra</span><span class="p">(</span><span class="kt">int</span> <span class="n">start</span><span class="p">);</span>
<span class="p">};</span>
<span class="kt">void</span> <span class="n">Graph</span><span class="o">::</span><span class="n">inputVertex</span><span class="p">(</span><span class="kt">int</span> <span class="n">index</span><span class="p">,</span> <span class="kt">int</span> <span class="n">to</span><span class="p">,</span> <span class="kt">int</span> <span class="n">weight</span><span class="p">){</span>
<span class="n">adj</span><span class="p">[</span><span class="n">index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_pair</span><span class="p">(</span><span class="n">weight</span><span class="p">,</span> <span class="n">to</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
<span class="n">adj</span><span class="p">[</span><span class="n">to</span> <span class="o">-</span> <span class="mi">1</span><span class="p">].</span><span class="n">push_back</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_pair</span><span class="p">(</span><span class="n">weight</span><span class="p">,</span> <span class="n">index</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
<span class="p">}</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span> <span class="n">Graph</span><span class="o">::</span><span class="n">dijkstra</span><span class="p">(</span><span class="kt">int</span> <span class="n">start</span><span class="p">){</span>
<span class="n">dist</span><span class="p">[</span><span class="n">start</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="c1">// 출발지점은 거리가 0</span>
<span class="n">priorityQueue</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_pair</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">start</span> <span class="o">-</span> <span class="mi">1</span><span class="p">));</span>
<span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">priorityQueue</span><span class="p">.</span><span class="n">empty</span><span class="p">()){</span>
<span class="kt">int</span> <span class="n">cost</span> <span class="o">=</span> <span class="n">priorityQueue</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">first</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">index</span> <span class="o">=</span> <span class="n">priorityQueue</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">second</span><span class="p">;</span>
<span class="n">priorityQueue</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
<span class="k">if</span> <span class="p">(</span><span class="n">dist</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o"><</span> <span class="n">cost</span><span class="p">)</span> <span class="c1">// 방문할 정점의 비용이 현재 찾은 경로보다 크다면 방문하지 않음</span>
<span class="k">continue</span><span class="p">;</span>
<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o"><</span> <span class="n">adj</span><span class="p">[</span><span class="n">index</span><span class="p">].</span><span class="n">size</span><span class="p">();</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span> <span class="c1">// 인접 정점 중 현재 찾은 경로보다 짧은 경로 찾기</span>
<span class="kt">int</span> <span class="n">targetIndex</span> <span class="o">=</span> <span class="n">adj</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">second</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">targetDist</span> <span class="o">=</span> <span class="n">cost</span> <span class="o">+</span> <span class="n">adj</span><span class="p">[</span><span class="n">index</span><span class="p">][</span><span class="n">i</span><span class="p">].</span><span class="n">first</span><span class="p">;</span>
<span class="k">if</span><span class="p">(</span><span class="n">dist</span><span class="p">[</span><span class="n">targetIndex</span><span class="p">]</span> <span class="o">></span> <span class="n">targetDist</span><span class="p">){</span>
<span class="n">dist</span><span class="p">[</span><span class="n">targetIndex</span><span class="p">]</span> <span class="o">=</span> <span class="n">targetDist</span><span class="p">;</span>
<span class="n">priorityQueue</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">make_pair</span><span class="p">(</span><span class="n">targetIndex</span><span class="p">,</span> <span class="n">targetDist</span><span class="p">));</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="p">}</span>
<span class="k">return</span> <span class="n">dist</span><span class="p">;</span>
<span class="p">}</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(){</span>
<span class="n">Graph</span> <span class="n">graph</span><span class="p">(</span><span class="mi">6</span><span class="p">);</span>
<span class="n">graph</span><span class="p">.</span><span class="n">inputVertex</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="n">graph</span><span class="p">.</span><span class="n">inputVertex</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
<span class="n">graph</span><span class="p">.</span><span class="n">inputVertex</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
<span class="n">graph</span><span class="p">.</span><span class="n">inputVertex</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
<span class="n">graph</span><span class="p">.</span><span class="n">inputVertex</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
<span class="n">graph</span><span class="p">.</span><span class="n">inputVertex</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
<span class="n">graph</span><span class="p">.</span><span class="n">inputVertex</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o"><</span><span class="kt">int</span><span class="o">></span> <span class="n">dist</span> <span class="o">=</span> <span class="n">graph</span><span class="p">.</span><span class="n">dijkstra</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="k">for</span><span class="p">(</span><span class="k">auto</span><span class="o">&</span> <span class="n">itr</span> <span class="o">:</span> <span class="n">dist</span><span class="p">){</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="n">itr</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>임채욱aythffk@gmail.com다익스트라