<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Midnight Coder's Lounge</title>
    <link>https://atomicliquors.tistory.com/</link>
    <description>SSAFY 9기 수료생의 개발 블로그입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 18 Jun 2026 22:03:34 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>AtomicLiquors</managingEditor>
    <image>
      <title>Midnight Coder's Lounge</title>
      <url>https://tistory1.daumcdn.net/tistory/5347632/attach/ef1ef8839fe44becadbff71da842e99e</url>
      <link>https://atomicliquors.tistory.com</link>
    </image>
    <item>
      <title>[JavaScript] .slice()에 음수를 넣을 땐 0을 조심하세요 (백준 18110 solved.ac 3% 반례)</title>
      <link>https://atomicliquors.tistory.com/29</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffc9af; color: #953b34;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;요약&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 배열을 자르는 메서드에 .slice(-N), .splice(-N)처럼 음수 인덱스를 넣으면, 배열 맨 끝에서 N번째 항목을 가리키게 할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 하지만 N = 0이라면? 배열 맨 끝이 아니라 맨 처음을 가리키게 된다. .slice(-N) = .slice(-0) = .slice(0)이기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR'; background-color: #ffc9af; color: #953b34;&quot;&gt;&lt;b&gt;&amp;nbsp;상세&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript로 백준 18110번 문제 &quot;solved.ac&quot;를 풀고 있었습니다. 주어진 N의 15%에 해당하는 갯수만큼 배열에서 최댓값 / 최솟값을 각각 제외하고 나머지 수들에 대해 평균을 내는 문제입니다. 그렇기 때문에 입력받은 배열을 정렬하고, N의 15%에 해당하는 값(변수명 &lt;b&gt;offset&lt;/b&gt;)만큼 배열의 앞뒤에서 slice하는 방식으로 문제를 풀고자 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;944&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dMDRMm/btsMo8xl8dI/Eu0Yg3iHRuUnJgmC55yCsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dMDRMm/btsMo8xl8dI/Eu0Yg3iHRuUnJgmC55yCsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dMDRMm/btsMo8xl8dI/Eu0Yg3iHRuUnJgmC55yCsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdMDRMm%2FbtsMo8xl8dI%2FEu0Yg3iHRuUnJgmC55yCsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1554&quot; height=&quot;944&quot; data-origin-width=&quot;1554&quot; data-origin-height=&quot;944&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 다음과 같이 코드를 작성했습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;/* 오답 코드 */
const fs = require('fs');
const input = fs.readFileSync(0, 'utf-8').trim().split('\\n');

const N = Number(input[0]);
if(N === 0){
    console.log(0);
    return;
}
    
const offset = Math.round(N * 0.15);
const difficulties = input.slice(1, N+1).map(Number).sort((a, b) =&amp;gt; a - b);
const sliced = difficulties.slice(offset, -offset);
const sum = sliced.reduce((acc, e) =&amp;gt; acc + e, 0);
console.log(Math.round(sum / (N - offset * 2)));
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[제출 결과]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dca3nA/btsMoIMLSkB/rGhQyPi2Qs8COq3vFbHtd1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dca3nA/btsMoIMLSkB/rGhQyPi2Qs8COq3vFbHtd1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dca3nA/btsMoIMLSkB/rGhQyPi2Qs8COq3vFbHtd1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdca3nA%2FbtsMoIMLSkB%2FrGhQyPi2Qs8COq3vFbHtd1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1646&quot; height=&quot;76&quot; data-origin-width=&quot;1646&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3%에서 오답이 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반올림 연산을 잘못한 건가? 평균값을 잘못 구한 건가? &lt;br /&gt;한참 엉뚱한 데서 반례를 찾다가 결국 아래 코드에 문제가 있다는 걸 알게 되었습니다.&lt;/p&gt;
&lt;pre class=&quot;glsl&quot;&gt;&lt;code&gt;const sliced = difficulties.slice(offset, -offset);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N의 15%가 0이 되는 경우 변수 offset의 값은 0이 됩니다. &lt;br /&gt;예를 들면, 다음과 같이 N이 3인 반례를 들 수 있겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[반례]&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;3
1
2
3
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[정답]&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;2 // slice의 결과는 [1, 2, 3]이 되고 출력 결과는 (1 + 2 + 3) / 3 = 2가 되어야 한다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[오답]&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;0 // slice의 결과는 빈 배열 []이 되고 출력 결과는 0으로 나오고 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 구상했던 로직대로라면 배열의 앞뒤에서 0만큼을 제외하고 나머지 부분에 대해 평균을 구해야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제는 &lt;b&gt;offset&lt;/b&gt;의 값이 0이 되면 &lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;.slice(offset,&amp;nbsp;-offset)&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;은 &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;.slice(0, -0)&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; &amp;rArr; &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;.slice(0, 0)&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이 되어 버린다는 겁니다. &quot;배열의 앞에서 0만큼 떨어져서 출발, 뒤에서 0만큼 떨어져서 끝&quot;이 아니라, &lt;b&gt;그냥 0에서 시작해서 0에서 끝나 버리는 겁니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;.slice(offset,&amp;nbsp;-offset)&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 결과는 빈 배열 []가 되어 버립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;946&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blL68u/btsMpS8C9XU/dQaGyOsxyCxj89VNwkWfLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blL68u/btsMpS8C9XU/dQaGyOsxyCxj89VNwkWfLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blL68u/btsMpS8C9XU/dQaGyOsxyCxj89VNwkWfLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblL68u%2FbtsMpS8C9XU%2FdQaGyOsxyCxj89VNwkWfLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;765&quot; height=&quot;472&quot; data-origin-width=&quot;1532&quot; data-origin-height=&quot;946&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 문제가 되는 코드를 아래와 같이 고쳐야 합니다. 배열 길이인 N에서 offset을 뺀 값, 다시 말해 배열 끝에서 N만큼 떨어진 지점을 사용하겠다는 것을 JavaScript에게 확실하게 알려줘야 합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const sliced = difficulties.slice(offset, N - offset); //-offset에서 N-offset으로 수정.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;/* 정답 코드 */
const fs = require('fs');
const input = fs.readFileSync(0, 'utf-8').trim().split('\\n');

const N = Number(input[0]);
if(N === 0){
    console.log(0);
    return;
}
    
const offset = Math.round(N * 0.15);
const difficulties = input.slice(1, N+1).map(Number).sort((a, b) =&amp;gt; a - b);
const sliced = difficulties.slice(offset, N - offset)
const sum = sliced.reduce((acc, e) =&amp;gt; acc + e, 0);
console.log(Math.round(sum / (N - offset * 2)));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[제출 결과]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;74&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciXb6g/btsMqjdQ0Sy/GL3jKeOHQZDpxAarjejAOK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciXb6g/btsMqjdQ0Sy/GL3jKeOHQZDpxAarjejAOK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciXb6g/btsMqjdQ0Sy/GL3jKeOHQZDpxAarjejAOK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciXb6g%2FbtsMqjdQ0Sy%2FGL3jKeOHQZDpxAarjejAOK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1650&quot; height=&quot;74&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;74&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저는 한참 헤맸지만 멋쟁이 개발자이신 여러분은 이런 실수 때문에 버그를 내는 일이 없기를 바랍니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/29</guid>
      <comments>https://atomicliquors.tistory.com/29#entry29comment</comments>
      <pubDate>Thu, 20 Feb 2025 13:48:32 +0900</pubDate>
    </item>
    <item>
      <title>[JavaScript][백준] 객체는 틀리고, Set은 맞는 이유 (백준 25192번 node.js 풀이 75% 반례)</title>
      <link>https://atomicliquors.tistory.com/28</link>
      <description>&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffc9af; color: #953b34;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;요약&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;JavaScript 객체에는 기본적으로 &amp;lsquo;&lt;b&gt;constructor&lt;/b&gt;&amp;rsquo;, &amp;lsquo;&lt;b&gt;toString&lt;/b&gt;&amp;rsquo; 등 특정한 key에 해당하는 값이 존재한다. &lt;br /&gt;따라서 객체를 사용해서 문제를 푼 경우, 문자열 &amp;lsquo;constructor&amp;rsquo;, &amp;lsquo;toString&amp;rsquo; 등이 포함된 히든 케이스를 만나면 틀린 답을 출력할 수 있다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739602241833&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;const obj = {};

console.log(obj['constructor']);
console.log(obj['toString']);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;[Function: Object]
[Function: toString]
// 선언만 하고 아직 아무 값도 넣지 않았는데, 이미 뭔가 들어있는 이유가 뭘까요?&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffc9af; color: #953b34; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&amp;nbsp;상세&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/25192&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/25192&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;node.js로 백준 25192번 문제 &amp;lsquo;&lt;b&gt;인사성 밝은 곰곰이&amp;rsquo;를 풀고 있었습니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 문제를 풀기 위해선 &amp;ldquo;새로운 값이면 갯수를 세고, 이미 저장된 값이면 지나가는&amp;rdquo; 로직이 필요합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;key-value 형태의 자료구조(Map, Set)를 사용하는 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 이번에는 JavaScript의 객체를 활용해서 풀어보기로 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체도 key-value 형태고, 선언도 키 값 접근도 간단한 코드로 가능하고, 무엇보다 Set과는 다르게 ES6부터 존재해 왔기 때문에 근본도 넘칩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1739602536735&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 순수 객체를 사용한 key-value 접근. */
const obj = {};

obj['myKey'] = 'myValue';
console.log(obj['myKey']); // 출력 결과 : myValue;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript에서는 특정 값이 &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;null&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;이나 &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;undefined&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;와 같은 값(흔히 말하는 &amp;lsquo;falsy&amp;rsquo;한 값)은 조건문이나 논리 연산자를 만나면 &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;false&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;로 형변환이 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 문제에서도 이러한 성질을 이용해 아래와 같은 로직을 작성했습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1739602697988&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 오답 코드 */
const fs = require(&quot;fs&quot;);
const input = fs.readFileSync(0, 'utf-8').trim().split('\n');

let obj = null;
let count = 0;

for(line of input.slice(1)){
    const key = line.trim();
    if(key === 'ENTER')
        obj = {}; 
        // 'ENTER'가 입력될 때마다 새로운 객체로 초기화한다.
    else if(!obj[key]){
		    // 입력받은 문자열이 객체에 key로 저장되어 있는지 확인한다.
		    // 존재하지 않을 경우에만 count를 1 증가시키고, 객체에 문자열을 key로 저장한다.
        obj[key] = true;
        count++;
    }    
}

console.log(count);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/codC9r/btsMj6fa5tF/G4WzRoXKYxwX91IykkL271/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/codC9r/btsMj6fa5tF/G4WzRoXKYxwX91IykkL271/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/codC9r/btsMj6fa5tF/G4WzRoXKYxwX91IykkL271/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcodC9r%2FbtsMj6fa5tF%2FG4WzRoXKYxwX91IykkL271%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1636&quot; height=&quot;354&quot; data-origin-width=&quot;1636&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 틀렸네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채점할 때마다 쭉 정답이 나오다가 75%에서 &amp;ldquo;틀렸습니다&amp;rdquo;로 끝납니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇다면 로직 자체가 틀리지는 않았고, 반례가 있는 것 같습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  왜 틀렸을까?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;input에 해당하는 문자열 중에 특정한 문자열이 포함되어 있다면 오답이 발생합니다. &lt;br /&gt;&amp;lsquo;&lt;span data-token-index=&quot;1&quot;&gt;constructor&lt;/span&gt;&amp;rsquo;가 포함된 테스트 케이스를 작성해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;5
ENTER
constructor
abc
def
ghi
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;3
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 의도한 대로라면 constructor, abc, def, ghi가 입력될 때마다 정답이 1씩 증가해야 합니다. &lt;br /&gt;따라서 정답은 4여야 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런데 막상 코드를 실행하면, 출력 결과는 엉뚱하게 3이 나오죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되는 이유는 JavaScript 객체에 기본적으로 &amp;lsquo;&lt;b&gt;constructor&lt;/b&gt;&amp;rsquo;라는 key에 해당하는 값이 존재하기 때문입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 새 객체 obj를 생성하고, &lt;b&gt;constructor&lt;/b&gt;라는 key에 대응하는 값이 있는지 콘솔로 출력해 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;const obj = {};

console.log(obj['constructor']);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre class=&quot;delphi&quot;&gt;&lt;code&gt;[Function: Object]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Object&lt;/b&gt;라는 이름을 가진 함수가 존재한다는 출력 결과가 나옵니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 값은&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;null&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;undefined&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;, 0과 같이 &lt;b&gt;boolean&lt;/b&gt;으로 변환 시 &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;false&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;가 되는(falsy한) 값이 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;!&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 연산자를 만나면 의도하지 않은 결과를 얻게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;const obj = {};
console.log(!obj['abc']); // 임의의 문자열을 키로 사용
console.log(!obj['constructor']); // 'constructor'를 키로 사용
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre class=&quot;nimrod&quot;&gt;&lt;code&gt;true
// !obj['constructor'] =&amp;gt; !undefined =&amp;gt; !false =&amp;gt; true가 됩니다. 
false
// !obj['constructor'] =&amp;gt; !(function Object(){...}) =&amp;gt; !true =&amp;gt; false가 됩니다. 
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 우리가 사용했던 것처럼 &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;!obj['...']&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;를 사용해 분기처리를 하는 조건문은, 이렇게 특정 문자열이 포함된 반례를 만나서 오답을 출력했던 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  올바른 풀이&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;1. JavaScript의 Set을 사용하기&lt;/span&gt; &lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정석대로 JavaScript의 Set을 사용하는 풀이방법입니다.&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;/* 정답 코드 */
const fs = require(&quot;fs&quot;);
const input = fs.readFileSync(0, 'utf-8').trim().split('\\n');

let set = new Set();
let count = 0;

for(line of input.slice(1)){
    
    const key = line.trim();
    if(key === 'ENTER')
        set = new Set();
    else if(!set.has(key)){
        set.add(key);
        count++;
    }
}

