<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jodbsgh</title>
        <link>https://velog.io/</link>
        <description>어제 보다는 내일을, 내일 보다는 오늘을 🚀</description>
        <lastBuildDate>Tue, 24 Oct 2023 00:39:47 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>jodbsgh</title>
            <url>https://images.velog.io/images/jo_dbsgh95/profile/70322d5b-8260-4130-a372-36c072fee937/KakaoTalk_20220318_132137047 (3).jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. jodbsgh. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jo_dbsgh95" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Excel 1일]]></title>
            <link>https://velog.io/@jo_dbsgh95/Excel-1%EC%9D%BC</link>
            <guid>https://velog.io/@jo_dbsgh95/Excel-1%EC%9D%BC</guid>
            <pubDate>Tue, 24 Oct 2023 00:39:47 GMT</pubDate>
            <description><![CDATA[<h3 id="✔날짜-정보-가져오기">✔날짜 정보 가져오기</h3>
<p>&quot;ctrl + ;&quot;</p>
<h3 id="✔시간-정보-가져오기">✔시간 정보 가져오기</h3>
<p>&quot;ctrl + :&quot;</p>
<h3 id="✔엑셀-수식-onoff">✔엑셀 수식 On/Off</h3>
<p>&quot;ctrl + `&quot; (숫자  1 옆, Tab 위에 있는 키)</p>
<h3 id="✔시트간-이동하기">✔시트간 이동하기</h3>
<p>방법 1. 이미지의 화살표부분에 커서를 올리고 오른쪽 마우스
방법 2. &quot;ctrl + PgUp&quot; 또는 &quot;ctrl + PgDn&quot; 을 통해 한 칸씩 이동
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/4bfbfb00-96d7-41f8-a8a4-9483b1b7d7f5/image.png" alt=""></p>
<h3 id="✔셀-빈칸-선택">✔셀 빈칸 선택</h3>
<p>1단계. &quot;ctrl + A&quot; 또는 &quot;ctrl + Shift + *&quot;키를 이용하여 범위를 지정한다.
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/4712d64f-9105-4c4d-bdd0-512e9764fc9b/image.png" alt="">
2단계. &quot;F5 + 옵션버튼&quot;을 누른다. 이후 이동옵션 창에서 빈 셀을 체크 후 확인하면 빈셀만 선택된다.
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/ab72f91d-fb4e-4c2e-b67c-abceef842164/image.png" alt="">
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/ec4d832e-905b-4b1a-8ae6-4efdbcde9313/image.png" alt=""></p>
<h3 id="✔빈셀에-동일-데이터-복사하기">✔빈셀에 동일 데이터 복사하기</h3>
<p>빈셀만 선택된 상태에서 &quot;=&quot;를 입력하고 방향키 중 위쪽화살표를 누르면 빈 셀의 위에 있는 정보가 들어온다.
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/f5797757-809d-44c7-9eb0-baa95998aeae/image.png" alt="">
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/6773f158-96af-40b4-b6e9-afce1ee11845/image.png" alt=""></p>
<h3 id="✔모든-빈셀에-적용하는-방법">✔모든 빈셀에 적용하는 방법</h3>
<p>이렇게 한 데이터가 복사된 상태에서 &quot;Ctrl&quot;키를 누르고 있는 상태에서 Enter를 누르면 빈 셀이 모두 채워지게 된다.
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/f5797757-809d-44c7-9eb0-baa95998aeae/image.png" alt="">
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/4d2149c1-5f4b-4018-836b-11b797bbf8c7/image.png" alt=""></p>
<h3 id="✔sumif-함수">✔SUMIF 함수</h3>
<p>SUMIF 함수는 조건을 만족하는 범위의 합계를 구할 때 사용한다.
&quot;만약(IF) 어떤 조건을 만족하면 SUM하라&quot;는 의미이다.
이 함수는 자료에서 특정 조건을 만족하는 범위의 숫자 합계를 구해야 할 때 많이 사용된다.</p>
<blockquote>
<p>SUMIF(range, criteria,[sum_range])
SUMIF(조건범위, 조건, [합계범위])</p>
</blockquote>
<ul>
<li>range : 조건을 적용할 셀</li>
<li>criteria : 합계를 구할 조건</li>
<li>sum_range : 합계를 구할 범위(생략 가능)</li>
</ul>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/c919907c-a015-4037-afd7-7c0b17674af3/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/c5165be6-40a5-4ad6-ae9f-3743d67a3747/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Excel 공부]]></title>
            <link>https://velog.io/@jo_dbsgh95/Excel-%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@jo_dbsgh95/Excel-%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Tue, 24 Oct 2023 00:19:26 GMT</pubDate>
            <description><![CDATA[<p><a href="http://www.iexceller.com/MyXls/Excel/Excel_01.asp#google_vignette">아이엑셀러 닷컴</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[공부]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EA%B3%B5%EB%B6%80</link>
            <guid>https://velog.io/@jo_dbsgh95/%EA%B3%B5%EB%B6%80</guid>
            <pubDate>Fri, 20 Oct 2023 06:43:40 GMT</pubDate>
            <description><![CDATA[<p><a href="https://github.com/esperar/estudy">공부깃모음</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML5 - 시맨틱 요소와 검색 엔진]]></title>
            <link>https://velog.io/@jo_dbsgh95/HTML5-%EC%8B%9C%EB%A7%A8%ED%8B%B1-%EC%9A%94%EC%86%8C%EC%99%80-%EA%B2%80%EC%83%89-%EC%97%94%EC%A7%84</link>
            <guid>https://velog.io/@jo_dbsgh95/HTML5-%EC%8B%9C%EB%A7%A8%ED%8B%B1-%EC%9A%94%EC%86%8C%EC%99%80-%EA%B2%80%EC%83%89-%EC%97%94%EC%A7%84</guid>
            <pubDate>Wed, 11 Oct 2023 01:41:44 GMT</pubDate>
            <description><![CDATA[<h2 id="시맨틱-웹semantic-web">시맨틱 웹(Semantic Web)</h2>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/9c4598e9-1ac2-47fd-aafd-d27df79cbe28/image.png" alt="">
대부분의 인터넷 사용자는 원하는 정보를 얻기 위해 Google이나 Naver와 같은 검색사이트를 이용한다. 웹사이트는 검색엔진에의 노출이 매우 중요하다. 검색엔진에 노출되지 않는 웹사이트에는 접속하는 이도 없기 때문이다.</p>
<p>SEO(검색엔진 최적화: Search Engine Optimization)과 같은 마케팅 도구를 사용하여 검색엔진이 본인의 웹사이트를 검색하기 알맞은 구조로 웹사이트를 조정하기도 한다. 이것은 기본적으로 검색엔진이 웹사이트 정보를 어떻게 수집하는지 아는 것으로 부터 시작된다.</p>
<p>검색엔진은 로봇(Robot)이라는 프로그램을 이용해 매일 전세계의 웹사이트 정보를 수집한다.
(이것을 <span style="background-color: rgba(242,179,188,0.5)">크롤링</span>이라 하며 검색엔진의 <span style="background-color: rgba(242,179,188,0.5)">크롤러</span>가 이를 수행한다.) 그리고 검색 사이트 이용자가 검색할 만한 키워드를 미리 예상하여 검색 키워드에 대응하는 인덱스(색인)을 만들어 둔다. (이것을 <span style="background-color: rgba(242,179,188,0.5)">인덱싱</span>이라 하며 검색엔진의 인덱서가 이를 수행한다.)</p>
<p>인덱스를 생성할 때 사용되는 정보는 검색 로봇이 수집한 정보인데 결국 웹사이트의 HTML코드다. 즉, 검색 엔진은 HTML 코드 만으로 그 의미를 인지하여야 하는데 이 때 <span style="background-color: rgba(242,179,188,0.5)">시맨틱 요소(Sementic element)</span>를 해석하게 된다.</p>
<p>HTML으로 작성된 문서는 컴퓨터가 해석할 수 있는 메타데이터와 사람이 사용하는 자연어 문장이 뒤섞여 있다. 아래 코드를 보면 1행과 2행은 브라우저에서 동일한 외형을 갖는다. 이는 h1태그의 디폴트 스타일이 1행과 같기 때문이다.</p>
<pre><code class="language-html">&lt;font size=&quot;6&quot;&gt;&lt;b&gt;Hello&lt;/b&gt;&lt;/font&gt;
&lt;h1&gt;Hello&lt;/h1&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/a88108c9-50f6-429a-919c-2787a130093c/image.png" alt=""></p>
<p>그러나 1행의 요소는 의미론적으로 어떤 의미도 가지고 있지 않다. 즉, 의도가 명확하지 않다. 개발자가 의도한 요소의 의미를 명확하게 나타내지 않고 다만 폰트 크기와 볼드체를 지정하는 메타데이터만을 브라우저에게 알리고 있다.</p>
<p><span style="background-color: rgba(242,179,188,0.5)">그러나 2행의 요소는 header(제목) 중 가장 상위 레벨이라는 의미를 내포하고 있어서 개발자가 의도한 요소의 의미가 명확히 드러나고 있다. 이것은 코드의 가독성을 높이고 유지보수를 쉽게한다.
</span>
검색엔진은 대체로 h1 요소 내의 콘텐츠를 웹문서의 중요한 제목으로 인식하고 인덱스에 포함시킬 확률이 높다. 또한 사람도 h1 요소 내의 콘텐츠가 제목임을 인식할 수 있다. 시맨틱 요소로 구성되어 있는 웹페이지는 검색엔진에 보다 의미론적으로 문서 정보를 전달할 수 있고 검색엔진 또한 시맨틱 요소를 이용하여 보다 효과적인 크롤링과 인덱싱이 가능해졌다. </p>
<p>즉, 시맨틱 태그란 브라우저, 검색엔진, 개발자 모두에게 콘텐츠의 의미를 명확히 설명하는 역할을 한다. 시맨틱 태그에 의해 컴퓨터가 HTML요소의 의미를 보다 명확히 해석하고 그 데이터를 활용할 수 있는 시맨틱 웹이 실현될 수 있다.</p>
<p>시맨틱 웹이란 웹에 존재하는 수많은 웹페이지들에 메타데이터(Metadata)를 부여하여, 기존의 잡다한 데이터 집합이었던 웹페이지를 &#39;의미&#39;와 &#39;관련성&#39;을 가지는 거대한 데이터베이스로 구축하고자 하는 발상이다.</p>
<h3 id="html-요소">HTML 요소</h3>
<pre><code>non-semantic 요소
div, span 등이 있으며 이들 태그는 content에 대하여 어떤 설명도 하지 않는다.

semantic 요소
form, table, img 등이 있으며 이들 태그는 content의 의미를 명확히 설명한다,</code></pre><h3 id="html5에서-새롭게-추가된-시맨틱-태그">HTML5에서 새롭게 추가된 시맨틱 태그</h3>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/e1f354cc-f932-4349-9d2e-5f0181ab303c/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[HTML5 - HTML5 기본문법]]></title>
            <link>https://velog.io/@jo_dbsgh95/HTML5-HTML5-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95</link>
            <guid>https://velog.io/@jo_dbsgh95/HTML5-HTML5-%EA%B8%B0%EB%B3%B8%EB%AC%B8%EB%B2%95</guid>
            <pubDate>Wed, 11 Oct 2023 00:40:01 GMT</pubDate>
            <description><![CDATA[<p>HTML(HyperText Markup Language)은 웹 페이지를 기술하기 위한 마크업 언어입니다.
웹페이지의 내용(content)과 구조(structure)을 담당하는 언어로써 HTML 태그를 통해 정보를 구조화합니다.</p>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/2da516c4-9b4b-412a-9089-a189fb10ff2e/image.png" alt=""></p>
<h2 id="html5">HTML5</h2>
<ul>
<li>HTML5 문서는 반드시 <code>&lt;!DOCTYPE html&gt;</code>으로 시작하여 문서 형식(document type)을 HTML5로 지정.</li>
<li>문서 형식 선언 후 HTML document는 2행의 <code>&lt;html&gt;</code>과 <code>&lt;/html&gt;</code>사이에 기술한다.</li>
<li><code>&lt;head&gt;</code>와 <code>&lt;/head&gt;</code> 사이에는 document title, 외부 파일의 참조, 메타데이터의 설정 등이 위치하며 이 정보들은 브라우저에 표시되지 않는다.</li>
<li>웹 브라우저에 출력되는 모든 요소는 <code>&lt;body&gt;</code>와 <code>&lt;/body&gt;</code> 사이에 위치한다.</li>
</ul>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
    &lt;title&gt;Hello World&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;Hello World&lt;/h1&gt;
    &lt;p&gt;안녕하세요! HTML5&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/619f5759-8948-4d15-8db0-1ea1316345b5/image.png" alt=""></p>
<p>HTML document는 .html 확장자를 갖는 순수한 텍스트 파일이다. 따라서 메모장 등으로 편집할 수 있으나 다양한 편의 기능을 제공하는 editor 또는 IDE(Integrated Development Environment)를 사용하는 것이 일반적이다. 
ex) <a href="https://code.visualstudio.com/">Visual Studio Code</a></p>
<h2 id="html5의-기본-문법">HTML5의 기본 문법</h2>
<p>HTML요소는 시작 태그(start tag)와 종료 태그(end tag) 그리고 태그 사이에 위치한 content로 구성된다.
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/aea10c75-ed0e-422e-b7d3-090c1a466698/image.png" alt=""></p>
<p>HTML document는 요소(Element)들의 집합으로 이루어진다.</p>
<p>태그는 대소문자를 구별하지 않으나 <a href="https://www.w3.org/">W3C: World Wide Web Consortium</a> 에서는 HTML4의 경우 소문자를 추천하고 있으므로 HTML5에서도 소문자를 사용하는 것이 일반적이다.</p>
<h3 id="요소의-중첩nested-element">요소의 중첩(Nested Element)</h3>
<p>요소는 중첩될 수 있다. 즉, 요소는 다른 요소를 포함할 수 있다. 이 때 부자관계가 성립된다. 이러한 부자관계로 정보를 구조화하는 것이다.</p>
<pre><code class="language-html">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;utf-8&quot;&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;h1&gt;안녕하세요&lt;/h1&gt;
    &lt;p&gt;반갑습니다!&lt;/p&gt;
  &lt;/body&gt;
&lt;/html&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/00f11475-e316-4a8e-b299-57b23798a908/image.png" alt=""></p>
<p>html 요소는 웹페이지를 구성하는 모든 요소들을 포함한다. 위 예제를 보면 html 요소는 body 요소를 포함하며 body요소는 h1,p요소를 포함한다. 이 중첩관계(부자관계)로 웹페이지의 구조(structure)를 표현한다.</p>
<p>이런 중첩 관계(부자 관계)를 시각적으로 파악하기 쉽게 indent(들여쓰기)를 활용한다. 보기좋은 코드는 읽기 쉬우며 읽기 쉬운 코드는 좋은 코드이다.</p>
<h3 id="빈-요소empty-element">빈 요소(Empty Element)</h3>
<p>content를 가질 수 없는 요소를 빈 요소(Empty element or Self-Closing element)라 한다. 아래의 예와 같이 빈 요소는 content가 없으며(필요가 없다) 어트리뷰트(Attribute)만을 가질 수 있다.</p>
<pre><code class="language-html">    &lt;meta charset=&quot;utf-8&quot;&gt;</code></pre>
<p>빈 요소 중 대표적인 요소는 아래와 같다.</p>
<ul>
<li>br</li>
<li>hr</li>
<li>img</li>
<li>input</li>
<li>link</li>
<li>meta</li>
</ul>
<h3 id="어트리뷰트attribute">어트리뷰트(Attribute)</h3>
<p>어트리뷰트(Attribute 속성)이란 요소의 성질, 특징을 정의하는 명세이다. 요소는 어트리뷰트를 가질 수 있으며 어트리뷰트는 요소에 추가적 정보(예를 들어 이미지 파일의 경로, 크기 등)를 제공한다. 어트리뷰트는 시작 태그에 위치해야 하며 이름과 값의 쌍을 이룬다.
<img src="https://velog.velcdn.com/images/jo_dbsgh95/post/b30b5660-c094-4f2c-8fce-40b46396851f/image.png" alt="">
예시</p>
<pre><code class="language-html">    &lt;img src=&quot;html.jpg&quot; width=&quot;104&quot; height=&quot;142&quot;&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/409134ba-ec1e-4d77-b9a9-48610cba8b01/image.png" alt=""></p>
<p><a href="https://www.w3.org/TR/2010/WD-html-markup-20101019/global-attributes.html">Global attributes</a></p>
<h3 id="주석">주석</h3>
<p>주석(comment)는 주로 개발자에게 코드를 설명하기 위해 사용되며 브라우저는 주석을 화면에 표시하지 않는다.</p>
<pre><code class="language-html">&lt;!--주석은 화면에 표시되지 않는다.--&gt;
&lt;p&gt;Lorem ipsum dolor sit amet&lt;/p&gt;</code></pre>
<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/bd364718-d5ca-4d1a-a968-2da4a8735cc1/image.png" alt=""></p>
<h2 id="reference">Reference</h2>
<ul>
<li><a href="https://html.spec.whatwg.org/multipage/">HTML5: W3C Recommendation</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80_%EC%A0%84%EC%9F%81">브라우저 전쟁</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD%EC%9D%98_%EC%9B%B9_%ED%98%B8%ED%99%98%EC%84%B1_%EB%AC%B8%EC%A0%9C">웹 호환성 문제</a></li>
<li><a href="https://www.facebook.com/poiemaweb/videos/179322715885247">플래쉬를 버리고 HTML5를 채택한 기술적 이유에 대해서 - 스티브 잡스(2010년)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 딥다이브 ]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%94%A5%EB%8B%A4%EC%9D%B4%EB%B8%8C</link>
            <guid>https://velog.io/@jo_dbsgh95/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-%EB%94%A5%EB%8B%A4%EC%9D%B4%EB%B8%8C</guid>
            <pubDate>Fri, 06 Oct 2023 06:53:04 GMT</pubDate>
            <description><![CDATA[<p>좋은 글이 있어 링크를 기록합니다.</p>
<p><a href="https://velog.io/@wn8624/JavaScript-%EB%B3%80%EC%88%98">딥다이브 공부 사이트 바로가기</a></p>
<p><a href="https://poiemaweb.com/Front-end">프론트엔드 학습방법</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Layered 구조]]></title>
            <link>https://velog.io/@jo_dbsgh95/Layered-%EA%B5%AC%EC%A1%B0</link>
            <guid>https://velog.io/@jo_dbsgh95/Layered-%EA%B5%AC%EC%A1%B0</guid>
            <pubDate>Fri, 29 Sep 2023 06:46:35 GMT</pubDate>
            <description><![CDATA[<h2 id="layered-구조">Layered 구조</h2>
<p>레이어드 구조는 애플리케이션의 코드를 조직하는 방법 중 하나입니다. 이러한 구조는 코드를 더 관리 가능하게 만들고 유지보수 및 확장을 용이하게 합니다. 대표적인 레이어드 구조 중 하나는 &quot;컨트롤러 - 서비스 - 레포지토리&quot; 구조입니다.</p>
<h4 id="컨트롤러controller">컨트롤러(Controller)</h4>
<p>컨트롤러는 클라이언트와 상호 작용하고 요청을 처리하는 역할을 합니다. 주로 사용자 인터페이스(UI)와 상호작용하며 클라이언트로부터 HTTP 요청을 받아 이를 해석하고 적절한 응답을 생성합니다. 비즈니스 로직을 직접 다루지 않고, 서비스 레이어로 요청을 전달합니다. 예를 들어, 웹 애플리케이션의 컨트롤러는 웹 브라우저에서 받은 HTTP 요청을 해석하고 해당 서비스 메서드를 호출하여 데이터를 처리하거나 뷰를 랜더링합니다.</p>
<h4 id="서비스service">서비스(Service)</h4>
<p>서비스 레이어는 비즈니스 로직을 처리하는 역할을 합니다. 컨트롤러로부터 받은 요청을 해석하고, 필요한 데이터 조작, 로직 실행, 데이터 검증 등을 수행합니다. 주로 여러 컨트롤러에서 공유되는 비즈니스 로직을 중앙에서 관리하고, 코드의 재사용성을 높이는 역할을 합니다. 예를 들어, 사용자등록, 주문처리, 데이터 검색 등의 기능을 제공하는 서비스가 있을 수 있습니다.</p>
<h4 id="레포지토리repository">레포지토리(Repository)</h4>
<p>레포지토리는 데이터 저장 및 검색을 담당합니다. 데이터베이스와 직접 상호작용하여 데이터를 읽고 쓰는 역할을 합니다. 서비스 레이어와 데이터베이스 사이에서 데이터에 대한 추상화 계층을 제공하여 데이터 접근과 관련된 로직을 캡슐화합니다. 이로써 데이터베이스와의 의존성을 줄이고 테스트 용이성을 향상시킵니다.</p>
<p>이러한 레이어드 구조는 소프트웨어를 모듈화하고, 각 레이어가 특정 역할을 수행하도록 함으로써 코드의 가독성과 유지보수성을 향상시킵니다. 또한, 레이어에 대한 변경 사항이 다른 레이어에 미치는 영향을 최소화하여 시스템의 확장성을 향상시킬 수 있습니다. 이러한 레이어드 구조는 주로 웹 애플리케이션, 백엔드 서비스, 모바일 앱 등 다양한 유형의 소프트웨어 개발에서 사용됩니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[REST]]></title>
            <link>https://velog.io/@jo_dbsgh95/REST</link>
            <guid>https://velog.io/@jo_dbsgh95/REST</guid>
            <pubDate>Fri, 29 Sep 2023 05:47:36 GMT</pubDate>
            <description><![CDATA[<h2 id="rest">REST</h2>
<p>REST(Representation State Transfer)는 웹 기반 애플리케이션의 아키텍처 스타일 중 하나입니다.</p>
<p>HTTP(Hypertext Transfer Protocol)를 기반으로 한 분산 시스템을 설계하고 구축하는 데 사용되는 아키텍처 원칙과 제약 사항의 모음입니다.</p>
<h2 id="특징">특징</h2>
<h4 id="자원resources">자원(Resources)</h4>
<p>REST 아키텍처에서는 모든 것을 자원으로 간주합니다. 자원은 웹에서 싣별 가능한 모든 것을 의미합니다. 예를 들어, 웹페이지, 이미지, 데이터베이스 레코드, 사용자, 서비스 등이 자원이 될 수 있습니다.</p>
<h4 id="표현representation">표현(Representation)</h4>
<p>자원은 여러 형태의 표현으로 나타낼 수 있습니다. 예를 들어, 텍스트, JSON, XML, HTML, 이미지 등이 자원의 다양한 표현 형태가 될 수 있습니다.</p>
<h4 id="상태전이stateless">상태전이(Stateless)</h4>
<p>REST는 상태를 서버에 저장하지 않고 요청 사이에 상태를 관리하지 않는 Stateless한 아키텍처를 강조합니다. 각 요청은 모든 필요한 정보를 포함하고 있어야 하며, 서버는 요청을 처리하기 위한 모든 정보를 요청 내에서 찾을 수 있어야 합니다.</p>
<h4 id="http메서드-http-methods">HTTP메서드 (HTTP Methods)</h4>
<p>HTTP메서드(GET, POST, PUT, DELETE등)를 사용하여 자원에 대한 다양한 작업을 수행합니다.</p>
<ul>
<li>GET : 자원을 조회하기 위해 사용합니다.</li>
<li>POST : 새로운 자원을 생성하기 위해 사용합니다.</li>
<li>PUT : 자원을 업데이트 또는 수정하기 위해 사용합니다.</li>
<li>DELETE : 자원을 삭제하기 위해 사용합니다.</li>
</ul>
<h4 id="urluniform-resource-identifier">URL(Uniform Resource Identifier)</h4>
<p>자원을 고유한 식별자인 URL을 통해 참조됩니다. URL는 자원을 가르키는 주소입니다.</p>
<h4 id="상호연결interconnectedness">상호연결(Interconnectedness)</h4>
<p>REST 아키텍처는 자원 간의 상호 연결을 강조합니다. 하나의 자원에서 다른 자원으로의 링크를 통해 서로 연결되어 있어야 합니다.</p>
<h4 id="계층구조layered-system">계층구조(Layered System)</h4>
<p>REST 아키텍처는 계층 구조를 지원하며, 클라이언트는 서버와 직접 통신하는 대신 중간 계층(로드 밸런서, 캐시 서버 등)을 통해 통신할 수 있습니다.</p>
<p>REST는 웹 서비스 및 API개발에서 매우 널리 사용되며, 간단하고 확장 가능한 아키텍처를 제공합니다. RESTfull웹 서비스를 개발할 때는 자원 식별, HTTP메서드 사용, 상태전이의 무상태성, 다양한 표현 형태 등을 고려하여 설계하고 구현해야 합니다. 이러한 원칙을 따랐을 때 웹 기반 애플리케이션을 효율적으로 관리하고 확장할 수 있습니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[Spring Framework]]></title>
            <link>https://velog.io/@jo_dbsgh95/Spring-Framework</link>
            <guid>https://velog.io/@jo_dbsgh95/Spring-Framework</guid>
            <pubDate>Fri, 22 Sep 2023 13:50:20 GMT</pubDate>
            <description><![CDATA[<h2 id="스프링-프레임워크">스프링 프레임워크</h2>
<p>스프링 프레임워크는 Java 기반의 오픈 소스 애플리케이션 프레임워크로, 엔터프라이즈급 웹 애플리케이션 및 서비스를 개발하기 위한 도구와 구조를 제공하는 소프트웨어 프레임워크입니다. 스프링은 다양한 기능을 제공하여 애플리케이션 개발을 더 효율적이고 모듈화된 방식으로 수행할 수 있도록 돕습니다.</p>
<h2 id="특징과-구성-요소">특징과 구성 요소</h2>
<h4 id="경량-컨테이너-lightweight-container">경량 컨테이너 (Lightweight Container)</h4>
<p>스프링은 자체 객체 관리 컨테이너를 제공하며, 이를 통해 객체의 생명 주기를 관리하고 의존성 주입(Dependency Injection)을 통해 객체 간의 결합도를 낮출 수 있습니다. 이러한 특징은 테스트 가능한 코드를 작성하고 유지보수를 쉽게 만들어 줍니다.</p>
<h4 id="의존성-주입-dependency-injection---di">의존성 주입 (Dependency Injection - DI)</h4>
<p>스프링은 객체 간의 의존성을 코드 내에서 하드 코딩하지 않고, 설정 파일이나 어노테이션을 통해 주입하는 방식을 제공합니다. 이로 인해 유연하고 확장 가능한 애플리케이션을 개발할 수 있습니다.</p>
<h4 id="aop-aspect-oriented-programming">AOP (Aspect-Oriented Programming)</h4>
<p>스프링은 관심사 분리(Aspect Separation)를 통해 핵심 비즈니스 로직과 횡단 관심사(Cross-cutting Concerns)를 분리하여 개발할 수 있게 해주는 AOP를 지원합니다. 이를 통해 로깅, 트랜잭션 관리, 보안 등의 측면에서 코드를 재사용할 수 있습니다.</p>
<h4 id="트랜잭션-관리">트랜잭션 관리</h4>
<p>스프링은 선언적인 방식으로 트랜잭션을 관리할 수 있도록 지원합니다. 이를 통해 데이터베이스 트랜잭션을 보다 쉽게 다룰 수 있습니다.</p>
<h4 id="데이터-액세스통합-data-accessintegration">데이터 액세스/통합 (Data Access/Integration)</h4>
<p>스프링은 다양한 데이터베이스 기술과의 통합을 위한 모듈을 제공하며, JDBC, Hibernate, JPA, JMS 등을 지원합니다.</p>
<h4 id="웹-애플리케이션-개발">웹 애플리케이션 개발</h4>
<p>스프링 웹 모듈은 웹 애플리케이션을 개발하기 위한 다양한 기능을 제공합니다. 이를 통해 MVC 아키텍처를 구현하고 웹 요청과 응답 처리를 효과적으로 다룰 수 있습니다.</p>
<h4 id="보안">보안</h4>
<p>스프링 시큐리티(Spring Security) 모듈을 통해 애플리케이션의 보안을 강화할 수 있습니다.</p>
<h4 id="테스트-지원">테스트 지원</h4>
<p>스프링은 JUnit과 같은 테스트 프레임워크와 통합하여 단위 테스트, 통합 테스트를 지원하며, 테스트 주도 개발(Test-Driven Development, TDD)을 촉진합니다.</p>
<h4 id="다양한-확장-모듈">다양한 확장 모듈</h4>
<p>스프링은 다양한 확장 모듈을 제공하며, 이를 통해 다양한 기능을 손쉽게 추가할 수 있습니다. 예를 들어, 스프링 부트(Spring Boot)는 스프링 애플리케이션의 빠른 개발 및 설정을 지원하는 확장 모듈 중 하나입니다.</p>
<p>스프링은 엔터프라이즈급 애플리케이션 개발에 매우 인기 있는 프레임워크로, 개발자들에게 유연하고 모듈화된 코드 작성을 돕고 다양한 통합 기술과 라이브러리와의 호환성을 제공합니다. 이로 인해 스프링은 많은 기업에서 신뢰하고 사용하는 기술 중 하나로 자리 잡았습니다.</p>
<h2 id="maven">Maven</h2>
<p>Spring의 의존 라이브러리를 간편하게 추가할 수 있도록 의존성 주입을 제공합니다.</p>
<p>Maven Repository에서 대부분 라이브러리를 자동으로 추가 가능합니다.</p>
<p>프로젝트 구조를 자동으로 구성합니다.</p>
<p>Build를 통해 배포를 위한 파일을 생성합니다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[데드락]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EB%8D%B0%EB%93%9C%EB%9D%BD</link>
            <guid>https://velog.io/@jo_dbsgh95/%EB%8D%B0%EB%93%9C%EB%9D%BD</guid>
            <pubDate>Thu, 21 Sep 2023 00:23:22 GMT</pubDate>
            <description><![CDATA[<h2 id="데드락의-정의">데드락의 정의</h2>
<p>데드락(Deadlock)은 컴퓨터 과학 및 정보 기술 분야에서 발생하는 상황 중 하나로, 두 개 이상의 프로세스나 스레드가 서로 상대방의 자원을 기다리며 무한히 진행하지 못하는 상태를 가르킵니다. 이러한 상태에서는 시스템이 더 이상 진행하지 못하고 멈추게 됩니다.</p>
<p>데드락은 다음과 같은 네 가지 조건을 만족할 때 발생합니다.</p>
<h2 id="데드락의-발생-조건">데드락의 발생 조건</h2>
<ol>
<li><p>상호 배제(Mutual Exclusion): 자원은 한 번에 하나의 프로세스나 스레드만 사용할 수 있어야 합니다.</p>
</li>
<li><p>점유 대기(Hold and Wait): 프로세스나 스레드가 최소한 하나의 자원을 가지고 있으면서 다른 자원을 기다리고 있어야 합니다.</p>
</li>
<li><p>비선점(No Preemption): 다른 프로세스나 스레드가 이미 점유한 자원을 강제로 뺏어올 수 없어야 합니다. 자원은 원래의 소유자에게 반납될 때 까지 사용됩니다.</p>
</li>
<li><p>순환 대기(Circular Wait): 여러 프로세스나 스레드 간에 지원 요청이 순환 형태로 대기 상태를 형성해야 합니다. 즉, 프로세스 A가 프로세스 B의 자원을, 프로세스 B가 프로세스 C의 자원을, 그리고 프로세스 C가 프로세스 A의 자원을 기다리는 순환 구조여야 합니다.</p>
</li>
</ol>
<h2 id="데드락-예방-및-해결방법">데드락 예방 및 해결방법</h2>
<p>데드락 상태는 시스템의 안정성을 위협하며, 이를 해결하기 위한 다양한 알고리즘이 개발되어 있습니다. 일반적으로 데드락을 해결하기 위해 다음과 같은 방법들을 사용합니다.</p>
<ol>
<li><p>데드락 예방(Deadlock Prevention): 필요 조건 중 하나 이상을 제거하여 데드락이 발생하지 않도록 합니다. 예를 들어, 자원 할당 전에 요청한 자원을 모두 얻을 수 있는지 미리 확인하거나, 자원 요청 시 타임아웃을 사용하여 데드락을 방지할 수 있습니다.</p>
</li>
<li><p>데드락 회피(Deadlock Avoidance): 시스템이 자원 할당을 허용하면서도 데드락을 회피하기 위해 안전한 자원 할당 순서를 결정합니다. 뱅커스 알고리즘(Banker&#39;s Algorithm)과 유사한 방법이 사용됩니다.</p>
</li>
<li><p>데드락 탐지 및 복구(Deadlock Detection and Recovery): 데드락이 발생하면 시스템이 이를 탐지하고 데드락 프로세스를 종료하거나 자원을 회수하여 복구합니다.</p>
</li>
</ol>
<blockquote>
</blockquote>
<h4 id="뱅커스알고리즘">*뱅커스알고리즘</h4>
<p>데드락 회피를 위한 알고리즘 중 하나로, 운영체제와 프로세스 간의 자원 관리를 효율적으로 조절하여 데드락을 방지하는 데 사용된다. 이 알고리즘은 프로세스가 자원을 요청할 때 안전한지를 사전에 판단하여 자원 할당을 관리한다.
뱅커스알고리즘은 프로세스가 자원을 요청할 때 다음 조건을 검사하여 요청을 승인할지 거부할지 결정한다.</p>
<ul>
<li>요청한 자원이 현재 사용 가능한 자원 수보다 작거나 같아야 한다.</li>
<li>요청한 자원을 할당한 후에도 시스템이 안전 상태를 유지해야 한다. 안전상태란 데드락입 ㅏㄹ생하지 않는 상태를 말한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[프로세스와 스레드]]></title>
            <link>https://velog.io/@jo_dbsgh95/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C</link>
            <guid>https://velog.io/@jo_dbsgh95/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C</guid>
            <pubDate>Wed, 20 Sep 2023 02:52:21 GMT</pubDate>
            <description><![CDATA[<p>프로세스와 스레드는 컴퓨터 프로그램이 실행될 때 발생하는 두 가지 중요한 개념이다.
이 두가지 개념은 다중작업(Multitasking)환경에서 프로그램들이 동시에 실행될 수 있도록 도와주는 역할을 한다.</p>
<h2 id="1-프로세스process">1. 프로세스(Process)</h2>
<h4 id="프로세스의-특징">프로세스의 특징</h4>
<ul>
<li><p>독립성: 각각의 프로세스는 다른 프로세스와 완전히 독립되어있다. 하나의 프로세스는 다른 프로세스에게 영향을 미치지않고 실행됩니다. 프로세스는 서로 완전히 격리되어 있으며, 한 프로세스가 다른 프로세스의 자원에 직접 접근하려면 운영체제를 통해 허가받아야 합니다. 각각의 프로세스는 자신만의 주소 공간을 가지며, 이로 인해 다른 프로레스에 영향을 미치지 않고 독립적으로 실행됩니다.</p>
</li>
<li><p>자원 할당: 운영체제는 각 프로세스에게 메모리 공간, CPU 시간, 파일 디스크립터 등의 자원을 할당합니다. 이러한 자원은 해당 프로세스만 사용할 수 있으며 다른 프로세스와 공유되지 않습니다.</p>
</li>
<li><p>컨텍스트 스위칭: 여러 프로세스가 동시에 실행될 수 있으므로, 운영체제는 프로세스 간 전환을 수행하는데 이를 컨텍스트 스위칭이라고 한다. 컨텍스트 스위칭은 현재 실행 중인 프로세스의 상태를 저장하고 다음 실행할 프로세스의 상태를 복원하는 작업을 의미합니다.</p>
</li>
<li><p>통신: 프로세스 간 통신(IPC, Inter-Process Communication)을 통해 서로 다른 프로세스간에 정보를 주고 받을 수 있습니다. 이를 통해 프로세스 간 협력이 가능합니다.</p>
</li>
</ul>
<h4 id="프로세스의-상태">프로세스의 상태</h4>
<ul>
<li><p>실행 상태(Running): CPU에서 현재 실행중인 상태입니다.</p>
</li>
<li><p>준비 상태(Ready): 실행을 기다리는 상태로, CPU가 사용 가능한 경우 실행 상태로 전환됩니다.</p>
</li>
<li><p>대기 상태(Blocked): 프로세스가 어떤 이벤트(예: 입출력 완료)를 기다리는 상태입니다. 이벤트가 발생하면 준비 상태로 전환됩니다.</p>
</li>
</ul>
<h4 id="프로세스-생성과-종료">프로세스 생성과 종료</h4>
<ul>
<li><p>프로세스 생성: 새로운 프로세스를 생성하려면 보통 부모 프로세스가 자식 프로세스를 fork 또는 spawn하는 방법을 사용합니다. 자식 프로세스는 부모 프로세스의 복제본으로 시작하며, 이후에 필요한 작업을 수행합니다.</p>
</li>
<li><p>프로세스 종료: 프로세스가 중요한 개념으로 사용되며</p>
</li>
</ul>
<h4 id="프로세스의-생성과-종료">프로세스의 생성과 종료</h4>
<ul>
<li>프로세스 생성: 새로운 프로세스를 생성하려면 보통 부모 프로세스가 자식 프로세스를 fork또는 spawn하는 방법을 사용합니다. 자식 프로세스는 부모 프로세스의 복제본으로 시작하며, 이후에 필요한 작업을 수행합니다.</li>
</ul>
<p>✔ spawn : 프로세스나 스레드를 생성하는 동작을 일컫는 용어, 또는 비동기 프로그래밍에서 비동기 작업을 시작하고, 결과를 기다리지 않고 다른 작업을 수행을 의미하는 개발 전반적으로 사용되는 프로그래밍 용어이다.</p>
<h2 id="2-스레드thread">2. 스레드(Thread)</h2>
<ul>
<li>스레드는 하나의 프로세스 내에서 실행되는 작은 실행 단위입니다. 즉, 스레드는 하나의 프로세스 내에서 여러 개 생성될 수 있으며, 이들은 동일한 프로세스 주소 공간을 공유합니다.</li>
<li>스레드는 프로세스 자원을 공유하며, 스레드 간의 통신이 비교적 간단하고 빠릅니다.</li>
<li>여러 스레드를 사용하면 동시성을 활용하여 작업을 병렬로 처리할 수 있으므로 멀티코어 CPU에서 성능 향상을 이끌어내는 데 유용합니다.</li>
</ul>
<h4 id="스레드의-특징">스레드의 특징</h4>
<ul>
<li><p>경량성: 스레드는 프로세스 내에서 생성되므로 프로세스에 비해 경량입니다. 스레드 간의 전환과 통신이 빠르며, 메모리를 적게 사용합니다.</p>
</li>
<li><p>공유자원: 스레드는 하나의 프로세스 내에서 실행되기 때문에 프로세스의 자원(메모리, 파일, 네트워크 연결 등)을 공유합니다. 이로 인해 데이터 공유가 용이하며, 동시 접근 문제에 주의해야 합니다.</p>
</li>
<li><p>병렬 처리: 멀티코어 CPU를 활용하여 여러 스레드가 병렬로 실행될 수 있어, 다수의 작업을 동시에 처리할 수 있습니다.</p>
</li>
</ul>
<h4 id="스레드의-사용">스레드의 사용</h4>
<ul>
<li><p>멀티태스킹: 다수의 작업을 동시에 실행하고자 할 때 스레드를 사용합니다. 예를 들어, 웹 서버에서 여러 클라이언트 요청을 동시에 처리하는 데 스레드가 사용됩니다.</p>
</li>
<li><p>동시성 제어: 공유 자원에 대한 동시 접근을 관리하고 제어하기 위해 스레드를 사용합니다. 스레드 간 동기화 메커니즘을 통해 경쟁 조건과 데드락을 방지할 수 있습니다.</p>
</li>
<li><p>비동기 프로그래밍: 스레드를 사용하여 비동기 작업을 처리하고, 메인 스레드는 다른 작업을 계속할 수 있습니다.</p>
</li>
</ul>
<h4 id="스레드의-구현">스레드의 구현</h4>
<ul>
<li><p>스레드는 여러 프로그래밍 언어와 라이브러리에서 지원됩니다. 예를 들어, Java에서는 &#39;Thread&#39; 클래스를 사용하여 스레드를 생성하고 관리할 수 있습니다.</p>
</li>
<li><p>또한 운영체제에 따라 스레드 관리 방식이 다를 수 있으며, 몇 가지 운영체제에서는 스레드 관리를 하나의 프로세스에게 위임하기도 합니다.</p>
</li>
</ul>
<p>스레드는 병렬 처리와 동시성을 구현하기 위한 강력한 도구로, 다수의 작업을 빠르게 처리하고 자원을 효율적으로 활용하는 데 중요한 역할을 합니다. 그러나 스레드를 사용할 때에는 동시성 문제(경쟁조건, 데드락등)와 관련된 주의사항을 숙지하고 안정적인 코드를 작성해야 합니다.</p>
<h3 id="요약">&lt;요약&gt;</h3>
<h4 id="프로세스">프로세스</h4>
<blockquote>
<p>1.프로세스는 독립된 프로그램 실행 단위이다.
2. 각각이 자체 메모리와 자원을 가지고 있다.</p>
</blockquote>
<h4 id="스레드">스레드</h4>
<blockquote>
<ol>
<li>하나의 프로세스 내에서 실행되는 작은 실행 단위다.</li>
<li>같은 프로세스 내에서 메모리와 자원을 공유한다.</li>
<li>스레드를 사용하면 프로세스 간 통신과 비교적 가볍게 병렬작업을 수행할 수 있다.</li>
<li>따라서 효율적인 멀티태스킹 및 멀티코어 CPU 활용이 가능하다.</li>
</ol>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[개발자 현직자 공부맵]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%98%84%EC%A7%81%EC%9E%90-%EA%B3%B5%EB%B6%80%EB%A7%B5</link>
            <guid>https://velog.io/@jo_dbsgh95/%EA%B0%9C%EB%B0%9C%EC%9E%90-%ED%98%84%EC%A7%81%EC%9E%90-%EA%B3%B5%EB%B6%80%EB%A7%B5</guid>
            <pubDate>Wed, 20 Sep 2023 02:14:25 GMT</pubDate>
            <description><![CDATA[<p><a href="https://zero-base.co.kr/event/media_BE_school_roadmap">공부맵URL바로가기</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 덱]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%8D%B1</link>
            <guid>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%8D%B1</guid>
            <pubDate>Mon, 24 Apr 2023 07:37:01 GMT</pubDate>
            <description><![CDATA[<h2 id="✅덱deque-double-ended-queue이란-무엇인가">✅덱(Deque, Double-ended Queue)이란 무엇인가?</h2>
<p>덱은 양쪽 끝에서 삽입과 삭제가 모두 가능한 자료구조로, 스택과 큐의 기능을 모두 갖고 있다.
덱 알고리즘은 대부분의 경우 스택이나 큐를 사용하는 알고리즘과 비슷한 형태를 가지고 있지만, 덱의 양쪽에서 데이터를 삽입하거나 삭제할 수 있기 때문에 좀 더 다양한 상황에서 사용할 수 있다.</p>
<h2 id="✅덱의-사용">✅덱의 사용</h2>
<blockquote>
</blockquote>
<ul>
<li>큐나 스택으로는 해결하기 어려운 문제</li>
<li>슬라이딩 윈도우 알고리즘: 고정된 크기의 윈도우를 슬라이딩하면서 데이터를 처리하는 알고리즘.</li>
<li>이중 우선순위 큐 구현: 가장 작은 값과 가장 큰 값 둘 다를 빠르게 찾아내기 위해 사용된다.</li>
</ul>
<p>덱 알고리즘을 구현할 때는 Deque 자료구조를 이용하거나, 스택이나 큐를 이용해 직접 구현할 수 있다. 따라서, 자바에서는 Deque 인터페이스와 그를 구현한  LinkedList 클래스를 제공하고 있다.</p>
<h2 id="✅코드예제">✅코드예제</h2>
<p>ex) 크기가 n인 배열과 k라는 자연수가 주어졌을 때, 크기가 k인 윈도우를 오른쪽으로 한 칸씩 이동시키면서 각 윈도우 내부의 합을 계산하시오.</p>
<pre><code class="language-java">import java.util.*;

public class SlidingWindow {
    public static void main(String[] args) {
        int[] arr = {1, 3, -1, -3, 5, 3, 6, 7};
        int k = 3;

        Deque&lt;Integer&gt; deque = new LinkedList&lt;&gt;();
        List&lt;Integer&gt; result = new ArrayList&lt;&gt;();

        for (int i = 0; i &lt; arr.length; i++) {
            // 현재 윈도우에서 벗어난 값 제거
            if (!deque.isEmpty() &amp;&amp; deque.peekFirst() &lt; i - k + 1) {
                deque.pollFirst();
            }

            // 현재 값이 윈도우에 포함되는 값일 때, 덱에 추가
            while (!deque.isEmpty() &amp;&amp; arr[deque.peekLast()] &lt; arr[i]) {
                deque.pollLast();
            }
            deque.offerLast(i);

            // 현재 윈도우에서의 최댓값을 결과에 추가
            if (i &gt;= k - 1) {
                result.add(arr[deque.peekFirst()]);
            }
        }

        System.out.println(result);
    }
}</code></pre>
<p>위 코드에서는 Deque 인터페이스를 구현한 LinkedList 클래스를 사용하여 덱을 구현하였다. 크기가 k인 윈도우에서 최댓값을 구하기 위해서는, 현재 위치에서 k개의 인접한 원소를 묶어서 처리해야 합니다. 이때, Deque를 사용하여 현재 윈도우에 포함되는 값들을 저장하고, 다음 윈도우로 이동할 때 마다 윈도우에서 제외되는 값을 제거하면서 윈도우 내부의 최댓값을 구한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 백준_9012번_괄호]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%809012%EB%B2%88%EA%B4%84%ED%98%B8</link>
            <guid>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%809012%EB%B2%88%EA%B4%84%ED%98%B8</guid>
            <pubDate>Mon, 24 Apr 2023 06:44:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/da92021e-5851-4bea-9390-443e0a613edd/image.png" alt=""></p>
<p>해당 문제는 스택을 활용하여 풀이할 수 있다.</p>
<h2 id="✅문제">✅문제</h2>
<pre><code class="language-java">import java.util.*;
import java.io.*;

public class Main{
    public static void main (String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        int n = Integer.parseInt(br.readLine());

        for(int i = 0; i&lt;n; i++){
            String s = br.readLine();

            if(isBalanced(s)){
              bw.write(&quot;YES\n&quot;);  
            } else {
                bw.write(&quot;NO\n&quot;);
            }
        }
        bw.close();
        br.close();

    }

        public static boolean isBalanced(String s){
             Stack&lt;Character&gt; stack = new Stack&lt;&gt;();

            for(int i=0; i&lt;s.length(); i++){
                char c = s.charAt(i);

                if(c == &#39;(&#39;){
                    stack.push(c);
                }else {
                    if(stack.isEmpty()){
                        return false;
                    }
                    stack.pop();
                }
            }
        return stack.isEmpty();
    }
}</code></pre>
<h2 id="✅추가-정리">✅추가 정리</h2>
<p>br.readLine()으로 괄호를 스트링으로 변환하는 부분에서 만약 스트링의 길이가 홀수인 경우 &quot;No&quot;를 출력하도록 하면 연산을 더 간단하게 할 수도 있을 것 같다는 생각이 든다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 백준_10828번_스택]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8010828%EB%B2%88%EC%8A%A4%ED%83%9D</link>
            <guid>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8010828%EB%B2%88%EC%8A%A4%ED%83%9D</guid>
            <pubDate>Tue, 18 Apr 2023 02:30:37 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/7e393264-a331-447f-8c0d-1659fdca3c66/image.png" alt=""></p>
<p>해당 문제는 switch문을 사용하여 풀이할 수 있다.</p>
<h2 id="✅코드">✅코드</h2>
<pre><code class="language-java">import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;

public class Main {
    public static void main(String[] args) {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        try {
            int n = Integer.parseInt(br.readLine());
            int[] stack = new int[n];
            int top = -1; // 스택의 top을 저장하는 변수

            for (int i = 0; i &lt; n; i++) {
                String[] cmd = br.readLine().split(&quot; &quot;);

                switch (cmd[0]) {
                    case &quot;push&quot;:
                        stack[++top] = Integer.parseInt(cmd[1]);
                        break;
                    case &quot;pop&quot;:
                        if (top == -1) {
                            System.out.println(-1);
                        } else {
                            System.out.println(stack[top--]);
                        }
                        break;
                    case &quot;size&quot;:
                        System.out.println(top + 1);
                        break;
                    case &quot;empty&quot;:
                        if (top == -1) {
                            System.out.println(1);
                        } else {
                            System.out.println(0);
                        }
                        break;
                    case &quot;top&quot;:
                        if (top == -1) {
                            System.out.println(-1);
                        } else {
                            System.out.println(stack[top]);
                        }
                        break;
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 백준_11004번_k번째 수]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8011004%EB%B2%88k%EB%B2%88%EC%A7%B8-%EC%88%98</link>
            <guid>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8011004%EB%B2%88k%EB%B2%88%EC%A7%B8-%EC%88%98</guid>
            <pubDate>Tue, 18 Apr 2023 02:07:01 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/7ec773e5-22c6-4aef-809b-922bc2a642be/image.png" alt=""></p>
<p>정렬 문제중에서도 매우 쉬운편에 속하는 문제이다. 다만 주의할 것은 한 줄에 입력을 여러건 받기 때문에 BufferedReader를 사용할 때 readLine()을 사용하는 것이 아니라. nextToken()을 사용하여 변수에 저장해야한다.</p>
<h2 id="✅코드">✅코드</h2>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        // 입력을 빠르게 받기 위해 BufferedReader를 사용합니다.
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken()); // 배열의 크기 n
        int k = Integer.parseInt(st.nextToken()); // k번째 수

        int[] arr = new int[n]; // 입력받은 숫자들을 저장할 배열
        st = new StringTokenizer(br.readLine());
        for (int i = 0; i &lt; n; i++) {
            arr[i] = Integer.parseInt(st.nextToken());
        }

        // 배열을 오름차순으로 정렬합니다.
        Arrays.sort(arr);

        // k번째 수는 배열의 인덱스로 바로 접근할 수 있습니다.
        int kth = arr[k - 1];

        // 출력을 빠르게 하기 위해 BufferedWriter를 사용합니다.
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(String.valueOf(kth));
        bw.flush();
        bw.close();
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 백준_11652번_카드]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8011652%EB%B2%88%EC%B9%B4%EB%93%9C</link>
            <guid>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8011652%EB%B2%88%EC%B9%B4%EB%93%9C</guid>
            <pubDate>Tue, 18 Apr 2023 01:15:33 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/508c3b59-7455-4598-a1a0-9e4b9db37576/image.png" alt=""></p>
<h2 id="✅코드">✅코드</h2>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine()); // 입력될 정수의 개수
        long[] nums = new long[n]; // n개의 정수를 담을 long 배열 생성
        for (int i = 0; i &lt; n; i++) {
            nums[i] = Long.parseLong(br.readLine()); // n개의 정수 입력 받음
        }
        Arrays.sort(nums); // 입력받은 정수를 오름차순으로 정렬

        int maxCnt = 1, cnt = 1; // maxCnt: 가장 많이 나온 정수의 개수, cnt: 현재까지 나온 가장 많이 나온 정수의 개수
        long maxNum = nums[0]; // maxNum: 가장 많이 나온 정수

        for (int i = 1; i &lt; n; i++) { // 배열 nums를 탐색
            if (nums[i] == nums[i - 1]) { // 이전 정수와 현재 정수가 같은 경우
                cnt++; // 현재까지 나온 가장 많이 나온 정수의 개수 증가
            } else { // 이전 정수와 현재 정수가 다른 경우
                cnt = 1; // 현재까지 나온 가장 많이 나온 정수의 개수를 1로 초기화
            }
            if (cnt &gt; maxCnt) { // 현재까지 나온 가장 많이 나온 정수의 개수가 기존의 maxCnt보다 큰 경우
                maxCnt = cnt; // maxCnt 갱신
                maxNum = nums[i]; // maxNum 갱신
            }
        }

        bw.write(Long.toString(maxNum)); // 가장 많이 나온 정수 출력
        bw.newLine(); // 개행문자 삽입
        bw.flush(); // 버퍼에 남아있는 내용 출력

        br.close();
        bw.close();
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 백준_10989번_수 정렬하기3]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8010989%EB%B2%88%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B03</link>
            <guid>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8010989%EB%B2%88%EC%88%98-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B03</guid>
            <pubDate>Mon, 17 Apr 2023 13:18:52 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/62952ba5-e117-4823-b66e-b7a6f9b6d20d/image.png" alt=""></p>
<p>해당 문제는 범위가 지정되어 있기 때문에 계수정렬을 사용하는 것이 효율적이다. 정렬 방법은 매우 간단하다.
n번 반복하여 입력으로 주어지는 숫자를 count 배열에 저장한다. 이때, count 배열의 인덱스는 입력으로 주어지는 숫자가 된다. 예를 들어, 입력으로 주어진 숫자가 3이면, count[3]을 1 증가시킨다.</p>
<pre><code class="language-java">import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine()); // 입력받을 숫자의 개수
        int[] count = new int[10001]; // 숫자가 나타난 횟수를 저장할 배열

        // 입력받은 숫자의 개수만큼 반복하여 계수 정렬을 수행
        for (int i = 0; i &lt; n; i++) {
            count[Integer.parseInt(br.readLine())]++;
        }

        // 계수 정렬 결과를 출력
        for (int i = 1; i &lt;= 10000; i++) {
            for (int j = 0; j &lt; count[i]; j++) {
                bw.write(i + &quot;\n&quot;);
            }
        }

        bw.flush();
        bw.close();
        br.close();
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 백준_10825번_국영수]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8010825%EB%B2%88%EA%B5%AD%EC%98%81%EC%88%98</link>
            <guid>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8010825%EB%B2%88%EA%B5%AD%EC%98%81%EC%88%98</guid>
            <pubDate>Sat, 15 Apr 2023 11:35:30 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/1bbba6a9-983d-4efe-9199-223f54fdab57/image.png" alt=""></p>
<p>입출력 유형 문제풀이가 다 비슷한 것 같다. 이전에 입출력 문제를 몇 번 풀이했던 경험이 있기 때문에 금방 해결할 수 있었다.</p>
<h2 id="✅코드">✅코드</h2>
<pre><code class="language-java">import java.io.*;
import java.util.*;

class Student implements Comparable&lt;Student&gt; {
    String name;
    int korean;
    int english;
    int math;

    public Student(String name, int korean, int english, int math) {
        this.name = name;
        this.korean = korean;
        this.english = english;
        this.math = math;
    }

    @Override
    public int compareTo(Student o) {
        if (this.korean != o.korean) {
            return o.korean - this.korean; // 국어 점수 내림차순
        } else if (this.english != o.english) {
            return this.english - o.english; // 영어 점수 오름차순
        } else if (this.math != o.math) {
            return o.math - this.math; // 수학 점수 내림차순
        } else {
            return this.name.compareTo(o.name); // 이름 사전순
        }
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());

        List&lt;Student&gt; students = new ArrayList&lt;&gt;();

        for (int i = 0; i &lt; n; i++) {
            String[] input = br.readLine().split(&quot; &quot;);
            String name = input[0];
            int korean = Integer.parseInt(input[1]);
            int english = Integer.parseInt(input[2]);
            int math = Integer.parseInt(input[3]);
            students.add(new Student(name, korean, english, math));
        }

        Collections.sort(students);

        for (Student student : students) {
            bw.write(student.name + &quot;\n&quot;);
        }

        bw.flush();
        bw.close();
        br.close();
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[알고리즘 - 백준_10814번_나이순 정렬하기]]></title>
            <link>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8010814%EB%B2%88%EB%82%98%EC%9D%B4%EC%88%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</link>
            <guid>https://velog.io/@jo_dbsgh95/%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EB%B0%B1%EC%A4%8010814%EB%B2%88%EB%82%98%EC%9D%B4%EC%88%9C-%EC%A0%95%EB%A0%AC%ED%95%98%EA%B8%B0</guid>
            <pubDate>Sat, 15 Apr 2023 11:11:16 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jo_dbsgh95/post/64f163ab-8060-4c53-8a38-255e080b30ab/image.png" alt=""></p>
<p>위 문제는 11650번 좌표 정렬하기 문제를 풀이한 경험이 있다면 쉽게 풀 수 있는 문제다. 좌표정렬하기 문제에서 &quot;x&quot;가 동일할 때 &quot;y&quot;값을 비교했던 것과 같이, 이번에는 나이가 동일한 경우 입력한 순번, 즉 입력된 데이터를 배열에 담는 순번을 변수에 담아서 비교하면 된다.</p>
<h2 id="✅코드">✅코드</h2>
<pre><code class="language-java">import java.util.*;
import java.io.*;

// 회원 정보를 저장하는 클래스
class Member {
    int age;
    String name;
    int joinDate;

    public Member(int age, String name, int joinDate) {
        this.age = age;
        this.name = name;
        this.joinDate = joinDate;
    }

    @Override
    public String toString() {
        return age + &quot; &quot; + name;
    }
}

public class Main {
    public static void main(String[] args) throws Exception {
        // BufferedReader와 BufferedWriter를 생성하여 입출력을 처리합니다.
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        // 회원 수를 입력받습니다.
        int n = Integer.parseInt(br.readLine());

        // 회원 정보를 저장할 Member 배열을 생성합니다.
        Member[] members = new Member[n];

        // 회원 정보를 입력받아 Member 객체를 생성하여 배열에 저장합니다.
        for (int i = 0; i &lt; n; i++) {
            String[] input = br.readLine().split(&quot; &quot;);
            int age = Integer.parseInt(input[0]);
            String name = input[1];
            members[i] = new Member(age, name, i);
        }

        // Arrays.sort 메소드를 이용하여 회원 정보를 나이순으로 정렬합니다.
        // 나이가 같은 경우에는 가입일순으로 정렬합니다.
        Arrays.sort(members, new Comparator&lt;Member&gt;() {
            @Override
            public int compare(Member o1, Member o2) {
                if (o1.age == o2.age) {
                    return o1.joinDate - o2.joinDate;
                } else {
                    return o1.age - o2.age;
                }
            }
        });

        // 회원 정보를 출력합니다.
        for (Member member : members) {
            bw.write(member + &quot;\n&quot;);
        }

        // BufferedWriter를 닫아줍니다.
        bw.flush();
        bw.close();
        br.close();
    }
}</code></pre>
]]></description>
        </item>
    </channel>
</rss>