console.log(count);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 아래와 같은 방법들을 사용하면, 그대로 객체를 사용하면서 문제를 푸는 것도 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;2. 객체의 key마다 임의의 값을 넣고, 일치여부에 따라 참거짓 판별하기&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;obj에 key에 해당하는 값이 들어있는지 여부가 아니라, 들어있는 값이 지정한 값과 정확히 일치하는지를 확인하여 보다 정확하게 조건을 판단할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;const fs = require(&quot;fs&quot;);
const input = fs.readFileSync(0, 'utf-8').trim().split('\\n');

let obj = null;
let count = 0;

for (line of input.slice(1)) {
    const key = line.trim();
    if (key === 'ENTER')
        obj = {};
    else if (obj[key] !== true) {
		    // 자동 형변환이 일어나지 않도록 !=가 아니라 !==를 사용해야 합니다.
        obj[key] = true;
        count++;
    }
}

console.log(count);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;3.&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; text-align: start;&quot;&gt;{}&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; text-align: start;&quot;&gt;&lt;b&gt;&lt;span style=&quot;text-align: start;&quot;&gt; &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;대신 &lt;span style=&quot;font-family: GungSeo, serif; text-align: start;&quot;&gt;&amp;nbsp;Object.create(null)&lt;/span&gt;로 객체 생성하기&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;Object.create(null)&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;을 사용하면 &lt;b&gt;constructor&lt;/b&gt;가 존재하지 않는, 진정한 의미로 비어 있는 객체를 생성할 수 있습니다. 따라서 처음에 의도했던 대로 코드가 동작하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;processing&quot;&gt;&lt;code&gt;const fs = require(&quot;fs&quot;);
const input = fs.readFileSync(0, 'utf-8').trim().split('\\n');

let obj = null;
let count = 0;

for (line of input.slice(1)) {
    const key = line.trim();
    if (key === 'ENTER')
        obj = Object.create(null);
    else if (!obj[key]) {
        obj[key] = true;
        count++;
    }
}

console.log(count);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  왜 저런 key와 value가 들어있나요?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript는 프로토타입(Prototype) 기반의 객체지향 언어입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토타입이란 새로운 객체를 생성할 때 원본 역할을 하는, JavaScript 언어에서 이미 만들어 놓은 객체입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 JavaScript의 객체는 &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;Object &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;라는 이름을 가진 프로토타입을 원본으로 만들어지고, &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;Object&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;라는 프로토타입이 가진 속성(프로퍼티)들을 물려받게 됩니다. (좀 더 구체적으로 말하자면 원본 프로토타입이 가진 속성들을 참조할 수 있게 됩니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 코드를 쳐 보면 어떤 속성들을 물려받게 되는지 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;console.log(Object.getOwnPropertyNames(Object.prototype));
// Object의 프로토타입에 어떤 속성이 들어있는지 확인해 보겠습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre class=&quot;scheme&quot;&gt;&lt;code&gt;[
  'constructor',
  '__defineGetter__',
  '__defineSetter__',
  'hasOwnProperty',
  '__lookupGetter__',
  '__lookupSetter__',
  'isPrototypeOf',
  'propertyIsEnumerable',
  'toString',
  'valueOf',
  '__proto__',
  'toLocaleString'
]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 예시로 들었던 constructor, toString 등이 포함되어 있는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;JavaScript에서는 이렇게 물려받은 속성들도 &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;[] &lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&amp;nbsp;연산자로 접근할 수 있습니다. 따라서 새 객체 &lt;b&gt;obj&lt;/b&gt;를 생성하고 아무것도 넣지 않았는데도, &lt;b&gt;obj[ ]&lt;/b&gt; 안에 위와 같은 값들이 존재하는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;const obj = {};

console.log(
    obj['constructor']
);

console.log(
    obj['__proto__']
);

console.log(
    obj['toString']
);
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre class=&quot;json&quot;&gt;&lt;code&gt;[Function: Object]
[Object: null prototype] {}
[Function: toString]
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;25192번 문제에서 주어진 제약사항은 &amp;ldquo;&lt;u&gt;&lt;b&gt;닉네임은 숫자 또는 영문 대소문자로 구성되어 있다&lt;/b&gt;&lt;/u&gt;&amp;rdquo;라는 것입니다. 공교롭게도 constructor, toString과 같은 프로퍼티는 영문 대소문자로만 구성되어 있고 따라서 반례가 될 수 있었던 것입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  Object.create(null)을 사용하면?&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3번 풀이에서 &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;Object.create(null)&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;을 사용해서 반례를 해결했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;Object.create(null)&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;을 사용하면, &lt;span style=&quot;color: #666666;&quot;&gt;&lt;b&gt;아무 프로토타입도 상속받지 않은 텅 빈 객체&lt;/b&gt;&lt;/span&gt;를 만들게 됩니다. &lt;br /&gt;(어려운 말로 프로토타입 체인이 없는 순수한 객체를 생성하게 됩니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;console.log(Object.getOwnPropertyNames(Object.create(null)));
// Object.create(null)에 어떤 속성이 들어있는지 확인해 보겠습니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력 결과&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;[]
// 아무 속성도 들어있지 않아 텅 빈 배열이 출력됩니다.&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 공식 문서에 따르면 &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;Object.create(null)&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;이 코드는 실무에 적합한 코드는 아닙니다. &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;Object&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;의 프로토타입을 상속한 게 아니기 때문에, 일반적인 객체가 갖고 있는 기능이 없기 때문입니다. 그래서 오히려 실무에서 오작동할 가능성도 높고, 디버깅도 어렵습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&quot;An object with a null prototype can behave in unexpected ways, because it doesn't inherit any object methods from Object.prototype. This is especially true when debugging, since common object-property converting/detecting utility functions may generate errors, or lose information (especially if using silent error-traps that ignore errors).&quot; &lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;i&gt;&amp;mdash; mdn web docs&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;Object.create(null)&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;로 만든 객체에 &lt;b&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;toString()&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;을 사용하면 에러가 발생합니다.&lt;/p&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const normalObj = {}; // 일반적인 객체
const nullProtoObj = Object.create(null); // Object.create(null)로 만든 객체

console.log(normalObj); // 출력 결과 : &quot;[object Object]&quot;
console.log(nullProtoObj); // 에러 발생: Cannot convert object to primitive value&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #ffc9af; color: #953b34;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;참고자료&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 게시글 작성하는 데 가장 큰 도움을 주신 백준 &lt;a title=&quot;@wizardrabbit&quot; href=&quot;https://www.acmicpc.net/user/wizardrabbit&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;@wizardrabbit&lt;/a&gt;님께 감사드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/board/view/156013&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/board/view/156013&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;본문 2번, 3번 풀이는 아래 질의내용을 보고 참고했습니다. (유사한 문제인 백준 1764번 듣보잡 문제에 관한 질의내용입니다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/board/view/150855&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/board/view/150855&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Object 및 프로토타입과 관련된 내용은 아래 공식 문서를 참고했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739603695647&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Object - JavaScript | MDN&quot; data-og-description=&quot;The Object type represents one of JavaScript's data types. It is used to store various keyed collections and more complex entities. Objects can be created using the Object() constructor or the object initializer / literal syntax.&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects&quot; data-og-url=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/b3Zw6I/hyYfU7NsRj/9mL6EQJ1stKRP3JnR2QYTk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object#null-prototype_objects&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/b3Zw6I/hyYfU7NsRj/9mL6EQJ1stKRP3JnR2QYTk/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Object - JavaScript | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;The Object type represents one of JavaScript's data types. It is used to store various keyed collections and more complex entities. Objects can be created using the Object() constructor or the object initializer / literal syntax.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Learn_web_development/Extensions/Advanced_JavaScript_objects/Object_prototypes&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://developer.mozilla.org/ko/docs/Learn_web_development/Extensions/Advanced_JavaScript_objects/Object_prototypes&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1739603701791&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Object prototypes - Web 개발 학습하기 | MDN&quot; data-og-description=&quot;Javascript에서는 객체를 상속하기 위하여 프로토타입이라는 방식을 사용합니다. 본 문서에서는 프로토타입 체인이 동작하는 방식을 설명하고 이미 존재하는 생성자에 메소드를 추가하기 위해 프&quot; data-og-host=&quot;developer.mozilla.org&quot; data-og-source-url=&quot;https://developer.mozilla.org/ko/docs/Learn_web_development/Extensions/Advanced_JavaScript_objects/Object_prototypes&quot; data-og-url=&quot;https://developer.mozilla.org/ko/docs/Learn_web_development/Extensions/Advanced_JavaScript_objects/Object_prototypes&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/d1UzbZ/hyYf34Jfst/C8G2acpI1JZNTc38DFlQH0/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Learn_web_development/Extensions/Advanced_JavaScript_objects/Object_prototypes&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://developer.mozilla.org/ko/docs/Learn_web_development/Extensions/Advanced_JavaScript_objects/Object_prototypes&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/d1UzbZ/hyYf34Jfst/C8G2acpI1JZNTc38DFlQH0/img.png?width=1920&amp;amp;height=1080&amp;amp;face=0_0_1920_1080');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Object prototypes - Web 개발 학습하기 | MDN&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Javascript에서는 객체를 상속하기 위하여 프로토타입이라는 방식을 사용합니다. 본 문서에서는 프로토타입 체인이 동작하는 방식을 설명하고 이미 존재하는 생성자에 메소드를 추가하기 위해 프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;developer.mozilla.org&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/28</guid>
      <comments>https://atomicliquors.tistory.com/28#entry28comment</comments>
      <pubDate>Sat, 15 Feb 2025 16:15:16 +0900</pubDate>
    </item>
    <item>
      <title>[백준][JAVA] 2667 - 단지번호붙이기 (11612KB, 64ms, Java 8)</title>
      <link>https://atomicliquors.tistory.com/27</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실버1 티어 DFS 문제인 단지번호붙이기 문제 풀이입니다.&lt;br /&gt;제법 많은 분들께서 제 문제 풀이를 조회해 주셔서, 블로그에 직접 문제 해설을 올리기로 마음먹었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uIUJ7/btsLwrkneuL/8KmOi9u06qMZeXC7vwlMq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uIUJ7/btsLwrkneuL/8KmOi9u06qMZeXC7vwlMq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uIUJ7/btsLwrkneuL/8KmOi9u06qMZeXC7vwlMq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuIUJ7%2FbtsLwrkneuL%2F8KmOi9u06qMZeXC7vwlMq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;822&quot; height=&quot;35&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;* 선수지식 : DFS, PriorityQueue&lt;/i&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;br /&gt;&amp;nbsp;문제 링크&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2667&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2667&lt;/a&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;br /&gt;&amp;nbsp;개요&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;192&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CSwEw/btsLwMhEa0r/GdZof7onCitsjdCKajlLv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CSwEw/btsLwMhEa0r/GdZof7onCitsjdCKajlLv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CSwEw/btsLwMhEa0r/GdZof7onCitsjdCKajlLv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCSwEw%2FbtsLwMhEa0r%2FGdZof7onCitsjdCKajlLv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;409&quot; height=&quot;192&quot; data-origin-width=&quot;409&quot; data-origin-height=&quot;192&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;이차원 평면 위에 1로 표현된 '집'들을 상하좌우로 연결한 묶음을 '단지'라고 하겠습니다.&lt;br /&gt;&amp;nbsp;첫째 줄에 &lt;b&gt;총 단지 수&lt;/b&gt;가 몇 개인지 출력해 주세요.&lt;br /&gt;&amp;nbsp;그 후 단지별로 들어 있는 &lt;b&gt;집의 수&lt;/b&gt;를 오름차순 정렬해서 한 줄씩 출력해 주세요.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;코드&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1735032559516&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;

public class Main {
    static int N;
    static boolean[][] map;
    static int[] dR = {0, 0, -1, 1};
    static int[] dC = {-1, 1, 0, 0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());
        map = new boolean[N][N];

        for (int i = 0; i &amp;lt; N; i++) {
            String input = br.readLine();
            for (int j = 0; j &amp;lt; N; j++) {
                map[i][j] = (input.charAt(j) == '1');
            }
        }

        int answer = 0;
        PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();
        for (int r = 0; r &amp;lt; N; r++) {
            for (int c = 0; c &amp;lt; N; c++) {
                if(map[r][c]){
                    answer++;
                    pq.offer(dfs(r, c));
                }
            }
        }

        StringBuilder sb = new StringBuilder();
        sb.append(residence).append('\n');
        while(!pq.isEmpty()){
            sb.append(pq.poll()).append('\n');
        }
        System.out.print(sb);
    }

    static int dfs(int r, int c){
        map[r][c] = false;
        int nr, nc;
        int houses = 1;
        for (int dir = 0; dir &amp;lt; 4; dir++) {
            nr = r + dR[dir];
            nc = c + dC[dir];
            if(isInBound(nr, nc)){
                houses += dfs(nr, nc);
            }
        }
        return houses;
    }

    static boolean isInBound(int r, int c){
        return r &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;gt;= 0 &amp;amp;&amp;amp; r &amp;lt; N &amp;amp;&amp;amp; c &amp;lt; N &amp;amp;&amp;amp; map[r][c];
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;해설&amp;nbsp;&lt;/b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; 이차원 배열 초기화 : boolean[][] 타입 사용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;표현하려는 값이 0과 1밖에 없어서 &lt;span style=&quot;background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;int[][]&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;보다 메모리를 적게 사용하는&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif;&quot;&gt; &lt;span style=&quot;background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;boolean[][]&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt; &lt;/span&gt;&lt;/span&gt;을 사용해도 충분합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 1로 주어지는 '집'은 &lt;span style=&quot;background-color: #dddddd; color: #ef5369; font-family: GungSeo, serif;&quot;&gt;&amp;nbsp;true &lt;/span&gt;로, 입력 0으로 주어지는 빈 공간은 &lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;false&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;로 치환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고로 이 이차원 배열은 집의 위치를 나타낼 뿐만 아니라&amp;nbsp;&lt;b&gt;방문 체크 역할까지 겸할&lt;/b&gt; 예정입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1735032722715&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; map = new boolean[N][N];

for (int i = 0; i &amp;lt; N; i++) {
    String input = br.readLine();
    for (int j = 0; j &amp;lt; N; j++) {
    // 입력을 받아서 값이 1이면 true, 0이면 false를 대입합니다.
        map[i][j] = (input.charAt(j) == '1');
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; dfs 탐색&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;집을 발견할 때마다 &lt;b&gt;dfs&lt;/b&gt;로 탐색하려 합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 때 집이 총 몇 개인지 갯수를 세기 위해 &lt;b&gt;dfs&lt;/b&gt; 함수가 집의 갯수를 저장한&amp;nbsp;&lt;span style=&quot;background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;int&lt;/span&gt;&lt;span style=&quot;background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;값을 반환하도록 만듭니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;또한 앞서 말씀드린 것처럼 &lt;b&gt;map[][]&lt;/b&gt;는 &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;dfs 중복 탐색을 방지하기 위해&amp;nbsp;&lt;/span&gt;방문 여부를 체크하는 용도로도 사용하겠습니다.&lt;br /&gt;추후 집의 위치 정보를 다시 사용할 필요가 없기 때문에, 굳이 2차원 배열을 새로 선언해서 메모리를 추가로 사용하는 게 아니라 &lt;br /&gt;기존의 &lt;b&gt;map[][]&lt;/b&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;의 값을 곧바로&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&amp;nbsp;false&lt;/span&gt;&lt;span style=&quot;font-family: GungSeo, serif; background-color: #dddddd; color: #ef5369; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;로 바꿔버릴 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735032652516&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;static int dfs(int r, int c){
    // 현재 위치의 map값을 false로 바꿔 중복 방문을 방지합니다.
    map[r][c] = false;
    int nr, nc;
    
    // 단지 안에 속한 집의 총 갯수를 저장할 int 변수입니다. 현재 위치에 집이 하나 있었으니 1로 초기화합니다.
    int houses = 1;
    
    for (int dir = 0; dir &amp;lt; 4; dir++) {
    //	4방 델타 탐색
        nr = r + dR[dir];
        nc = c + dC[dir];
        if(isInBound(nr, nc)){
        	// 집이 존재하는 좌표에 대해 dfs 탐색을 재귀적으로 실행합니다.
            // 각각의 탐색 결과 집이 총 몇 개였는지 houses에 저장하겠습니다.
            houses += dfs(nr, nc);
        }
    }
    
    // houses의 총합을 결과값으로 반환하고 탐색을 종료합니다.
    return houses;
}


static boolean isInBound(int r, int c){
    return r &amp;gt;= 0 &amp;amp;&amp;amp; c &amp;gt;= 0 &amp;amp;&amp;amp; r &amp;lt; N &amp;amp;&amp;amp; c &amp;lt; N &amp;amp;&amp;amp; map[r][c];
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; PriorityQueue를 사용한 정답 값의 오름차순 정렬&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;방문하지 않은 집을 발견할 때마다 단지 수를 증가시키고, &lt;b&gt;dfs&lt;/b&gt; 결과를 PQ에 저장합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;PQ에 저장된 정수 값들은 자동으로 오름차순 정렬되어서 저장될 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1735033578765&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 단지의 갯수를 저장할 int변수, 단지별 집의 갯수를 정렬해서 저장할 PQ입니다.
int answer = 0;
PriorityQueue&amp;lt;Integer&amp;gt; pq = new PriorityQueue&amp;lt;&amp;gt;();
for (int r = 0; r &amp;lt; N; r++) {
    for (int c = 0; c &amp;lt; N; c++) {
        if(map[r][c]){
        // 아직 방문하지 않은 집을 발견할 때마다 단지 갯수를 1 증가시킵니다.
            answer++;
            // 그 후 dfs 탐색을 실행하고, 결괏값을 즉시 PQ에 저장합니다.
            pq.offer(dfs(r, c));
        }
    }
}

StringBuilder sb = new StringBuilder();

// 단지의 갯수를 StringBuilder에 저장합니다.
sb.append(answer).append('\n');

while(!pq.isEmpty()){
	// PQ에서 오름차순으로 정렬된 단지별 집의 갯수를 순서대로 뽑아내, StringBuilder에 저장합니다.
    sb.append(pq.poll()).append('\n');
}

// StringBuilder를 출력합니다.
System.out.print(sb);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;제출 결과&amp;nbsp;&lt;/b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;35&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uIUJ7/btsLwrkneuL/8KmOi9u06qMZeXC7vwlMq1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uIUJ7/btsLwrkneuL/8KmOi9u06qMZeXC7vwlMq1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uIUJ7/btsLwrkneuL/8KmOi9u06qMZeXC7vwlMq1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuIUJ7%2FbtsLwrkneuL%2F8KmOi9u06qMZeXC7vwlMq1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;822&quot; height=&quot;35&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;35&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2024-12-24 오후 6.07.41.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;863&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n6sHe/btsLxthvzs0/Qbcu0936BtvjdTZTROKNLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n6sHe/btsLxthvzs0/Qbcu0936BtvjdTZTROKNLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n6sHe/btsLxthvzs0/Qbcu0936BtvjdTZTROKNLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn6sHe%2FbtsLxthvzs0%2FQbcu0936BtvjdTZTROKNLk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;745&quot; height=&quot;678&quot; data-filename=&quot;스크린샷 2024-12-24 오후 6.07.41.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;863&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 백준에서 문제 하나를 풀 때마다 한 분 정도 찾아와서 조회해 주시는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 문제 풀이는 4달 동안 30명 가까운 분들이 조회해 주셨습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;많은 분들께 참고가 된 것 같아 이렇게 직접 해설을 올리게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot;&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;코드와 관련된 피드백이나&lt;span&gt;&amp;nbsp;&lt;/span&gt;질문이 있으시면&lt;span&gt;&amp;nbsp;&lt;/span&gt;댓글 부탁드립니다.&lt;/p&gt;
&lt;/div&gt;</description>
      <category>Algorithm</category>
      <category>dfs</category>
      <category>Java</category>
      <category>백준</category>
      <category>알고리즘</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/27</guid>
      <comments>https://atomicliquors.tistory.com/27#entry27comment</comments>
      <pubDate>Tue, 24 Dec 2024 18:54:49 +0900</pubDate>
    </item>
    <item>
      <title>[Java] Queue의 .add()와 .offer()는 뭐가 다른가요?</title>
      <link>https://atomicliquors.tistory.com/26</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&amp;nbsp;요약&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;.add()와 .offer()는 똑같이 Queue에 요소를 삽입하는 연산이다.&lt;br /&gt;단 &lt;b&gt;Queue에&amp;nbsp;크기 제한이 있을 경우 동작하는 방식이 다르다.&lt;/b&gt;&lt;br /&gt;- .add()는 크기 제한을 넘은 경우 예외를 발생시킨다. &lt;u&gt;예외처리를 하지 않았다면 프로그램을 비정상적으로 종료한다.&lt;/u&gt;&lt;br /&gt;- .offer()는 크기 제한을 넘어도 예외를 발생시키지는 않는다. 대신, &lt;u&gt;삽입이 되지 못했다는 사실을 사용자가 인지하지 못할 수도 있다.&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&amp;nbsp;사전지식&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예외, 예외처리, 함수의 반환 값(return value)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&amp;nbsp;상세&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;205&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zDpYg/btsIJHJtwcb/zsP5mdrPtU47Tdt6Yde6Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zDpYg/btsIJHJtwcb/zsP5mdrPtU47Tdt6Yde6Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zDpYg/btsIJHJtwcb/zsP5mdrPtU47Tdt6Yde6Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzDpYg%2FbtsIJHJtwcb%2FzsP5mdrPtU47Tdt6Yde6Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;798&quot; height=&quot;205&quot; data-origin-width=&quot;798&quot; data-origin-height=&quot;205&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;.add() 대신 .offer()를 사용하신 이유가 있나요?&quot;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;알고리즘 그룹 스터디를 하다가, Queue를 사용하는 문제풀이에 댓글로 문의가 들어와서 글을 작성하게 되었습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사실 평소에 알고리즘을 풀 때는 크게 차이점은 없고, 각자 평소에 익숙한 메서드를 골라서 쓰게 마련입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Queue를 처음 배울 때 한 번 들었을 법도 한데 잘 떠오르지 않아, &lt;br /&gt;이번 기회에 공식 문서를 보고 차이점을 확실히 알아보기로 했습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;[ 공식 문서 ]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Java 공식 문서의 &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;Queue 항목을&lt;/span&gt; 보겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(백준에서 많이 사용하는 JDK 11 문서를 보겠습니다.)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;읽기 편하시라고 의역을 많이 섞었으니 양해부탁드립니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;.add()&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 .add()의 설명을 볼게요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1655&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ml569/btsIHl2fs7v/Kta0w7orZvCylAFDKCqmQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ml569/btsIHl2fs7v/Kta0w7orZvCylAFDKCqmQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ml569/btsIHl2fs7v/Kta0w7orZvCylAFDKCqmQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMl569%2FbtsIHl2fs7v%2FKta0w7orZvCylAFDKCqmQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1655&quot; height=&quot;427&quot; data-origin-width=&quot;1655&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #474747;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&quot;현재 큐에 지정한 요소를 삽입하되,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: start;&quot;&gt;&lt;b&gt;크기 제한&lt;/b&gt;에 걸리지 않고 즉시 수행 가능한 경우에 실행합니다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;color: #474747;&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;성공할 경우 true 값을 반환하고,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;&lt;b&gt;큐에 빈 공간이 없다면 IllegalStateException을 발생시킵니다.&lt;/b&gt;&lt;/u&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;크기 제한이 있는 큐가 꽉 찼을 때, add()를 실행하면 'IllegalStateException'이라는 에러를 발생시킨다고 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;b&gt;.offer()&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음으로 offer를 봅시다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc6vln/btsIHnF0EFB/vi400ZIIKtMyhZ2jEk3oe1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc6vln/btsIHnF0EFB/vi400ZIIKtMyhZ2jEk3oe1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc6vln/btsIHnF0EFB/vi400ZIIKtMyhZ2jEk3oe1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc6vln%2FbtsIHnF0EFB%2Fvi400ZIIKtMyhZ2jEk3oe1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1518&quot; height=&quot;366&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&quot;현재 큐에 지정한 요소를 삽입하되,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #474747; text-align: start;&quot;&gt;크기 제한에 걸리지 않고 즉시 수행 가능한 경우에 실행합니다.&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span&gt;크기 제한이 있는 큐를 사용한다면 보통 .add()보다는 이 메서드를 사용하는 것이 더 바람직한데,&amp;nbsp;&lt;br /&gt;.add()는 똑같은 이유로 원소 삽입에 실패한다면 예외를 발생시킬 수밖에 없기 때문입니다.&quot;&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span&gt;똑같은 상황일 때 .add()와는 다르게 에러를 발생시키지 않는다고 합니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실제로 Throws: 아래에 나와 있는, 각 메서드가 발생시키는 에러 목록을 보면&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앞서 .add()에는 'IllegalStateException&quot;이 있었지만, &lt;br /&gt;&amp;nbsp;.offer()에는 없는 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;추가로 문서에서 대놓고 .add()보다는 .offer()가 더 쓰기 좋다고 얘기하는 것도 인상적인 점이네요.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Queue.html#offer(E)&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Queue.html#offer(E)&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1721632005354&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Queue (Java SE 11 &amp;amp; JDK 11 )&quot; data-og-description=&quot;A collection designed for holding elements prior to processing. Besides basic Collection operations, queues provide additional insertion, extraction, and inspection operations. Each of these methods exists in two forms: one throws an exception if the opera&quot; data-og-host=&quot;docs.oracle.com&quot; data-og-source-url=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Queue.html#offer(E)&quot; data-og-url=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Queue.html#offer(E)&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Queue.html#offer(E)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/Queue.html#offer(E)&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;Queue (Java SE 11 &amp;amp; JDK 11 )&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;A collection designed for holding elements prior to processing. Besides basic Collection operations, queues provide additional insertion, extraction, and inspection operations. Each of these methods exists in two forms: one throws an exception if the opera&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.oracle.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;[ Java 프로그래밍에서 : .add() ]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사실 알고리즘 문제 풀이를 하면서 큐에 크기 제한을 두고 사용하는 경우는 별로 없을 것입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그렇기 때문에 .add()와 .offer()를 구분할 일은 별로 없을 텐데요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 .add()와 .offer()의 차이를 확실히 체감하기 위해 간단한 Java 프로그램을 하나 짜 보겠습니다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;public class AddOrOffer {
    public static void main(String[] args) {
        /* 크기 제한을 가진 'ArrayBlockingQueue'를 이용해 최대 크기가 5인 큐를 생성합니다. */
        Queue&amp;lt;Integer&amp;gt; que = new ArrayBlockingQueue&amp;lt;&amp;gt;(5);
        Scanner sc = new Scanner(System.in);
        System.out.println(&quot;1 이상의 정수를 입력해서 큐에 저장해 주세요.&quot;);
        System.out.println(&quot;- 큐의 최대 크기는 5입니다.&quot;);
        System.out.println(&quot;- -1을 입력하면 큐에서 첫 번째 원소를 제거합니다.&quot;);
        System.out.println(&quot;- 0을 입력하면 큐를 출력하고, 프로그램을 종료합니다.&quot;);

        while(true){
            /* 스캐너로 정수를 입력받아 큐에 삽입합니다. */
            int input = sc.nextInt();
            
            /* -1을 입력한 경우 큐의 맨 첫번째 원소를 제거합니다. */
            if(input == -1){
                int removedItem = que.poll();
                System.out.printf(&quot;큐에서 원소 제거됨 : %d\n&quot;, removedItem);
                continue;
            }

            /* 0을 입력한 경우 반복문을 종료합니다. */
            if(input == 0)
                break;

            que.add(input);
        }

        System.out.println(&quot;큐 상태 : &quot; + que);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐에 원하는 숫자를 입력하고, 프로그램 정상 종료 시 큐에 입력한 숫자들을 출력하는 프로그램입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐의 최대 크기는 5입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 최대 크기를 넘었을 때 .add()와 .offer()가 어떻게 동작하는지 알고 싶기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일부러 5개가 넘는 숫자들을 입력해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 .add()를 사용했을 때입니다. 1부터 6까지 숫자를 넣을 텐데,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여섯 번째 숫자를 넣는 순간 예외가 발생하면서 프로그램이 종료되어 버립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;입력값&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721646613825&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1
2
3
4
5
6&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;u&gt;출력 결과&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721646685766&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Exception in thread &quot;main&quot; java.lang.IllegalStateException: Queue full
	at java.util.AbstractQueue.add(AbstractQueue.java:98)
	at java.util.concurrent.ArrayBlockingQueue.add(ArrayBlockingQueue.java:312)
	at Queue.AddOrOffer.main(AddOrOffer.java:31)

Process finished with exit code 1&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&quot;Queue full&quot;이라는 메시지와 함께 IllegalStateException이 발생한 것을 확인할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;[&lt;/u&gt;문제점&lt;u&gt;]&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우리가 작성한 프로그램에서 -1을 입력하면 큐에 들어있던 항목을 하나 뺄 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그럼에도 불구하고, &lt;u&gt;&lt;b&gt;한 번 예외가 발생해 버리면 아무것도 하지 못하고 프로그램이 종료되고 맙니다&lt;/b&gt;&lt;/u&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;[&lt;/b&gt;&lt;/u&gt;&lt;b&gt;보완 방법&lt;/b&gt;&lt;u&gt;&lt;b&gt;]&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 문제를 보완하기 위해 IllegalException에 대한 예외처리로 프로그램이 계속 실행될 수 있도록 유지해 줄 수 있겠죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같이 que.add(input) 부분을 try-catch문으로 감싸서, .add() 메서드에서 발생 가능한 예외를 대비해 주었습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721647215142&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try {
    que.add(input);
} catch (IllegalStateException e) {
    System.err.println(&quot;에러 : 큐가 가득 찼습니다!&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 다시 똑같이 1, 2, 3, 4, 5, 6을 입력해 주면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6번째 숫자를 입력했을 때 전처럼 프로그램이 종료되지 않고,&lt;br /&gt;대신 다음과 같이 예외상황에 대한 메시지를 확인할 수 있게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721647443869&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1
2
3
4
5
6
에러 : 큐가 가득 찼습니다!&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면 프로그램 사용자는 큐의 항목을 제거하는 커맨드를 실행하고,&lt;br /&gt;원하는 결과를 얻을 때까지 프로그램을 실행할 수 있게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음에 넣었던 1과 2를 빼고 큐에 3, 4, 5, 6, 7을 넣고 싶다면 다음과 같은 흐름으로 실행이 될 수 있겠네요.&lt;/p&gt;
&lt;pre id=&quot;code_1721647589438&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1
2
3
4
5
6
에러 : 큐가 가득 찼습니다!
-1 // 원소 제거 커맨드
큐에서 원소 제거됨 : 1
6
7
에러 : 큐가 가득 찼습니다!
-1 // 원소 제거 커맨드
큐에서 원소 제거됨 : 2
7
0 // 종료 커맨드
큐 상태 : [3, 4, 5, 6, 7]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;[ Java 프로그래밍에서 : .offer() ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.offer()는 어떨까요? 프로그램을 즉시 종료하지 않으니 더 좋기만 한 걸까요?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개인적으로 경우에 따라 &lt;u&gt;&lt;b&gt;.offer()를 사용하는 것이 더 나쁜 선택이 될 수도 있다고 봅니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 처음에 사용한 코드에서 que.add(input)만 que.offer(input)으로 바꿔봅시다.&lt;/p&gt;
&lt;pre id=&quot;code_1721647770959&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;que.offer(input);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;입력값&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721647792999&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1
2
3
4
5
6
7
8
9
10
0 // 종료 커맨드&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번에는 아까와 다르게 1, 2, 3, 4, 5, 6...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여섯 번째 숫자까지 넣어도 아무런 메시지도 없고, 프로그램도 종료되지 않고 잘 돌아가네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자를 계속 넣다보니 재미가 들려서, 큐에 7, 8, 9, 10... 까지 넣고 싶은 만큼 숫자를 넣고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램을 종료해 보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;출력 결과&lt;/u&gt; &lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721647818580&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;큐 상태 : [1, 2, 3, 4, 5]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;...왜 6, 7, 8, 9, 10은 큐에 안 들어가고 1, 2, 3, 4, 5만 들어간 거죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아! 큐의 최대 크기가 5였다는 걸 깜빡했네요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;숫자를 실컷 넣는 동안 아무도 얘기를 안 해 줘서 전혀 몰랐는걸요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;[&lt;/u&gt;문제점&lt;u&gt;]&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 식으로 아무런 예외를 발생시키지 않는 경우에는&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;사용자가 전혀 의도하지 않은 결과를 낳을 수 있고,&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램은 아무 말 없이 멀쩡하게 실행되고 있으니 &lt;u&gt;&lt;b&gt;이런 문제를 아무도 모르게 될 위험이 존재하는 것입니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 갑자기 깨진다면 최소한 뭔가 문제가 있다는 것은 인지할 수 있죠.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 의미에서 예외가 없다면 프로그램이 갑자기 종료되는 것보다도 나쁜 안티패턴을 낳을 수도 있는 겁니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;[&lt;/b&gt;&lt;/u&gt;&lt;b&gt;보완 방법&lt;/b&gt;&lt;u&gt;&lt;b&gt;]&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1517&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfphzg/btsIHmf18TI/YDNHUmuLceX1womfVpm87k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfphzg/btsIHmf18TI/YDNHUmuLceX1womfVpm87k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfphzg/btsIHmf18TI/YDNHUmuLceX1womfVpm87k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcfphzg%2FbtsIHmf18TI%2FYDNHUmuLceX1womfVpm87k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1517&quot; height=&quot;444&quot; data-origin-width=&quot;1517&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRUTVL/btsIIYrvjn9/kgxnI2knHKDKkSKWFOXcc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRUTVL/btsIIYrvjn9/kgxnI2knHKDKkSKWFOXcc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRUTVL/btsIIYrvjn9/kgxnI2knHKDKkSKWFOXcc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRUTVL%2FbtsIIYrvjn9%2FkgxnI2knHKDKkSKWFOXcc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1518&quot; height=&quot;366&quot; data-origin-width=&quot;1518&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다시 공식 문서 내용을 보고 옵시다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.add()나 .offer()는 boolean 타입을 반환하는 메서드입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue에 요소 삽입이 성공했다면 true를, 실패했다면(+그 과정에서 예외를 일으키지 않았다면) false를 반환합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐가 꽉 찼을 때 .offer()의 반환 값이 false가 된다는 점을 이용해서 코드를 다음과 같이 고쳐볼 수 있겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721648557311&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;boolean result = que.offer(input);
if (!result) {
    System.err.println(&quot;에러 : 큐가 가득 찼습니다!&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.offer()의 삽입 연산이 실패하고 false를 반환했을 때,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if문이 발생해서 메시지를 출력합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그렇게 하면 아래와 같이 사용자가 원하는 결과를 얻을 수 있도록 행동을 수정하게 유도할 수 있을 겁니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721648657565&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;1
2
3
4
5
6
에러 : 큐가 가득 찼습니다!
-1 // 원소 제거 커맨드
큐에서 원소 제거됨 : 1
6
7
에러 : 큐가 가득 찼습니다!
-1 // 원소 제거 커맨드
큐에서 원소 제거됨 : 2
7 
-1 // 원소 제거 커맨드
큐에서 원소 제거됨 : 3
-1 // 원소 제거 커맨드
큐에서 원소 제거됨 : 4
-1 // 원소 제거 커맨드
큐에서 원소 제거됨 : 5
8
9
10
0 // 종료 커맨드
큐 상태 : [6, 7, 8, 9, 10]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&amp;nbsp;마치며&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이상으로 Queue의 .add()와 .offer()의 차이점, 실제 프로그래밍에 적용했을 때를 상정한 간단한 예시를 다뤄보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이해가 잘 안 되시거나 정정할 내용이 있다면 댓글로 피드백 부탁드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FZPeS/btsIJzZnofA/zMgGX0e7uLFD8JJR46bfrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FZPeS/btsIJzZnofA/zMgGX0e7uLFD8JJR46bfrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FZPeS/btsIJzZnofA/zMgGX0e7uLFD8JJR46bfrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFZPeS%2FbtsIJzZnofA%2FzMgGX0e7uLFD8JJR46bfrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;302&quot; height=&quot;302&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Language</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/26</guid>
      <comments>https://atomicliquors.tistory.com/26#entry26comment</comments>
      <pubDate>Mon, 22 Jul 2024 20:52:00 +0900</pubDate>
    </item>
    <item>
      <title>[백준][JAVA] 2504 - 괄호의 값</title>
      <link>https://atomicliquors.tistory.com/25</link>
      <description>&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스택 자료구조를 다루는 감이 떨어져 스택 문제를 복습했습니다. 풀고 나니 예상보다 티어가 높은 문제였네요.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 선수지식 : Stack, (List)&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&amp;nbsp;문제 링크&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/2504&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/2504&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;br /&gt;&amp;nbsp;개요&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;괄호의 짝이 맞는지 확인하고, 괄호의 쌍이 나타내는 값의 합계를 구하세요&quot;.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- 괄호 '()'는 감싸고 있는 값들을 전부 합해서 2를 곱해줍니다. 괄호 안이 비었다면 2를 나타냅니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;- 괄호 '[]'는 감싸고 있는 값들을 전부 합해서 3을 곱해줍니다. 괄호 안이 비었다면 3을 나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721122130982&quot; class=&quot;angelscript&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;() = 2
[] = 3
([]) = 2 * 3 = 6
()[] = 2 + 3
[()[]] = 3 * (2 + 3) = 15
[([])[]] = 3 * ( (2 * 3) + 3 ) = 27&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 규칙에 의하여 주어진 문자열을 올바르게 계산해야 하는 문제입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;코드&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[✅ 정답 코드 - Stack과 List 사용]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;pgsql&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Main_2504 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        int N = input.length();

        Stack&amp;lt;Character&amp;gt; st = new Stack&amp;lt;&amp;gt;();
        List&amp;lt;Integer&amp;gt; sums = new ArrayList&amp;lt;&amp;gt;();
        int idx = -1;
        int answer = 0;

        for (int i = 0; i &amp;lt; N; i++) {
           char curr = input.charAt(i);

           if(curr == '(' || curr == '['){
               st.push(curr);
               sums.add(0);
               idx++;
           }else{
               if(st.isEmpty() || !isPair(st.peek(), curr)){
                   System.out.println(0);
                   return;
               }else{
                   st.pop();
                   int total = sums.remove(idx);
                   int result = (total == 0 ? 1 : total) * getMult(curr);
                   if(--idx &amp;gt;= 0){
                       sums.set(idx, sums.get(idx) + result);
                   }else{
                       answer += result;
                   }
               }
           }

        }

        System.out.println(st.isEmpty() ? answer : 0);
    }

    static int getMult(char close){
        return close == ']' ? 3 : 2;
    }

    static boolean isPair(char open, char close){
        if( (open == '(' &amp;amp;&amp;amp; close == ')') || (open == '[' &amp;amp;&amp;amp; close == ']') )
            return true;
        else
            return false;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&amp;nbsp;해설&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; Stack과 List&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가장 나중에 입력된 괄호들을 가장 먼저 처리해서 결과값을 내고,&lt;br /&gt;그 다음에 가장 먼저 입력된 괄호들을 처리하는 방식으로 문제풀이가 이루어집니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;(LIFO, FILO)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이런 특성에 가장 적합한 자료구조인 Stack을 이용하겠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;그리고 겹겹이 중첩되어 있는 각각의 괄호 안에서 구할 합계를 저장할 수 있어야 합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;정수를 추가/제거하기 위해 List를 사용하고, &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;별도로 idx라는 정수 변수를 사용해 현재 몇 번째로 겹쳐진 괄호 안에서 합계를 구하고 있는지 가리키도록 하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;물론 굳이 List를 쓸 필요는 없고 적당한 크기의 배열을 써도 되지만, &lt;br /&gt;풀이 중에는 한 번 쓰고 제거한다는 점을 좀 더 명확히 하고 혼동을 줄이고자 List를 사용했습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721118961474&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 스택과 리스트를 선언합니다. */
Stack&amp;lt;Character&amp;gt; st = new Stack&amp;lt;&amp;gt;();
List&amp;lt;Integer&amp;gt; sums = new ArrayList&amp;lt;&amp;gt;();

/* 
 * 리스트의 최근 인덱스를 가리킬 idx 변수입니다. 
 * 리스트가 비어 있을 땐 초기값이 -1이었다가, 
 * 원소가 들어오면서 0, 1, 2 ... 등 실제 인덱스를 나타낼 것입니다. 
*/
int idx = -1;

/* 정답을 저장할 answer 변수입니다. */
int answer = 0;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt; 열린 괄호를 만난 경우&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1721122317249&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; for (int i = 0; i &amp;lt; N; i++) {
   char curr = input.charAt(i);

/* 현재 괄호가 ( 또는 [와 같이 열린 괄호일 경우 */
   if(curr == '(' || curr == '['){
       st.push(curr);
       sums.add(0);
       idx++;
   }else{
       // ...
   }

}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Stack에 현재 괄호를 집어넣습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- List에 0을 집어넣고, 앞으로 현재 괄호 내부의 계산 결과를 여기다 더해주겠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- idx가 List에서 현재 괄호의 위치를 가리킬 수 있도록 1만큼 증가시킵니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;br /&gt; 닫힌 괄호를 만난 경우&lt;/b&gt; &lt;b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;문제의 조건에 따르면,&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;앞서 조건문&amp;nbsp;&amp;nbsp;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&amp;nbsp;curr == '(' || curr == '[' &lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&amp;nbsp;를 통과하지 못한 경우는 무조건 닫힌 괄호 ) 또는 ]를 만나게 됩니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[1. 괄호 문자의 유효성 확인하기]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;짝이 맞는 괄호들을 전부 제거했을 때,&lt;br /&gt;&lt;/span&gt;괄호 문자가 유효하지 않는 경우는 크게 두 가지가 있겠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;a. 열려 있는 괄호가 없는데 닫힌 괄호가 등장했을 때&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;열린 괄호가 없다는 것은 다시 말해 현재 스택에 아무것도 없다는 의미겠지요.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;b. 괄호가 있는데 서로 짝이 맞지 않을 때&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스택의 최상단에 있는 열린 괄호, 현재 등장한 닫는 괄호가 서로 짝이 맞지 않는 상황입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음과 같이 구현하였습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721122729504&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 스택이 비어 있거나, 사용자 정의 메서드 isPair의 결과가 false일 경우*/
if(st.isEmpty() || !isPair(st.peek(), curr)){

/* 유효하지 않은 괄호 문자열이므로 0을 출력하고 프로그램을 종료합니다. */
   System.out.println(0);
   return;
}else{
   ...
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1721122759097&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 사용자 정의 메서드 isPair */ 
/* 두 괄호가 짝이 맞는지 확인하고 true, false를 반환합니다.*/
/* 스택의 최상단에 있는 괄호, 현재 탐색 중인 문자를 비교하는 데 사용하였습니다. */
static boolean isPair(char open, char close){
    if( (open == '(' &amp;amp;&amp;amp; close == ')') || (open == '[' &amp;amp;&amp;amp; close == ']') )
        return true;
    else
        return false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;[2. 괄호 문자의 합계 구하기]&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;괄호가 유효한 것으로 판명이 났다면 알맞은 값을 계산해 줍니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;괄호를 닫기 전까지 합계가 얼마였는지 저장해 뒀다가, &lt;br /&gt;괄호가 닫히는 순간 종류에 맞게 2 또는 3을 곱한 뒤&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;바깥 괄호에서 구하고 있는 합계에 더해 줄 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721122568977&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(st.isEmpty() || !isPair(st.peek(), curr)){
   ...
}else{
	/* 짝을 맞춘 열린 괄호는 스택에서 제거해 줍니다.*/
   st.pop();
   
   /* 
    * 정수 변수 total에 지금까지 괄호 내부에서 구한 합계를 저장합니다. 
    * List의 remove는 항목을 제거함과 동시에 제거된 항목을 반환합니다. 
   */
   int total = sums.remove(idx);
   
   /* 
    * 정수 변수 result에 괄호의 종류에 따라 결괏값을 계산해 줍니다.
    * 사용자 정의 메서드 getMult로 괄호의 종류에 따라 얼마를 곱할지 구해 줍니다. 
    * 만일 '()', '[]'과 같이 빈 괄호라서 합계가 0인 경우, 1을 곱해서 2 또는 3으로 만들어 줍니다.
    */
   int result = (total == 0 ? 1 : total) * getMult(curr);
   
   if(--idx &amp;gt;= 0){
   	/* idx를 하나 줄여서 바깥 괄호를 가리키고, 구한 값을 바깥 괄호의 합계에 더해 줍니다. */
       sums.set(idx, sums.get(idx) + result);
   }else{
   	/* idx가 -1일 경우 현재 더 이상 열린 괄호가 없으므로, 구하고자 하는 총 합계에 더해 줍니다. */
       answer += result;
   }
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1721120845553&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;/* 괄호의 종류에 따라 곱할 값을 반환하는 getMult 메서드*/
static int getMult(char close){
	// 매개변수 close가 ]라면 3을, 아니라면 )로 간주하고 2를 반환합니다.
    // 문제 조건에 따라 괄호는 무조건 ] 또는 )로 주어지므로 이렇게 구현해도 충분합니다.
    return close == ']' ? 3 : 2;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt; 정답 출력&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위와 같은 과정을 끝까지 반복하고 나면 정답을 출력해 줄 것입니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다만 출력하기 전에 괄호 문자열이 유효한지 한 번 더 검증할 건데요,&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;모든 괄호의 짝이 맞았다면 스택에 더 이상 남는 괄호가 없어야 합니다.&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러나 앞선 과정이 정상적으로 실행되었더라도 문자열이 올바르지 않아서&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스택에 아직 열린 괄호가 남아있을 가능성이 있습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721124156913&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;(() =&amp;gt; 프로그램 실행 후 스택에 '('가 남는다.
(()[]()[ =&amp;gt; 프로그램 실행 후 스택에 '(['가 남는다.
()[]()[[[ =&amp;gt; 프로그램 실행 후 스택에 '[[['가 남는다.&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그러므로 스택이 비어 있는지 확인하고 그렇다면 지금까지 구한 합계를, 그렇지 않다면 0을 출력할 것입니다.&lt;/p&gt;
&lt;pre id=&quot;code_1721124294161&quot; class=&quot;css&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;System.out.println(st.isEmpty() ? answer : 0);&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;[제출 결과]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;80&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfPVV6/btsIAzmaoIa/RqE0QogQB1vEAtA0VTtgMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfPVV6/btsIAzmaoIa/RqE0QogQB1vEAtA0VTtgMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfPVV6/btsIAzmaoIa/RqE0QogQB1vEAtA0VTtgMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfPVV6%2FbtsIAzmaoIa%2FRqE0QogQB1vEAtA0VTtgMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;724&quot; height=&quot;80&quot; data-origin-width=&quot;724&quot; data-origin-height=&quot;80&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;추가로 List의 역할을 배열로 대체한 코드도 함께 올립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[✅ 정답 코드 - Stack과 배열 사용]&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #2b2b2b; color: #a9b7c6;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;package stack;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Main_2504_Array {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();
        int N = input.length();

        Stack&amp;lt;Character&amp;gt; st = new Stack&amp;lt;&amp;gt;();
        int[] sums = new int[N];
        int idx = -1;
        int answer = 0;

        for (int i = 0; i &amp;lt; N; i++) {
           char curr = input.charAt(i);

           if(curr == '(' || curr == '['){
               st.push(curr);
               sums[++idx] = 0;
           }else{
               if(st.isEmpty() || !isPair(st.peek(), curr)){
                   System.out.println(0);
                   return;
               }else{
                   st.pop();
                   int total = sums[idx];
                   int result = (total == 0 ? 1 : total) * getMult(curr);
                   if(--idx &amp;gt;= 0){
                       sums[idx] = sums[idx] + result;
                   }else{
                       answer += result;
                   }
               }
           }

        }

        System.out.println(st.isEmpty() ? answer : 0);
    }

    static int getMult(char close){
        return close == ']' ? 3 : 2;
    }

    static boolean isPair(char open, char close){
        if( (open == '(' &amp;amp;&amp;amp; close == ')') || (open == '[' &amp;amp;&amp;amp; close == ']') )
            return true;
        else
            return false;
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열로 바꾸기 전과 성능상 큰 차이는 없었습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;76&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJaImg/btsIB7okeQR/1tLiP0bXtunU9M5kklueok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJaImg/btsIB7okeQR/1tLiP0bXtunU9M5kklueok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJaImg/btsIB7okeQR/1tLiP0bXtunU9M5kklueok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJaImg%2FbtsIB7okeQR%2F1tLiP0bXtunU9M5kklueok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;725&quot; height=&quot;76&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;76&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;코드와 관련된 피드백이나 질문이 있으시면 댓글 부탁드립니다.&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>algorithm</category>
      <category>Java</category>
      <category>Stack</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/25</guid>
      <comments>https://atomicliquors.tistory.com/25#entry25comment</comments>
      <pubDate>Tue, 16 Jul 2024 19:08:19 +0900</pubDate>
    </item>
    <item>
      <title>[Github] 커맨드라인에서 pull request 작성하기</title>
      <link>https://atomicliquors.tistory.com/24</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;브랜치 작업을 마치고 IDE에서 곧바로 PR을 보내고 싶어서 CLI에서 PR을 보내는 방법을 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 &lt;b&gt;GitHub CLI(gh)&lt;/b&gt;를 사용하여 다음 커맨드를 통해 PR을 작성할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;gh pr create --base {TARGET_BRANCH} --head {CURRENT_BRANCH} --title &quot;{TITLE}&quot; --body &quot;{BODY}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;--base에 해당하는 {&lt;b&gt;TARGET_BRANCH&lt;/b&gt;} 자리에는 변경 사항이 병합될 브랜치 이름을 적어 줍니다.&lt;/li&gt;
&lt;li&gt;--head에 해당하는 {&lt;b&gt;CURRENT_BRANCH&lt;/b&gt;} 자리에는 변경 사항이 들어있는 브랜치 이름을 적어 줍니다.&lt;/li&gt;
&lt;li&gt;{&lt;b&gt;TITLE&lt;/b&gt;} 자리에는 PR의 제목을 작성하고 따옴표로 감싸 줍니다.&lt;/li&gt;
&lt;li&gt;{&lt;b&gt;BODY&lt;/b&gt;} 자리에는 PR의 본문 내용을 작성하고 따옴표로 감싸 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[  예시]&lt;/b&gt;&lt;/p&gt;
&lt;pre data-ke-language=&quot;java&quot;&gt;&lt;code&gt;gh pr create --base master --head feat/login 
--title &quot;로그인 기능 추가&quot; --body &quot;OAuth방식을 이용한 로그인 기능을 추가했습니다.&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GitHub CLI(gh)가 설치되어 있지 않다면, 아래 설치과정을 따라서 gh를 설치해 주세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;  gh 설치&lt;/span&gt;&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;mac에서는 brew install 등을 이용해 커맨드라인으로 설치해 주면 됩니다.&lt;/p&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;brew install gh
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;window에서는 아래 공식 홈페이지에서 설치 파일(.msi)을 받아 설치합니다.&lt;/p&gt;
&lt;figure id=&quot;og_1720714692410&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;GitHub CLI&quot; data-og-description=&quot;Take GitHub to the command line&quot; data-og-host=&quot;cli.github.com&quot; data-og-source-url=&quot;https://cli.github.com/&quot; data-og-url=&quot;https://cli.github.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cYYoUQ/hyWvXfqA2Q/7DxrCodgubQPQaLPeVsLu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b6WnaF/hyWzzKM0DN/b15QpvrfKLKKeXMtdUrUM1/img.png?width=3360&amp;amp;height=900&amp;amp;face=0_0_3360_900&quot;&gt;&lt;a href=&quot;https://cli.github.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://cli.github.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cYYoUQ/hyWvXfqA2Q/7DxrCodgubQPQaLPeVsLu1/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630,https://scrap.kakaocdn.net/dn/b6WnaF/hyWzzKM0DN/b15QpvrfKLKKeXMtdUrUM1/img.png?width=3360&amp;amp;height=900&amp;amp;face=0_0_3360_900');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;GitHub CLI&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Take GitHub to the command line&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;cli.github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brXkAs/btsIu1woUpp/Qt1W9sO6rTaRNLLbHBYdn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brXkAs/btsIu1woUpp/Qt1W9sO6rTaRNLLbHBYdn1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brXkAs/btsIu1woUpp/Qt1W9sO6rTaRNLLbHBYdn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrXkAs%2FbtsIu1woUpp%2FQt1W9sO6rTaRNLLbHBYdn1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;225&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OimNq/btsIvygbDeE/ITntz9L2z3qSgHTKOtqWZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OimNq/btsIvygbDeE/ITntz9L2z3qSgHTKOtqWZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OimNq/btsIvygbDeE/ITntz9L2z3qSgHTKOtqWZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOimNq%2FbtsIvygbDeE%2FITntz9L2z3qSgHTKOtqWZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;318&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커맨드에서 &lt;b&gt;&lt;i&gt;gh&lt;/i&gt;&lt;/b&gt;를 입력하여 설치를 확인합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(설치가 되지 않았다고 할 경우 &lt;b&gt;컴퓨터를 재시작합니다.&lt;/b&gt;)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;711&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEzyno/btsIvUcfxyc/49lRxl1lb9qGx8kSaL72qK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEzyno/btsIvUcfxyc/49lRxl1lb9qGx8kSaL72qK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEzyno/btsIvUcfxyc/49lRxl1lb9qGx8kSaL72qK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEzyno%2FbtsIvUcfxyc%2F49lRxl1lb9qGx8kSaL72qK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;333&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;711&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  Github 사용자 인증&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래 커맨드를 입력해 Github CLI에 자신의 계정 정보로 로그인을 시작합니다.&lt;/p&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;gh auth login
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;로그인할 계정을 선택하게 됩니다.&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Github.com&lt;/span&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;계정으로 로그인할 거니까 Github.com을 선택하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;194&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/df0oOn/btsIu6LeuBm/liUTNOeKcW5uIPUIdp7UK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/df0oOn/btsIu6LeuBm/liUTNOeKcW5uIPUIdp7UK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/df0oOn/btsIu6LeuBm/liUTNOeKcW5uIPUIdp7UK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdf0oOn%2FbtsIu6LeuBm%2FliUTNOeKcW5uIPUIdp7UK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;109&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;194&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;HTTPS/SSH 중에 원하는 프로토콜을 선택하여 Github와 통신합니다. 전 HTTPS를 사용하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2ww74/btsIwvptZqN/bsK7ykSpJdu7gUQL6GCvRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2ww74/btsIwvptZqN/bsK7ykSpJdu7gUQL6GCvRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2ww74/btsIwvptZqN/bsK7ykSpJdu7gUQL6GCvRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2ww74%2FbtsIwvptZqN%2FbsK7ykSpJdu7gUQL6GCvRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;112&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;credential을 통해 인증할 것인지 물어보면 Y를 입력합니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;82&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7zJKQ/btsIvQno2H6/28k4yiW0CKe4SuCZz0zg90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7zJKQ/btsIvQno2H6/28k4yiW0CKe4SuCZz0zg90/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7zJKQ/btsIvQno2H6/28k4yiW0CKe4SuCZz0zg90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7zJKQ%2FbtsIvQno2H6%2F28k4yiW0CKe4SuCZz0zg90%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;625&quot; height=&quot;82&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;82&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 브라우저를 통해 로그인하거나 인증 토큰을 사용할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서는 웹 브라우저를 통해 로그인하겠습니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FYL14/btsIwMEvzSD/0lbc5Vpwc1uwcKKZV6RVpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FYL14/btsIwMEvzSD/0lbc5Vpwc1uwcKKZV6RVpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FYL14/btsIwMEvzSD/0lbc5Vpwc1uwcKKZV6RVpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFYL14%2FbtsIwMEvzSD%2F0lbc5Vpwc1uwcKKZV6RVpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;131&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증에 사용할 코드가 터미널에 뜹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;엔터키를 누르면 Github 로그인 페이지로 연결됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;139&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YFBXS/btsIvSr0nAg/e2de9nHiKmgEmkN754Oz3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YFBXS/btsIvSr0nAg/e2de9nHiKmgEmkN754Oz3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YFBXS/btsIvSr0nAg/e2de9nHiKmgEmkN754Oz3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYFBXS%2FbtsIvSr0nAg%2Fe2de9nHiKmgEmkN754Oz3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;592&quot; height=&quot;139&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;139&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;562&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lmeg3/btsIvtlFm0R/AHAZesBZwktBhTqKlkC8kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lmeg3/btsIvtlFm0R/AHAZesBZwktBhTqKlkC8kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lmeg3/btsIvtlFm0R/AHAZesBZwktBhTqKlkC8kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Flmeg3%2FbtsIvtlFm0R%2FAHAZesBZwktBhTqKlkC8kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;562&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;562&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인을 마치면 Device Activation 화면이 뜹니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;괜히 Device라고 하니 모바일 기기 인증을 하라는 말인지 헷갈릴 수 있는데, 그건 아닙니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;바로 방금 터미널에 떴던 코드를 입력해 주는 겁니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cCNgs0/btsIwfmStDi/XwOnjpv3NJ1meQ5G7NSGGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cCNgs0/btsIwfmStDi/XwOnjpv3NJ1meQ5G7NSGGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cCNgs0/btsIwfmStDi/XwOnjpv3NJ1meQ5G7NSGGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcCNgs0%2FbtsIwfmStDi%2FXwOnjpv3NJ1meQ5G7NSGGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;642&quot; height=&quot;614&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;262&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XnPvP/btsIwV2jxCm/ZAmnkuxA0S6YNU4VXMOkOk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XnPvP/btsIwV2jxCm/ZAmnkuxA0S6YNU4VXMOkOk/img.png&quot; data-alt=&quot;아까 봤던 이 화면에 있는 코드를 입력하면 됩니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XnPvP/btsIwV2jxCm/ZAmnkuxA0S6YNU4VXMOkOk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXnPvP%2FbtsIwV2jxCm%2FZAmnkuxA0S6YNU4VXMOkOk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;635&quot; height=&quot;130&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;262&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아까 봤던 이 화면에 있는 코드를 입력하면 됩니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인증이 완료되면 아래와 같이 Github CLI에 로그인됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ttgGo/btsIwWmCIza/N1D7jaUp10EZYR6HyiCitK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ttgGo/btsIwWmCIza/N1D7jaUp10EZYR6HyiCitK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ttgGo/btsIwWmCIza/N1D7jaUp10EZYR6HyiCitK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FttgGo%2FbtsIwWmCIza%2FN1D7jaUp10EZYR6HyiCitK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;572&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/X9OQI/btsIwrUWwyk/7qa3AgyQPIj5psdFpKBuZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/X9OQI/btsIwrUWwyk/7qa3AgyQPIj5psdFpKBuZk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/X9OQI/btsIwrUWwyk/7qa3AgyQPIj5psdFpKBuZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FX9OQI%2FbtsIwrUWwyk%2F7qa3AgyQPIj5psdFpKBuZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;652&quot; height=&quot;257&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ef6f53; font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;b&gt;  PR 작성&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 맨 처음에 소개했던 커맨드를 이용해서 PR을 작성해 봅시다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;gh pr create --base {TARGET_BRANCH} --head {CURRENT_BRANCH} --title &quot;{TITLE}&quot; --body &quot;{BODY}&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;--base에 해당하는 {&lt;b&gt;TARGET_BRANCH&lt;/b&gt;} 자리에는 변경 사항이 병합될 브랜치 이름을 적어 줍니다.&lt;/li&gt;
&lt;li&gt;--head에 해당하는 {&lt;b&gt;CURRENT_BRANCH&lt;/b&gt;} 자리에는 변경 사항이 들어있는 브랜치 이름을 적어 줍니다.&lt;/li&gt;
&lt;li&gt;{&lt;b&gt;TITLE&lt;/b&gt;} 자리에는 PR의 제목을 작성하고 따옴표로 감싸 줍니다.&lt;/li&gt;
&lt;li&gt;{&lt;b&gt;BODY&lt;/b&gt;} 자리에는 PR의 본문 내용을 작성하고 따옴표로 감싸 줍니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어서 &lt;i&gt;master&lt;/i&gt; 브랜치에 &lt;i&gt;feat/login&lt;/i&gt; 브랜치를 병합하려면 다음과 같은 커맨드를 입력해 주는 겁니다.&lt;/p&gt;
&lt;pre class=&quot;java&quot; data-ke-language=&quot;java&quot;&gt;&lt;code&gt;gh pr create --base master --head feat/login 
--title &quot;로그인 기능 추가&quot; --body &quot;OAuth방식을 이용한 로그인 기능을 추가했습니다.&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;163&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BlXpQ/btsIvlVG8P3/jhCgkKjQWPZqlfI88rEsk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BlXpQ/btsIvlVG8P3/jhCgkKjQWPZqlfI88rEsk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BlXpQ/btsIvlVG8P3/jhCgkKjQWPZqlfI88rEsk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBlXpQ%2FbtsIvlVG8P3%2FjhCgkKjQWPZqlfI88rEsk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;625&quot; height=&quot;80&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;163&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PR 요청이 완료되었고 이제 Github에서 요청을 검토하고 Merge할 수 있게 됩니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ujZJb/btsIxEluDwt/Hqbm2fOARTJgCITlcN7ik1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ujZJb/btsIxEluDwt/Hqbm2fOARTJgCITlcN7ik1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ujZJb/btsIxEluDwt/Hqbm2fOARTJgCITlcN7ik1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FujZJb%2FbtsIxEluDwt%2FHqbm2fOARTJgCITlcN7ik1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;768&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만일 PR을 검토할 담당자를 지정하고 싶다면 커맨드에 &lt;i&gt;-a&lt;/i&gt; 또는 &lt;i&gt;--assignee&lt;/i&gt; 옵션을 사용할 수 있습니다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot;&gt;&lt;code&gt;gh pr create -a &quot;@octocat&quot;
gh pr create --assignee &quot;@octocat&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;더 자세한 옵션이나, Github CLI를 이용한 PR에 관해 자세한 내용은 아래 공식 문서를 참고해 주세요.&lt;/p&gt;
&lt;figure id=&quot;og_1720715574921&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;끌어오기 요청 만들기 - GitHub Docs&quot; data-og-description=&quot;리포지토리의 변경 내용을 제안하고 공동 작업하는 끌어오기 요청을 만듭니다. 이러한 변경 내용은 분기에서 제안되어 기본 분기에 완료 및 승인된 작업만 포함되도록 합니다.&quot; data-og-host=&quot;docs.github.com&quot; data-og-source-url=&quot;https://docs.github.com/ko/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request&quot; data-og-url=&quot;https://docs.github.com/ko/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/dtAj7X/hyWvW8H3ff/nqwVku9qlbAHZm745d4kr1/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/H6HV2/hyWvSLZe5q/xLODZOTlcdzCETp7cbZDc1/img.png?width=1892&amp;amp;height=716&amp;amp;face=0_0_1892_716,https://scrap.kakaocdn.net/dn/c14gik/hyWvJO2vsm/Jr1ej0NeOvEdJbZzdhfbKk/img.png?width=1572&amp;amp;height=638&amp;amp;face=0_0_1572_638&quot;&gt;&lt;a href=&quot;https://docs.github.com/ko/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://docs.github.com/ko/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/dtAj7X/hyWvW8H3ff/nqwVku9qlbAHZm745d4kr1/img.png?width=1200&amp;amp;height=1200&amp;amp;face=0_0_1200_1200,https://scrap.kakaocdn.net/dn/H6HV2/hyWvSLZe5q/xLODZOTlcdzCETp7cbZDc1/img.png?width=1892&amp;amp;height=716&amp;amp;face=0_0_1892_716,https://scrap.kakaocdn.net/dn/c14gik/hyWvJO2vsm/Jr1ej0NeOvEdJbZzdhfbKk/img.png?width=1572&amp;amp;height=638&amp;amp;face=0_0_1572_638');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;끌어오기 요청 만들기 - GitHub Docs&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;리포지토리의 변경 내용을 제안하고 공동 작업하는 끌어오기 요청을 만듭니다. 이러한 변경 내용은 분기에서 제안되어 기본 분기에 완료 및 승인된 작업만 포함되도록 합니다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;docs.github.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Git</category>
      <category>github</category>
      <category>github cli</category>
      <category>PR</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/24</guid>
      <comments>https://atomicliquors.tistory.com/24#entry24comment</comments>
      <pubDate>Fri, 12 Jul 2024 01:33:28 +0900</pubDate>
    </item>
    <item>
      <title>[백준][JAVA] 3273 - 두 수의 합</title>
      <link>https://atomicliquors.tistory.com/23</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이른 아침에 산책을 나가서 아침밥을 먹다가 심심해서 예전에 실패했던 백준 문제들을 둘러보았습니다. &lt;br /&gt;실버3 문제 하나를 빠른 방법으로 풀게 되어서 공유하려고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;문제 링크&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3273&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/3273&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;주어진 배열에서 서로 다른 원소 두 개의 합이 X가 되는 경우의 수를 구하시오&quot;.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;알고리즘을 처음 배울 때 조합으로 접근했다가 어리둥절했던 문제입니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;'분명 배운 대로 했는데 왜 통과를 못하는 거지?'&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;물론 이제는 순열, 조합과 같은 완전탐색보다 훨씬 빠른 알고리즘이 많다는 걸 깨달았으니&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;더 빠른 풀이방법을 생각해 낼 줄 알아야겠죠.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;조합으로 풀 경우&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시간 제한이 1초인 문제입니다. 배열의 크기는 최대&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;100,000으로 주어집니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;배열에서 2개의 원소를 찾기 위해서는&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;이중 반복문을 순회하게 되고, &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;O(N^2) 시간복잡도를 갖게 됩니다.&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;N^2 = 100,000 * 100,000 = 10,000,000,000이고,&amp;nbsp; &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;O(N^2) 알고리즘이면 &lt;/span&gt;그 정도 크기에 준하는 연산 횟수가 발생하게 될 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1초 내에 어림잡아 1억 번(&lt;span style=&quot;background-color: #ffffff; color: #4d5156; text-align: start;&quot;&gt;100,000,000&lt;/span&gt;)의 연산만 가능할 텐데, 필요한 연산 횟수가 과하게 많습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[제출 결과]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;37&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0cfHY/btsIqObvmOA/bp171qlIpIb6XKkEnWJVx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0cfHY/btsIqObvmOA/bp171qlIpIb6XKkEnWJVx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0cfHY/btsIqObvmOA/bp171qlIpIb6XKkEnWJVx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0cfHY%2FbtsIqObvmOA%2Fbp171qlIpIb6XKkEnWJVx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;827&quot; height=&quot;37&quot; data-origin-width=&quot;827&quot; data-origin-height=&quot;37&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;* 실패 코드는 게시글 맨 아래에 정답 코드와 함께 올려두겠습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;&lt;b&gt;O(N)으로 풀 수 없을까?&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열을 순회하면서 특정 원소 a를 만났을 때,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;앞으로 X-a에 해당하는 원소가 존재한다면 정답 갯수를 1개 늘린다&amp;rdquo;라고 접근.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법이라면 &lt;span style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot;&gt;100,000번 내외의 연산으로&lt;/span&gt; &lt;u&gt;&lt;b&gt;단 한번만 배열을 순회하면서 정답을 구할 수 있습니다.&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;br /&gt;[✅ 정답 코드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720391868608&quot; class=&quot;reasonml&quot; style=&quot;background-color: #f8f8f8; color: #383a42; text-align: start;&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main_3273 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        int[] arr = new int[N];
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i &amp;lt; N; i++) {
           arr[i] = Integer.parseInt(st.nextToken());
        }
        int X = Integer.parseInt(br.readLine());
        boolean[] cache = new boolean[X];

        int result = 0;

        for (int a : arr) {
            if(a &amp;gt;= X)
                continue;
            // 모든 원소는 반드시 음수가 아니라 자연수이므,로 X보다 큰 값은 정답에 포함될 수 없습니다.
		        // 모든 원소는 1보다 크거나 같으므로 순서쌍 (X, 0)이라는 정답은 존재하지 않습니다.
		        // 따라서 a == X인 경우도 제거합니다.

            if(cache[a])
                result++;
                // 2. 현재 값이 cache에 true로 체크되어 있다면 정답 갯수를 1만큼 늘립니다.
            else
                cache[X - a] = true;
		            // 1. 구하고자 하는 수 X에서 현재 원소를 뺀 값을 cache에 true로 체크합니다. 
        }
        System.out.println(result);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[제출 결과]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;95&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdRGDZ/btsIrcJ0ko2/9vKn1qnaKktqwC0X3GzaN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdRGDZ/btsIrcJ0ko2/9vKn1qnaKktqwC0X3GzaN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdRGDZ/btsIrcJ0ko2/9vKn1qnaKktqwC0X3GzaN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdRGDZ%2FbtsIrcJ0ko2%2F9vKn1qnaKktqwC0X3GzaN1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;95&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;95&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래는 조합으로 풀었던 실패 코드이니 참고해서 보시면 되겠습니다.&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[❌실패 코드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1720390337774&quot; class=&quot;bash&quot; style=&quot;background-color: #f6f7f8; color: #555555; text-align: start;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] input = new int[N];
        for (int i = 0; i &amp;lt; N; i++) {
            input[i] = Integer.parseInt(st.nextToken());
        }
        int X = Integer.parseInt(br.readLine());
        int result = 0;

        for (int i = 0; i &amp;lt; N; i++) {
            for (int j = i; j &amp;lt; N; j++) {
                if(input[i] + input[j] == X){
                    result++;
                }
            }
        }
        System.out.println(result);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style2&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;코드와 관련된 피드백이나 질문이 있으시면 댓글 부탁드립니다.&lt;/p&gt;</description>
      <category>Algorithm</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/23</guid>
      <comments>https://atomicliquors.tistory.com/23#entry23comment</comments>
      <pubDate>Mon, 8 Jul 2024 07:40:18 +0900</pubDate>
    </item>
    <item>
      <title>[백준][JAVA] 3190 - 뱀</title>
      <link>https://atomicliquors.tistory.com/22</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;정말 오랜만에 올리는 포스팅입니다.&lt;br /&gt;백준 알고리즘 문제를 하나 풀어보도록 하겠습니다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure id=&quot;og_1678289225846&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;3190번: 뱀&quot; data-og-description=&quot;&amp;nbsp;'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/3190&quot; data-og-url=&quot;https://www.acmicpc.net/problem/3190&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/NpYW3/hyRSKXtnhk/m8fhiVvdy9cEmioClXVaz0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3190&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/3190&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/NpYW3/hyRSKXtnhk/m8fhiVvdy9cEmioClXVaz0/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;3190번: 뱀&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;'Dummy' 라는 도스게임이 있다. 이 게임에는 뱀이 나와서 기어다니는데, 사과를 먹으면 뱀 길이가 늘어난다. 뱀이 이리저리 기어다니다가 벽 또는 자기자신의 몸과 부딪히면 게임이 끝난다. 게임&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;개요&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;골드 4 난이도 시뮬레이션 문제입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;골드 난이도라지만 복잡한 알고리즘 지식이 필요한 문제는 아닙니다. &lt;br /&gt;이차원 배열과 큐 &lt;i&gt;Queue&lt;/i&gt; 정도의 자료구조를 문제풀이에 응용할 줄 알고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제의 요구사항을 꼼꼼히 구현하는 능력이 있다면 풀 수 있는 문제였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;코드&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[제출 결과]&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;231&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E0Owm/btr2RXsz1rA/PKHNJRmlbygXFPeR8Rfid1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E0Owm/btr2RXsz1rA/PKHNJRmlbygXFPeR8Rfid1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E0Owm/btr2RXsz1rA/PKHNJRmlbygXFPeR8Rfid1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE0Owm%2Fbtr2RXsz1rA%2FPKHNJRmlbygXFPeR8Rfid1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;598&quot; height=&quot;96&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;231&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[코드]&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1678289604614&quot; class=&quot;java&quot; data-ke-language=&quot;java&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_3190_뱀 {

	static int[] dR = { 0, 1, 0, -1 };
	static int[] dC = { 1, 0, -1, 0 };

	static int[][] board;
	static int N;
	static boolean over;

	static int dir;

	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		N = Integer.parseInt(br.readLine());
		int K = Integer.parseInt(br.readLine());

		board = new int[N + 1][N + 1];

		StringTokenizer st;
		for (int i = 0; i &amp;lt; K; i++) {
			st = new StringTokenizer(br.readLine());
			int r = Integer.parseInt(st.nextToken());
			int c = Integer.parseInt(st.nextToken());
			board[r][c] = 1;

		}

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

		
		int r = 1, c = 1;
		int[] tail;

		dir = 0;
		over = false;
		int elapsed = 0;

		Queue&amp;lt;int[]&amp;gt; snake = new ArrayDeque&amp;lt;&amp;gt;();
		snake.offer(new int[] { r, c });
		board[r][c] = -1;

		

		st = new StringTokenizer(br.readLine());
		int X = Integer.parseInt(st.nextToken());
		char cmd = st.nextToken().charAt(0);

		while (!over) {
			
			r += dR[dir];
			c += dC[dir];

			++elapsed;
			if (over = isOuttaBound(r, c))
				break;

			if (board[r][c] == 1) {
				snake.offer(new int[] { r, c });
				board[r][c] = -1;
			} else if (board[r][c] == 0) {
				snake.offer(new int[] { r, c });
				board[r][c] = -1;

				tail = snake.poll();
				board[tail[0]][tail[1]] = 0;

			} else if (board[r][c] == -1) {
				over = true;
				break;
			}
			
			if (elapsed == X) {
				redirect(cmd);

				if(--L &amp;gt; 0) {
					st = new StringTokenizer(br.readLine());
					X = Integer.parseInt(st.nextToken());
					cmd = st.nextToken().charAt(0);
				}else X = -1;	
			}
		}

		System.out.println(elapsed);

	}

	static boolean isOuttaBound(int r, int c) {
		if (r &amp;lt; 1 || c &amp;lt; 1 || r &amp;gt; N || c &amp;gt; N)
			return true;
		return false;
	}

	static void redirect(char cmd) {
		switch (cmd) {
		case 'L':
			dir = (dir + 3) % 4;
			break;

		case 'D':
			dir = (dir + 1) % 4;
			break;
		}
	}

}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;상세&lt;/b&gt;&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[Queue 활용]&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7CEi7/btr2Oqbtl20/StD8JBbfTkRRFBJe6pKzS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7CEi7/btr2Oqbtl20/StD8JBbfTkRRFBJe6pKzS1/img.png&quot; data-alt=&quot;뱀의 움직임은 Queue를 이용해 표현할 수 있습니다. Queue 내부에는 행/열을 나타내기 위해 2칸짜리 정수 배열을 저장했습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7CEi7/btr2Oqbtl20/StD8JBbfTkRRFBJe6pKzS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7CEi7%2Fbtr2Oqbtl20%2FStD8JBbfTkRRFBJe6pKzS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;283&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;뱀의 움직임은 Queue를 이용해 표현할 수 있습니다. Queue 내부에는 행/열을 나타내기 위해 2칸짜리 정수 배열을 저장했습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뱀의 기본 동작은 선입선출 &lt;i&gt;FIFO&lt;/i&gt; 구조의 큐로 표현할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;lsquo;새롭게 한 칸이 추가되면, 가장 오래된 한 칸이 빠져나가는&amp;rsquo; 패턴을 갖기 때문입니다. &lt;br /&gt;뱀이 현재 이차원 배열 위에서 차지하고 있는 위치 정보가 필요하기 때문에,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;큐에는 행 값과 열&amp;nbsp; 값이 들어갈 수 있는 정수 배열을 저장하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;646&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rw9c2/btr2D5Gjtve/KKlU84yfhHGDM3v5fBRnCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rw9c2/btr2D5Gjtve/KKlU84yfhHGDM3v5fBRnCK/img.png&quot; data-alt=&quot;이차원 배열 board 위에서 뱀의 현재 위치는 -1, 사과는 1로 표현됩니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rw9c2/btr2D5Gjtve/KKlU84yfhHGDM3v5fBRnCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Frw9c2%2Fbtr2D5Gjtve%2FKKlU84yfhHGDM3v5fBRnCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;271&quot; data-origin-width=&quot;1440&quot; data-origin-height=&quot;646&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;이차원 배열 board 위에서 뱀의 현재 위치는 -1, 사과는 1로 표현됩니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[게임판 구성]&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이차원 int 배열로 표현합니다. 뱀의 인덱스가 1로 주어지기 때문에 크기는 N+1로 설정합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;0&lt;/b&gt; : 아무것도 없는 빈 칸입니다. 배열을 생성할 때 자동으로 할당되는 값인 0으로 표현합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1&lt;/b&gt; : 사과의 위치를 입력받아 게임판에 1로 표현하겠습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;-1&lt;/b&gt; : 현재 뱀의 위치를 나타냅니다. 뱀의 다음 위치가 이곳이라면 게임이 종료됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;[뱀의 동작 구현]&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;델타 탐색을 이용하여 현재 위치에서 지정된 방향으로 r값 또는 c값을 한 칸 전진시킵니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;0을 만난 경우 :&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[크기 1 늘리기]&lt;/b&gt; 새로운 위치 좌표를 큐에 넣고, 게임판에서 해당 위치를 -1로 표시합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;[크기 1 줄이기]&lt;/b&gt; 큐에서 가장 오래된 위치 좌표를 제거하고, 게임판에서 해당 위치를 0으로 되돌립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;1을 만난 경우 :&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;[크기 1 늘리기]&lt;/b&gt; 새로운 위치 좌표를 큐에 넣고, 게임판에 해당 위치를 -1로 표시합니다.&lt;/li&gt;
&lt;li&gt;&lt;s&gt;[크기 1 줄이기]&lt;/s&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;사과를 먹어서 전체 크기가 1 증가하므로, 크기를 줄이는 동작을 실행하지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;-1을 만난 경우 / 맵 밖으로 벗어난 경우&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게임 종료 조건입니다. 반복문을 종료하고 경과한 시간을 출력합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일정 시간이 될 때마다 델타 탐색 배열의 인덱스를 바꿔 이동 방향을 전환합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;주의할 점&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력값으로 들어오는 행, 열 위치는 0이 아니라 1부터 시작하는 인덱스로 제시됩니다. &lt;br /&gt;배열 크기 설정과 종료조건 설정에 유의하도록 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드와 관련된 피드백이나 질문이 있으시면 댓글 부탁드립니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm</category>
      <category>Java</category>
      <category>Queue</category>
      <category>백준</category>
      <category>시뮬레이션</category>
      <category>큐</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/22</guid>
      <comments>https://atomicliquors.tistory.com/22#entry22comment</comments>
      <pubDate>Thu, 9 Mar 2023 00:43:18 +0900</pubDate>
    </item>
    <item>
      <title>[CS-운영체제] 입문</title>
      <link>https://atomicliquors.tistory.com/21</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;입과 전 적응기간을 틈타서 후순위로 밀려있던 운영체제 공부를 시작했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;야심차게 공룡책 사서 본가 책꽂이에 꽂아둔 지가 3개월째인데&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결국 타지 올라와서 생활할때까지 못 보고 왔네요. 반성해야겠습니다 흑흑&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분반 테스트 결과가 어떻게 될진 모르지만 개발자에게 중요한 지식인만큼&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간 내서 한번 배울때 확실히 배우고 넘어가도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[기반 강의] HPC&amp;nbsp;Lab.&amp;nbsp;KOREATECH 운영체제 강의&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=EdTtGv9w2sA&amp;amp;list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&amp;amp;index=1&quot;&gt;https://www.youtube.com/watch?v=EdTtGv9w2sA&amp;amp;list=PLBrGAFAIyf5rby7QylRc6JxU5lzQ9c4tN&amp;amp;index=1&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=EdTtGv9w2sA&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/ePHJm/hyRdDdqIiw/yk8IcreXK0yiU75r8DHJX1/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=0_0_1280_720&quot; data-video-width=&quot;560&quot; data-video-height=&quot;315&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/EdTtGv9w2sA&quot; width=&quot;560&quot; height=&quot;315&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;운영체제 정의 &lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제의 정의에 대해서는 의견이 분분합니다.&lt;br /&gt;본 강의에서는 운영체제를 다음과 같이 정의하고 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1) 하드웨어가 가진 컴퓨터 시스템 자원을 효율적으로 관리하여,&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2) 사용자에게 응용 프로그램을 제공하는 소프트웨어&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;운영체제의 역할&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저 인터페이스 : 편리성 제공&lt;/li&gt;
&lt;li&gt;자원관리 : 효율성 제공&lt;/li&gt;
&lt;li&gt;프로세스와 쓰레드 관리&lt;/li&gt;
&lt;li&gt;시스템 보호&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;운영체제 분류&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제는 크게 다음과 같이 분류됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- '동시 사용자 수'에 따라 싱글 유저 시스템(PC나 모바일 등 개인용 기기) 또는 멀티 유저 시스템(서버, 클러스터)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- '동시 실행 &lt;b&gt;프로세스&lt;/b&gt; 수'에 따라 싱글태스킹 시스템, 멀티태스킹 시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 '작업 수행 방식'에 따라 아래와 같이 몇 가지 분류가 나뉘는데, &lt;br /&gt;이는 컴퓨터가 발달해 온 역사와도 궤를 같이합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;순차 처리 : 운영체제 없음 (~1940s)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제가 존재하지 않던 시기의 작업방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그랬기 때문에 사용자가 기계어로 직접 프로그램을 작성하고, 하드웨어도 직접 제어해야 했습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 작성된 '천공 카드'를 입력하면 프로그램이 작동하는 방식이었고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행하는 작업별로 순차적으로 처리되었으며, 각 작업마다 일정한 준비시간이 소요되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;일괄 처리 시스템 &lt;/b&gt;&lt;i&gt;Batch Processing System&lt;/i&gt; &lt;b&gt;(1950s-60s)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 시스템을 중앙 기관에서 관리하고 운영하는 방식입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자의 작업 요청이 들어있는 천공 카드를 기관에서 모아뒀다가 한 번에 처리하였습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pros)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;중앙기관의 시스템 자원을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;여러 사용자가 공유할 수 있었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cons)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생산성이 낮다는 문제가 있었습니다. &lt;br /&gt;나의 작업이 처리되기를 기다리기 위해서 같은 유형의 작업이 모일 때까지 기다려야 했고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 과정에서 6시간에 가까운 응답 시간이 소요되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;시분할 시스템 &lt;/b&gt;&lt;i&gt;Time Sharing System&lt;/i&gt;&lt;b&gt; (1960s-70s)&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 프로그램이 시간을 조금씩 나눠 교대로 자원을 사용하는 방식입니다.&lt;br /&gt;대화형 시스템, 단말(terminal)의 도입으로 사용자 지향적이라는 특징이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Pros)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;응답시간이 약 5초 수준으로 단축되었습니다.&lt;/li&gt;
&lt;li&gt;프로세서 유휴시간이 감소하였습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Cons)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통신비 증가 : 통신선 단가와 보안 문제로 부담할 비용이 늘어났습니다.&lt;/li&gt;
&lt;li&gt;개인 사용자가 체감하는 속도는 오히려 떨어졌습니다. &lt;br /&gt;동시 사용자 수가 늘어나면 시스템 부하도 늘어났고 이는 속도 저하로 이어졌습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;병렬처리 시스템&lt;/b&gt;&lt;i&gt; Parallel Processing System&amp;nbsp;&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PC의 등장 이후 출현한 시스템입니다.&lt;br /&gt;응답시간은 빨랐지만 성능은 다소 떨어졌던 PC의 단점을 보완해 주었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'한 시스템에 여러 개의 프로세서를 사용한다'는 특징을 중심으로 아래와 같은 특성이 있습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Tightly-coupled system&lt;/b&gt; : 여러 개의 프로세서들이 메모리와 같은 자원을 서로 공유합니다.&lt;/li&gt;
&lt;li&gt;신뢰성 향상 : 하나의 프로세서가 망가져도 시스템은 정상적으로 동작할 수 있게 되었습니다.&lt;/li&gt;
&lt;li&gt;프로세서 간 관계 및 역할 관리가 추가적으로 필요하게 되었습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;분배 프로세스 시스템 &lt;/b&gt;&lt;i&gt;Distributed Processing System&lt;/i&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;ldquo;네트워크를 기반으로 병렬처리 시스템을 구축한 것&amp;rdquo;입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개별적으로 OS가 탑재된 컴퓨터가 네트워크 상에서 하나의 노드가 됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Loosely-coupled system&amp;nbsp;&lt;/li&gt;
&lt;li&gt;분산 운영체제 사용&lt;/li&gt;
&lt;li&gt;자원 공유를 통해 성능을 높였습니다.&lt;/li&gt;
&lt;li&gt;구축과 관리가 어렵다는 단점이 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;실시간 시스템 &lt;/b&gt;&lt;i&gt;Real-time Systems&lt;/i&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;작업처리에 제한시간이 걸려있는 시스템입니다. &lt;br /&gt;효율적인 자원 사용보다, 서비스 제공 시간을 엄수하는 것이 우선일 경우 사용됩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Hard real-time task&lt;/b&gt; : &lt;br /&gt;시간엄수에 실패하면 치명적 결과가 발생하는 작업입니다. &lt;br /&gt;원자력 발전소 관리, 군사병기 제어 시스템 등이 해당하겠습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Soft real-time task&lt;/b&gt; : &lt;br /&gt;동영상 스트리밍처럼 시간이 좀 늦더라도 불편할 뿐인 작업입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;하드웨어 종류&lt;/b&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;프로세서&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산 장치, 모든 컴퓨터 부속 장치의 동작을 제어하는 장치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;ldquo;컴퓨터의 두뇌&amp;rdquo;라고 할 수 있겠습니다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU(Central Processing Unit), GPU(Graphics Processing Unit)가 프로세서에 해당합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;메모리&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기억 장치, 데이터를 저장하는 장치.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 속도가 느리면 단가가 싸고, 용량을 대용량으로 만들 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;레지스터&lt;/b&gt; : &lt;br /&gt;프로세서 내부에 존재하는 메모리. 프로세서가 사용할 데이터를 저장합니다. &amp;rdquo;컴퓨터에서 가장 빠른 메모리&amp;rdquo;입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;캐시&lt;/b&gt; : &lt;br /&gt;마찬가지로 프로세서 내부에 존재합니다. &lt;br /&gt;아래의 주기억장치가 가진 데이터를 일부 저장하여, 요청이 있을 때 빠르게 데이터를 조달해 줍니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주기억장치&lt;/b&gt; : &lt;br /&gt;프로세서가 수행할 프로그램과 데이터를 저장합니다. 주로 용량이 크고 저렴한 DRAM을 사용합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;보조기억장치&lt;/b&gt; : &lt;br /&gt;컴퓨터 전원이 꺼진 뒤에도 프로그램과 데이터를 저장할 수 있는 장치입니다.&lt;br /&gt;다만 이쪽은 엄밀히 메모리 장치로 분류하진 않고 주변장치로 분류하는 것으로 보입니다.&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;주변장치&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세서와 메모리를 제외한 하드웨어들입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력장치, 출력장치, 앞서 언급한 보조기억장치가 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 내용을 학습한 뒤 운영체제의 구조와 기능에 대해 간단하게 알아보았습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;현재 진도&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[ 4강 / 총 46강 ]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Personal Log</category>
      <category>CS</category>
      <category>운영체제</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/21</guid>
      <comments>https://atomicliquors.tistory.com/21#entry21comment</comments>
      <pubDate>Sun, 8 Jan 2023 22:55:15 +0900</pubDate>
    </item>
    <item>
      <title>[논리학] 기초개념 정리</title>
      <link>https://atomicliquors.tistory.com/20</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘 공부를 하던 중 생소하게도 논리학 개념을 접하게 되었습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;충분한 논리력이 뒷받침이 되지 않는다면 알고리즘 설명을 아무리 봐도 이해를 못하거나,&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드를 정확하게 고치지 못하고 원하는 실행 결과가 나올 때까지 막연한 수정만 반복하는 함정에 빠질 수 있으므로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논리적으로 정확하게 확인하는 과정을 연습한다는 것이 학습의 취지입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;학습한 내용 및 구글링을 통해 배운 개념을 정리합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;논리 기호와 개념&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;F(Function) : &lt;/b&gt;'함수' / '개념'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;exist;(turned E) : &lt;/b&gt;'적어도 한 개가 존재한다'&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- &amp;exist;x : &lt;/b&gt;&quot;x가 존재한다&quot; / &quot;적어도 하나의 x가 존재한다&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- &amp;exist;xFx : &lt;/b&gt;&quot;어떤 x가&amp;nbsp;F를 만족한다&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;forall;(turned A) : &lt;/b&gt;'모든 ~에 대하여'&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- &amp;forall;x : &lt;/b&gt;&quot;모든 x에 대하여&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- &amp;forall;xFx : &lt;/b&gt;&quot;모든 x가 F를 만족한다&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;￢ (not) : &lt;/b&gt;부정&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;명제 앞에 붙이면 본래 명제와 반대의 진릿값(참/거짓)을 갖게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;perp; : &lt;/b&gt;모순&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- F&amp;rarr;&amp;perp;&lt;/b&gt; : 'F를 가정할 경우 모순이 생긴다'&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;p&amp;and;q : &lt;/b&gt;'p and q', p와 q를 모두 충족한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&lt;b&gt;- &amp;forall;x(Fx&amp;and;Gx) : &lt;/b&gt;모든 x는 F와 G를 만족한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;p&amp;or;q :&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;'p or q', p 또는 q를 충족한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;p&amp;equiv;q&lt;/b&gt; : p와 q는 동치&lt;i&gt;equivalent&lt;/i&gt;이다. (p와 q의 진릿값이 서로 같다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;역, 이, 대우 :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p &amp;rarr; q 라는 조건문에 대해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 역(connverse)&lt;/b&gt; : q &amp;rarr; p&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 이(inverse&lt;/b&gt;) : &lt;b&gt;￢&lt;/b&gt;p&amp;nbsp;&amp;rarr; ￢q&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- 대우 (contrapositive) :&lt;/b&gt; &lt;b&gt;￢&lt;/b&gt;q &amp;rarr; &lt;b&gt;￢&lt;/b&gt;p&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;명제식 p &amp;rarr; q의 참 / 거짓&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 전건 p가 항상 거짓이면, &lt;/b&gt;&lt;b&gt;명제식 p &amp;rarr; q&lt;/b&gt;&lt;b&gt;는 무조건 참이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예컨대 어머니가 아들에게 '전교 1등을 하면 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;용돈 백만 원을&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt; 주겠다'는 말을 했다고 생각해 봅시다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상식선에서 보면 아무리 봐도 진짜로 백만 원을 줄 것 같진 않기 때문에 어머니가 참말을 했다고 생각되진 않습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;이 때 아들이 한 번도 전교 1등을 하지 못했다면,&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어머니가 한 말이 참말인지 거짓말인지는 검증할 방법이 없으니까 '알 수 없다'고 생각하는 게 보통일 텐데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;논리학에서는 의외로 어머니가 '참말'을 했다고 간주하는 모양입니다. &lt;br /&gt;'거짓말은 하지 않았다'는 걸까요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'논리학'인 만큼 이것이 단순한 약속이라기보단 뭔가 명확한 증명이 있을 것 같은데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그런 증명이 있는지는 따로 찾아봐야겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 후건 q가 항상 참이면, &lt;/b&gt;&lt;b&gt;명제식 p &amp;rarr; q는&amp;nbsp;&lt;/b&gt;&lt;b&gt;무조건 참이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 1 + 1 = 3이라면, 2는 짝수이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 1000 &amp;lt; 10일 때, 3 * 3&amp;nbsp; = 9다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 전건이 명백히 거짓이더라도, 후건이 명백히 참이라면 명제식은 항상 참이라고 합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;명제식 변형&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2중 부정법:&lt;/b&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$&amp;sim;(&amp;sim;p)&amp;equiv;p$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;교환법칙:&lt;/b&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$p&amp;and;q&amp;equiv;q&amp;and;p$, &amp;nbsp; $p&amp;or;q&amp;equiv;q&amp;or;p$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;멱등법칙:&lt;/b&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$p&amp;and;p&amp;equiv;p$, &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$p&amp;or;p&amp;equiv;p$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;대우법칙:&lt;/b&gt; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(p&amp;rarr;q) &amp;equiv; (&amp;sim;q&amp;rarr;&amp;sim;p)$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;드 모르간의 법칙(De Morgan's laws)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$&amp;sim;(p&amp;and;q)&amp;equiv;&amp;sim;p&amp;or;&amp;sim;q$,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$&amp;sim;(p&amp;or;q)&amp;equiv;&amp;sim;p&amp;and;&amp;sim;q$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결합법칙:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$(p&amp;or;q)&amp;or;r&amp;equiv;p&amp;or;(q&amp;or;r),$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$(p&amp;and;q)&amp;and;r&amp;equiv;p&amp;and;(q&amp;and;r)$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;분배법칙:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$p&amp;and;(q&amp;or;r)&amp;equiv;(p&amp;and;q)&amp;or;(p&amp;and;r)$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$p&amp;or;(q&amp;and;r)&amp;equiv; (p&amp;or;q)&amp;and;(p&amp;or;r)$&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;진리표&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;명제식에 대해 각 명제의 진릿값을 나타낸 표를 말합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[예시] $p&amp;and;q$의 진리표 :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 33.8372%; height: 158px;&quot; border=&quot;1&quot; width=&quot;318&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;&lt;b&gt;p&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;&lt;b&gt;q&lt;/b&gt;&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;&lt;b&gt;p&amp;and;q&lt;/b&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;T&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;T&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;T&amp;nbsp;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;T&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;F&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;F&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;F&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;T&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;F&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;F&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;F&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;&amp;nbsp;F&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style2&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;수학적 귀납법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;P(1)이 참이고, 명제식 P(n) &amp;rarr; P(n+1)이 참임을 보임으로써 명제 P(n)은 모든 자연수 n에 대해 참임을 증명하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;귀류법&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참/거짓밖에 존재하지 않는 명제에 대해, 명제를 부정했을 경우 모순이 발생한다는 것을 찾아내어, 명제가 참임을 증명하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수학적 귀납법과 귀류법은 예제를 충분히 풀고 나면 별도 포스팅으로 다뤄보도록 하겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;[참고자료]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;http://sjoh.hannam.ac.kr/Science/proof/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;http://sjoh.hannam.ac.kr/Science/proof/index.html&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1673083658037&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;명제의 증명&quot; data-og-description=&quot;2.. 명제의 증명 항진(항상 참, tautology): 모든 논리적 가능성에 대하여 참인 명제를 항진이라 한다. &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p &amp;nbsp;&amp;sim;q p&amp;or;&amp;sim;q T &amp;nbsp;&amp;nbsp;F F &amp;nbsp;&amp;nbsp;T T T &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이 표를 보면 명제 p&quot; data-og-host=&quot;sjoh.hannam.ac.kr&quot; data-og-source-url=&quot;http://sjoh.hannam.ac.kr/Science/proof/index.html&quot; data-og-url=&quot;http://sjoh.hannam.ac.kr/Science/proof/index.html&quot; data-og-image=&quot;&quot;&gt;&lt;a href=&quot;http://sjoh.hannam.ac.kr/Science/proof/index.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;http://sjoh.hannam.ac.kr/Science/proof/index.html&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url();&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;명제의 증명&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;2.. 명제의 증명 항진(항상 참, tautology): 모든 논리적 가능성에 대하여 참인 명제를 항진이라 한다. &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; p &amp;nbsp;&amp;sim;q p&amp;or;&amp;sim;q T &amp;nbsp;&amp;nbsp;F F &amp;nbsp;&amp;nbsp;T T T &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 이 표를 보면 명제 p&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;sjoh.hannam.ac.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;'명제식 변형'과 관련하여 참고한 자료지만 명제의 역에 대한 설명이 틀리게 나와있는 것 같습니다.&lt;/p&gt;</description>
      <category>Personal Log</category>
      <category>논리학</category>
      <category>명제</category>
      <author>AtomicLiquors</author>
      <guid isPermaLink="true">https://atomicliquors.tistory.com/20</guid>
      <comments>https://atomicliquors.tistory.com/20#entry20comment</comments>
      <pubDate>Sat, 7 Jan 2023 18:13:45 +0900</pubDate>
    </item>
  </channel>
</rss>