<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://yeonb0.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://yeonb0.github.io/" rel="alternate" type="text/html" /><updated>2026-03-27T18:57:06+09:00</updated><id>https://yeonb0.github.io/feed.xml</id><title type="html">Bora.log</title><subtitle>Programming Something</subtitle><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><entry><title type="html">[Gold / 1238] 파티</title><link href="https://yeonb0.github.io/boj/gold/boj-1238/" rel="alternate" type="text/html" title="[Gold / 1238] 파티" /><published>2026-03-27T00:00:00+09:00</published><updated>2026-03-27T00:00:00+09:00</updated><id>https://yeonb0.github.io/boj/gold/boj-1238</id><content type="html" xml:base="https://yeonb0.github.io/boj/gold/boj-1238/"><![CDATA[<p><a href="https://www.acmicpc.net/problem/1238">문제 링크</a></p>

<hr />

<h2 id="-분류">🔷 분류</h2>
<p>그래프 이론, 최단 경로, 데이크스트라</p>

<h2 id="️-문제-설명">✒️ 문제 설명</h2>
<p>N개의 숫자로 구분된 각각의 마을에 한 명의 학생이 살고 있다.</p>

<p>어느 날 이 N명의 학생이 X (1 ≤ X ≤ N)번 마을에 모여서 파티를 벌이기로 했다. 이 마을 사이에는 총 M개의 단방향 도로들이 있고 i번째 길을 지나는데 Ti(1 ≤ Ti ≤ 100)의 시간을 소비한다.</p>

<p>각각의 학생들은 파티에 참석하기 위해 걸어가서 다시 그들의 마을로 돌아와야 한다. 하지만 이 학생들은 워낙 게을러서 최단 시간에 오고 가기를 원한다.</p>

<p>이 도로들은 단방향이기 때문에 아마 그들이 오고 가는 길이 다를지도 모른다. N명의 학생들 중 오고 가는데 가장 많은 시간을 소비하는 학생은 누구일지 구하여라.</p>

<h2 id="️-입력">⬅️ 입력</h2>
<p>첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 10,000), X가 공백으로 구분되어 입력된다. 두 번째 줄부터 M+1번째 줄까지 i번째 도로의 시작점, 끝점, 그리고 이 도로를 지나는데 필요한 소요시간 Ti가 들어온다. 시작점과 끝점이 같은 도로는 없으며, 시작점과 한 도시 A에서 다른 도시 B로 가는 도로의 개수는 최대 1개이다.</p>

<p>모든 학생들은 집에서 X에 갈수 있고, X에서 집으로 돌아올 수 있는 데이터만 입력으로 주어진다.</p>

<h2 id="️-출력">➡️ 출력</h2>
<p>첫 번째 줄에 N명의 학생들 중 오고 가는데 가장 오래 걸리는 학생의 소요시간을 출력한다.</p>

<h2 id="-코드-c">💻 코드 (C++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;utility&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;queue&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="k">typedef</span> <span class="kt">long</span> <span class="kt">long</span> <span class="n">ll</span><span class="p">;</span>
<span class="k">typedef</span> <span class="n">pair</span><span class="o">&lt;</span><span class="n">ll</span><span class="p">,</span> <span class="n">ll</span><span class="o">&gt;</span> <span class="n">node</span><span class="p">;</span>
<span class="k">const</span> <span class="n">ll</span> <span class="n">INF</span> <span class="o">=</span> <span class="mf">4e18</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">x</span><span class="p">;</span>
<span class="n">vector</span><span class="o">&lt;</span><span class="n">node</span><span class="o">&gt;</span> <span class="n">graph</span><span class="p">[</span><span class="mi">100001</span><span class="p">];</span> 
<span class="n">vector</span><span class="o">&lt;</span><span class="n">node</span><span class="o">&gt;</span> <span class="n">rev_graph</span><span class="p">[</span><span class="mi">100001</span><span class="p">];</span>

<span class="n">ll</span> <span class="n">dist</span><span class="p">[</span><span class="mi">100001</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">dist_xtoi</span><span class="p">[</span><span class="mi">100001</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">dist_itox</span><span class="p">[</span><span class="mi">100001</span><span class="p">];</span>
<span class="n">ll</span> <span class="n">ans</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="kt">void</span> <span class="nf">dijkstra</span><span class="p">(</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">node</span><span class="o">&gt;</span> <span class="n">gr</span><span class="p">[],</span> <span class="kt">int</span> <span class="n">start</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">fill</span><span class="p">(</span><span class="n">dist</span><span class="p">,</span> <span class="n">dist</span> <span class="o">+</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">INF</span><span class="p">);</span>
	
	<span class="n">priority_queue</span><span class="o">&lt;</span><span class="n">node</span><span class="p">,</span> <span class="n">vector</span><span class="o">&lt;</span><span class="n">node</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">greater</span><span class="o">&lt;&gt;&gt;</span> <span class="n">pq</span><span class="p">;</span>
	
	<span class="n">dist</span><span class="p">[</span><span class="n">start</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	<span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">({</span><span class="mi">0</span><span class="p">,</span> <span class="n">start</span><span class="p">});</span>
	
	<span class="k">while</span> <span class="p">(</span><span class="o">!</span><span class="n">pq</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span>
		<span class="k">auto</span> <span class="n">cost</span> <span class="o">=</span> <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">first</span><span class="p">;</span>
        <span class="k">auto</span> <span class="n">now</span> <span class="o">=</span> <span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">().</span><span class="n">second</span><span class="p">;</span>
		<span class="n">pq</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>
		
		<span class="k">if</span> <span class="p">(</span><span class="n">dist</span><span class="p">[</span><span class="n">now</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">cost</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
		
		<span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="o">&amp;</span><span class="n">p</span> <span class="o">:</span> <span class="n">gr</span><span class="p">[</span><span class="n">now</span><span class="p">])</span> <span class="p">{</span>
            <span class="n">ll</span> <span class="n">w</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">first</span><span class="p">;</span>
            <span class="n">ll</span> <span class="n">next</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">second</span><span class="p">;</span>
			<span class="n">ll</span> <span class="n">nextCost</span> <span class="o">=</span> <span class="n">cost</span> <span class="o">+</span> <span class="n">w</span><span class="p">;</span>
			
			<span class="k">if</span> <span class="p">(</span><span class="n">dist</span><span class="p">[</span><span class="n">next</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">nextCost</span><span class="p">)</span> <span class="p">{</span>
				<span class="n">dist</span><span class="p">[</span><span class="n">next</span><span class="p">]</span> <span class="o">=</span> <span class="n">nextCost</span><span class="p">;</span>
				<span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">({</span><span class="n">nextCost</span><span class="p">,</span> <span class="n">next</span><span class="p">});</span>
			<span class="p">}</span>
		<span class="p">}</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	<span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span> <span class="o">&gt;&gt;</span> <span class="n">m</span> <span class="o">&gt;&gt;</span> <span class="n">x</span><span class="p">;</span>
	
	<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">s</span><span class="p">,</span> <span class="n">e</span><span class="p">,</span> <span class="n">t</span><span class="p">;</span>
		<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">s</span> <span class="o">&gt;&gt;</span> <span class="n">e</span> <span class="o">&gt;&gt;</span> <span class="n">t</span><span class="p">;</span>
		<span class="n">graph</span><span class="p">[</span><span class="n">s</span><span class="p">].</span><span class="n">push_back</span><span class="p">({</span><span class="n">t</span><span class="p">,</span> <span class="n">e</span><span class="p">});</span>
		<span class="n">rev_graph</span><span class="p">[</span><span class="n">e</span><span class="p">].</span><span class="n">push_back</span><span class="p">({</span><span class="n">t</span><span class="p">,</span> <span class="n">s</span><span class="p">});</span>
	<span class="p">}</span>
	
	<span class="c1">// x -&gt; i</span>
	<span class="n">dijkstra</span><span class="p">(</span><span class="n">graph</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span>     
	<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">dist_xtoi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">dist</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
	<span class="p">}</span>
	
	<span class="c1">// i -&gt; x</span>
	<span class="n">dijkstra</span><span class="p">(</span><span class="n">rev_graph</span><span class="p">,</span> <span class="n">x</span><span class="p">);</span> 
	<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">dist_itox</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">dist</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
	<span class="p">}</span>
	
	<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">ll</span> <span class="n">temp</span> <span class="o">=</span> <span class="n">dist_xtoi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="n">dist_itox</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">dist_xtoi</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">INF</span> <span class="o">||</span> <span class="n">dist_itox</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">INF</span><span class="p">)</span> <span class="k">continue</span><span class="p">;</span>
		<span class="k">else</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">ans</span><span class="p">,</span> <span class="n">temp</span><span class="p">);</span>
	<span class="p">}</span>
	<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ans</span><span class="p">;</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="BOJ" /><category term="Gold" /><category term="C++" /><category term="그래프 이론" /><category term="데이크스트라" /><category term="최단 경로" /><summary type="html"><![CDATA[문제 링크]]></summary></entry><entry><title type="html">[Gold / 11066] 파일 합치기</title><link href="https://yeonb0.github.io/boj/gold/boj-11066/" rel="alternate" type="text/html" title="[Gold / 11066] 파일 합치기" /><published>2026-03-23T00:00:00+09:00</published><updated>2026-03-23T00:00:00+09:00</updated><id>https://yeonb0.github.io/boj/gold/boj-11066</id><content type="html" xml:base="https://yeonb0.github.io/boj/gold/boj-11066/"><![CDATA[<p><a href="https://www.acmicpc.net/problem/11066">문제 링크</a></p>

<hr />

<h2 id="-분류">🔷 분류</h2>
<p>다이나믹 프로그래밍</p>

<h2 id="️-문제-설명">✒️ 문제 설명</h2>
<p>소설가인 김대전은 소설을 여러 장(chapter)으로 나누어 쓰는데, 각 장은 각각 다른 파일에 저장하곤 한다. 소설의 모든 장을 쓰고 나서는 각 장이 쓰여진 파일을 합쳐서 최종적으로 소설의 완성본이 들어있는 한 개의 파일을 만든다. 이 과정에서 두 개의 파일을 합쳐서 하나의 임시파일을 만들고, 이 임시파일이나 원래의 파일을 계속 두 개씩 합쳐서 소설의 여러 장들이 연속이 되도록 파일을 합쳐나가고, 최종적으로는 하나의 파일로 합친다. 두 개의 파일을 합칠 때 필요한 비용(시간 등)이 두 파일 크기의 합이라고 가정할 때, 최종적인 한 개의 파일을 완성하는데 필요한 비용의 총 합을 계산하시오.</p>

<p>예를 들어, C1, C2, C3, C4가 연속적인 네 개의 장을 수록하고 있는 파일이고, 파일 크기가 각각 40, 30, 30, 50 이라고 하자. 이 파일들을 합치는 과정에서, 먼저 C2와 C3를 합쳐서 임시파일 X1을 만든다. 이때 비용 60이 필요하다. 그 다음으로 C1과 X1을 합쳐 임시파일 X2를 만들면 비용 100이 필요하다. 최종적으로 X2와 C4를 합쳐 최종파일을 만들면 비용 150이 필요하다. 따라서, 최종의 한 파일을 만드는데 필요한 비용의 합은 60+100+150=310 이다. 다른 방법으로 파일을 합치면 비용을 줄일 수 있다. 먼저 C1과 C2를 합쳐 임시파일 Y1을 만들고, C3와 C4를 합쳐 임시파일 Y2를 만들고, 최종적으로 Y1과 Y2를 합쳐 최종파일을 만들 수 있다. 이때 필요한 총 비용은 70+80+150=300 이다.</p>

<p>소설의 각 장들이 수록되어 있는 파일의 크기가 주어졌을 때, 이 파일들을 하나의 파일로 합칠 때 필요한 최소비용을 계산하는 프로그램을 작성하시오.</p>

<h2 id="️-입력">⬅️ 입력</h2>
<p>프로그램은 표준 입력에서 입력 데이터를 받는다. 프로그램의 입력은 T개의 테스트 데이터로 이루어져 있는데, T는 입력의 맨 첫 줄에 주어진다.각 테스트 데이터는 두 개의 행으로 주어지는데, 첫 행에는 소설을 구성하는 장의 수를 나타내는 양의 정수 K (3 ≤ K ≤ 500)가 주어진다. 두 번째 행에는 1장부터 K장까지 수록한 파일의 크기를 나타내는 양의 정수 K개가 주어진다. 파일의 크기는 10,000을 초과하지 않는다.</p>

<h2 id="️-출력">➡️ 출력</h2>
<p>프로그램은 표준 출력에 출력한다. 각 테스트 데이터마다 정확히 한 행에 출력하는데, 모든 장을 합치는데 필요한 최소비용을 출력한다.</p>

<h2 id="-코드-c">💻 코드 (C++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstring&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">dp</span><span class="p">[</span><span class="mi">501</span><span class="p">][</span><span class="mi">501</span><span class="p">];</span> <span class="c1">// dp[i][j] 는 i ~ j 합칠 때의 비용</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	<span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	
	<span class="kt">int</span> <span class="n">T</span><span class="p">;</span>
	<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">T</span><span class="p">;</span>
	<span class="k">while</span><span class="p">(</span><span class="n">T</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
		<span class="kt">int</span> <span class="n">k</span><span class="p">;</span>
		<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">k</span><span class="p">;</span>
		
		<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">num</span><span class="p">(</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
		<span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">sum</span><span class="p">(</span><span class="n">k</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span> 
		<span class="n">memset</span><span class="p">(</span><span class="n">dp</span><span class="p">,</span> <span class="mh">0x3f</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">dp</span><span class="p">));</span> <span class="c1">// dp 초기화</span>
		
		<span class="n">sum</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
		
		<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">k</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
			<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">num</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
			<span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">num</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
		<span class="p">}</span>
		
		<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">k</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
			<span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
		<span class="p">}</span>
		
		<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">len</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">len</span> <span class="o">&lt;</span> <span class="n">k</span><span class="p">;</span> <span class="n">len</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>       <span class="c1">// 구간 길이</span>
			<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">+</span> <span class="n">len</span> <span class="o">&lt;=</span> <span class="n">k</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>   <span class="c1">// 시작점</span>
				<span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">i</span> <span class="o">+</span> <span class="n">len</span><span class="p">;</span> <span class="c1">// 끝점</span>
				<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">mid</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="n">mid</span> <span class="o">&lt;</span> <span class="n">j</span><span class="p">;</span> <span class="n">mid</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span> 
					<span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">],</span> <span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">mid</span><span class="p">]</span> <span class="o">+</span> <span class="n">dp</span><span class="p">[</span><span class="n">mid</span><span class="o">+</span><span class="mi">1</span><span class="p">][</span><span class="n">j</span><span class="p">]);</span>
				<span class="p">}</span>
				<span class="n">dp</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+=</span> <span class="n">sum</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-</span> <span class="n">sum</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span> <span class="c1">// 최솟값에 구간 합 더하기</span>
			<span class="p">}</span>
		<span class="p">}</span>
		<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">dp</span><span class="p">[</span><span class="mi">1</span><span class="p">][</span><span class="n">k</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="sc">'\n'</span><span class="p">;</span>
	<span class="p">}</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="BOJ" /><category term="Gold" /><category term="C++" /><category term="다이나믹 프로그래밍" /><summary type="html"><![CDATA[문제 링크]]></summary></entry><entry><title type="html">[Gold / 12869] 뮤탈리스크</title><link href="https://yeonb0.github.io/boj/gold/boj-12869/" rel="alternate" type="text/html" title="[Gold / 12869] 뮤탈리스크" /><published>2026-03-23T00:00:00+09:00</published><updated>2026-03-23T00:00:00+09:00</updated><id>https://yeonb0.github.io/boj/gold/boj-12869</id><content type="html" xml:base="https://yeonb0.github.io/boj/gold/boj-12869/"><![CDATA[<p><a href="https://www.acmicpc.net/problem/12869">문제 링크</a></p>

<hr />

<h2 id="-분류">🔷 분류</h2>
<p>다이나믹 프로그래밍, 그래프 이론, 그래프 탐색, 너비 우선 탐색</p>

<h2 id="️-문제-설명">✒️ 문제 설명</h2>
<p>수빈이는 강호와 함께 스타크래프트 게임을 하고 있다. 수빈이는 뮤탈리스크 1개가 남아있고, 강호는 SCV N개가 남아있다.</p>

<p>각각의 SCV는 남아있는 체력이 주어져있으며, 뮤탈리스크를 공격할 수는 없다. 즉, 이 게임은 수빈이가 이겼다는 것이다.</p>

<p>뮤탈리스크가 공격을 할 때, 한 번에 세 개의 SCV를 공격할 수 있다.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>첫 번째로 공격받는 SCV는 체력 9를 잃는다.
두 번째로 공격받는 SCV는 체력 3을 잃는다.
세 번째로 공격받는 SCV는 체력 1을 잃는다.
</code></pre></div></div>

<p>SCV의 체력이 0 또는 그 이하가 되어버리면, SCV는 그 즉시 파괴된다. 한 번의 공격에서 같은 SCV를 여러 번 공격할 수는 없다.</p>

<p>남아있는 SCV의 체력이 주어졌을 때, 모든 SCV를 파괴하기 위해 공격해야 하는 횟수의 최솟값을 구하는 프로그램을 작성하시오.</p>

<h2 id="️-입력">⬅️ 입력</h2>
<p>첫째 줄에 SCV의 수 N (1 ≤ N ≤ 3)이 주어진다. 둘째 줄에는 SCV N개의 체력이 주어진다. 체력은 60보다 작거나 같은 자연수이다.</p>

<h2 id="️-출력">➡️ 출력</h2>
<p>첫째 줄에 모든 SCV를 파괴하기 위한 공격 횟수의 최솟값을 출력한다.</p>

<h2 id="-코드-c">💻 코드 (C++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;queue&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;utility&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;limits.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
#define INF 99999
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">n</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">hp</span><span class="p">[</span><span class="mi">61</span><span class="p">][</span><span class="mi">61</span><span class="p">][</span><span class="mi">61</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">dx</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">9</span><span class="p">};</span>

<span class="kt">int</span> <span class="n">dp</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">,</span> <span class="kt">int</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">a</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">b</span> <span class="o">==</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">c</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">hp</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">b</span><span class="p">][</span><span class="n">c</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">hp</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">b</span><span class="p">][</span><span class="n">c</span><span class="p">];</span>
	
	<span class="n">hp</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">b</span><span class="p">][</span><span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="n">INF</span><span class="p">;</span>
	
	<span class="k">do</span> <span class="p">{</span> <span class="c1">// 6 가지 경우의 수에 대해 DP </span>
    <span class="kt">int</span> <span class="n">na</span><span class="p">,</span> <span class="n">nb</span><span class="p">,</span> <span class="n">nc</span><span class="p">;</span>
		<span class="n">na</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">a</span><span class="o">-</span><span class="n">dx</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
		<span class="n">nb</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">b</span><span class="o">-</span><span class="n">dx</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
		<span class="n">nc</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">c</span><span class="o">-</span><span class="n">dx</span><span class="p">[</span><span class="mi">2</span><span class="p">]);</span>
		<span class="n">hp</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">b</span><span class="p">][</span><span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="n">hp</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">b</span><span class="p">][</span><span class="n">c</span><span class="p">],</span> <span class="n">dp</span><span class="p">(</span><span class="n">na</span><span class="p">,</span> <span class="n">nb</span><span class="p">,</span> <span class="n">nc</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
	<span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">next_permutation</span><span class="p">(</span><span class="n">dx</span><span class="p">,</span> <span class="n">dx</span><span class="o">+</span><span class="mi">3</span><span class="p">));</span> <span class="c1">// permutation 만들기</span>
    
  <span class="k">return</span> <span class="n">hp</span><span class="p">[</span><span class="n">a</span><span class="p">][</span><span class="n">b</span><span class="p">][</span><span class="n">c</span><span class="p">];</span>
<span class="p">}</span>
	

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	<span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	
	<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span><span class="p">;</span>
	<span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">a</span> <span class="o">&gt;&gt;</span> <span class="n">b</span> <span class="o">&gt;&gt;</span> <span class="n">c</span><span class="p">;</span>
	<span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="p">(</span><span class="n">n</span> <span class="o">==</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">a</span> <span class="o">&gt;&gt;</span> <span class="n">b</span><span class="p">;</span>
	<span class="p">}</span> <span class="k">else</span>
		<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">a</span><span class="p">;</span>
	<span class="kt">int</span> <span class="n">ans</span> <span class="o">=</span> <span class="n">dp</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">);</span>
	
	<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ans</span><span class="p">;</span>
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="BOJ" /><category term="Gold" /><category term="C++" /><category term="그래프 이론" /><category term="그래프 탐색" /><category term="너비 우선 탐색" /><category term="다이나믹 프로그래밍" /><summary type="html"><![CDATA[문제 링크]]></summary></entry><entry><title type="html">[Gold / 13549] 숨바꼭질 3</title><link href="https://yeonb0.github.io/boj/gold/boj-13549/" rel="alternate" type="text/html" title="[Gold / 13549] 숨바꼭질 3" /><published>2026-03-22T00:00:00+09:00</published><updated>2026-03-22T00:00:00+09:00</updated><id>https://yeonb0.github.io/boj/gold/boj-13549</id><content type="html" xml:base="https://yeonb0.github.io/boj/gold/boj-13549/"><![CDATA[<p><a href="https://www.acmicpc.net/problem/13549">문제 링크</a></p>

<hr />

<h2 id="-분류">🔷 분류</h2>
<p>그래프 이론, 그래프 탐색, 너비 우선 탐색, 최단 경로, 데이크스트라, 0-1 너비 우선 탐색</p>

<h2 id="️-문제-설명">✒️ 문제 설명</h2>
<p>수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.</p>

<p>수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.</p>

<h2 id="️-입력">⬅️ 입력</h2>
<p>첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.</p>

<h2 id="️-출력">➡️ 출력</h2>
<p>수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.</p>

<h2 id="-코드-c">💻 코드 (C++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;deque&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;limits.h&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">dist</span><span class="p">[</span><span class="mi">100001</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">ans</span><span class="p">;</span>

<span class="kt">void</span> <span class="nf">bfs</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
	<span class="n">deque</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">dq</span><span class="p">;</span>
	<span class="n">dq</span><span class="p">.</span><span class="n">push_front</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
	
	<span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="n">dq</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span>
		<span class="k">auto</span> <span class="n">cur</span> <span class="o">=</span> <span class="n">dq</span><span class="p">.</span><span class="n">front</span><span class="p">();</span>
		<span class="n">dq</span><span class="p">.</span><span class="n">pop_front</span><span class="p">();</span>
		
		<span class="k">if</span> <span class="p">(</span><span class="n">cur</span> <span class="o">==</span> <span class="n">k</span><span class="p">)</span> <span class="p">{</span>
			<span class="n">ans</span> <span class="o">=</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="p">];</span>
			<span class="k">return</span><span class="p">;</span>
		<span class="p">}</span>
		
		<span class="k">if</span> <span class="p">(</span><span class="n">cur</span><span class="o">*</span><span class="mi">2</span> <span class="o">&lt;=</span> <span class="mi">100000</span> <span class="o">&amp;&amp;</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="o">*</span><span class="mi">2</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="p">])</span> <span class="p">{</span>
			<span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="o">*</span><span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="p">];</span>
			<span class="n">dq</span><span class="p">.</span><span class="n">push_front</span><span class="p">(</span><span class="n">cur</span><span class="o">*</span><span class="mi">2</span><span class="p">);</span>
		<span class="p">}</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span> <span class="o">&lt;=</span> <span class="mi">100000</span> <span class="o">&amp;&amp;</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
			<span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
			<span class="n">dq</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">cur</span><span class="o">+</span><span class="mi">1</span><span class="p">);</span>
		<span class="p">}</span>
		<span class="k">if</span> <span class="p">(</span><span class="n">cur</span><span class="o">-</span><span class="mi">1</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="o">&amp;&amp;</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span><span class="o">+</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
			<span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">dist</span><span class="p">[</span><span class="n">cur</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
			<span class="n">dq</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">cur</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
		<span class="p">}</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	<span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	
	<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span> <span class="o">&gt;&gt;</span> <span class="n">k</span><span class="p">;</span>
	<span class="n">fill</span><span class="p">(</span><span class="n">dist</span><span class="p">,</span> <span class="n">dist</span><span class="o">+</span><span class="mi">100001</span><span class="p">,</span> <span class="n">INT_MAX</span><span class="p">);</span>
	<span class="n">dist</span><span class="p">[</span><span class="n">n</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
	
	<span class="n">bfs</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>
	<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ans</span><span class="p">;</span>
	
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="BOJ" /><category term="Gold" /><category term="0-1 너비 우선 탐색" /><category term="C++" /><category term="그래프 이론" /><category term="그래프 탐색" /><category term="너비 우선 탐색" /><category term="데이크스트라" /><category term="최단 경로" /><summary type="html"><![CDATA[문제 링크]]></summary></entry><entry><title type="html">[Gold / 12865] 평범한 배낭</title><link href="https://yeonb0.github.io/boj/gold/boj-12865/" rel="alternate" type="text/html" title="[Gold / 12865] 평범한 배낭" /><published>2026-03-19T00:00:00+09:00</published><updated>2026-03-19T00:00:00+09:00</updated><id>https://yeonb0.github.io/boj/gold/boj-12865</id><content type="html" xml:base="https://yeonb0.github.io/boj/gold/boj-12865/"><![CDATA[<p><a href="https://www.acmicpc.net/problem/12865">문제 링크</a></p>

<hr />

<h2 id="-분류">🔷 분류</h2>
<p>다이나믹 프로그래밍, 배낭 문제</p>

<h2 id="️-문제-설명">✒️ 문제 설명</h2>
<p>이 문제는 아주 평범한 배낭에 관한 문제이다.</p>

<p>한 달 후면 국가의 부름을 받게 되는 준서는 여행을 가려고 한다. 세상과의 단절을 슬퍼하며 최대한 즐기기 위한 여행이기 때문에, 가지고 다닐 배낭 또한 최대한 가치 있게 싸려고 한다.</p>

<p>준서가 여행에 필요하다고 생각하는 N개의 물건이 있다. 각 물건은 무게 W와 가치 V를 가지는데, 해당 물건을 배낭에 넣어서 가면 준서가 V만큼 즐길 수 있다. 아직 행군을 해본 적이 없는 준서는 최대 K만큼의 무게만을 넣을 수 있는 배낭만 들고 다닐 수 있다. 준서가 최대한 즐거운 여행을 하기 위해 배낭에 넣을 수 있는 물건들의 가치의 최댓값을 알려주자.</p>

<h2 id="️-입력">⬅️ 입력</h2>
<p>첫 줄에 물품의 수 N(1 ≤ N ≤ 100)과 준서가 버틸 수 있는 무게 K(1 ≤ K ≤ 100,000)가 주어진다. 두 번째 줄부터 N개의 줄에 거쳐 각 물건의 무게 W(1 ≤ W ≤ 100,000)와 해당 물건의 가치 V(0 ≤ V ≤ 1,000)가 주어진다.</p>

<p>입력으로 주어지는 모든 수는 정수이다.</p>

<h2 id="️-출력">➡️ 출력</h2>
<p>한 줄에 배낭에 넣을 수 있는 물건들의 가치합의 최댓값을 출력한다.</p>

<h2 id="-코드-c">💻 코드 (C++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">k</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">W</span><span class="p">[</span><span class="mi">102</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">V</span><span class="p">[</span><span class="mi">102</span><span class="p">];</span>
<span class="kt">int</span> <span class="n">DP</span><span class="p">[</span><span class="mi">102</span><span class="p">][</span><span class="mi">100001</span><span class="p">];</span>

<span class="kt">void</span> <span class="nf">dp</span><span class="p">()</span> <span class="p">{</span>
	<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">lim</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">lim</span> <span class="o">&lt;=</span> <span class="n">k</span><span class="p">;</span> <span class="n">lim</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
			<span class="c1">// 넣을 수 없으면</span>
			<span class="k">if</span> <span class="p">(</span><span class="n">W</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;</span> <span class="n">lim</span><span class="p">)</span> 
				<span class="n">DP</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">lim</span><span class="p">]</span> <span class="o">=</span> <span class="n">DP</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">lim</span><span class="p">];</span>
			<span class="c1">// 넣을 수 있으면</span>
			<span class="k">else</span> 
				<span class="n">DP</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">lim</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">DP</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">lim</span><span class="o">-</span><span class="n">W</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">+</span> <span class="n">V</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">DP</span><span class="p">[</span><span class="n">i</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">lim</span><span class="p">]);</span>
		<span class="p">}</span>
	<span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	<span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	
	<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span> <span class="o">&gt;&gt;</span> <span class="n">k</span><span class="p">;</span>
	
	<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">W</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&gt;&gt;</span> <span class="n">V</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
	<span class="p">}</span>
	
	<span class="n">dp</span><span class="p">();</span>
	<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">DP</span><span class="p">[</span><span class="n">n</span><span class="p">][</span><span class="n">k</span><span class="p">];</span>

	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>	
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="BOJ" /><category term="Gold" /><category term="C++" /><category term="다이나믹 프로그래밍" /><category term="배낭 문제" /><summary type="html"><![CDATA[문제 링크]]></summary></entry><entry><title type="html">[DS] Basic Concepts</title><link href="https://yeonb0.github.io/data-structure/ds-basic-concepts/" rel="alternate" type="text/html" title="[DS] Basic Concepts" /><published>2026-03-18T11:22:00+09:00</published><updated>2026-03-18T11:22:00+09:00</updated><id>https://yeonb0.github.io/data-structure/%5Bds%5D-basic-concepts</id><content type="html" xml:base="https://yeonb0.github.io/data-structure/ds-basic-concepts/"><![CDATA[<h2 id="1-system-life-cycle">1. System Life cycle</h2>

<ul>
  <li>Requirement : 요구사항. 주어진 자료 입력 + 생성해내야 하는 결과(출력)</li>
  <li>Analysis : 분석.
    <ul>
      <li>bottom-up : 밑에서 위로. 코딩에 주안점을 둠</li>
      <li>top-down : 문제를 분석해 작은 단위로 분리해 해결 → 더 좋은 방식</li>
    </ul>
  </li>
  <li>Design : 설계. 추상 데이터 타입(ADT) + 알고리즘 설계</li>
  <li>Refinement and Coding : 자료 객체에 대한 표현 선택 &amp; 알고리즘 작성</li>
  <li>Verification : 검증. 프로그램 정확성 체크, 테스트 &amp; 오류 수정
    <ul>
      <li>시간 복잡도 : running time</li>
      <li>공간 복잡도 : amount of memory used</li>
    </ul>
  </li>
</ul>

<h2 id="2-algorithm-specification">2. Algorithm Specification</h2>

<h3 id="21-알고리즘이란">2.1 알고리즘이란?</h3>

<ul>
  <li>알고리즘 : 특정한 일을 수행하는 명령어들의 유한 집합
    <ol>
      <li>Input : 입력. 외부에서 제공되는 데이터가 0개 이상 존재</li>
      <li>Output : 출력. 적어도 한 개 이상의 결과를 생성</li>
      <li>Definiteness : 각 단계들은 명확해야 함.</li>
      <li>Finiteness : 알고리즘은 유한시간 안에는 반드시 끝나야 함.</li>
      <li>Effectiveness : 모든 명령은 종이와 연필만으로 수행할 수 있을 정도로 기본적이어야 함.</li>
    </ol>
  </li>
  <li>알고리즘 표현 : 자연어, flowchart, 프로그래밍 언어</li>
</ul>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Swap Function</span>
<span class="kt">void</span> <span class="nf">swap</span><span class="p">(</span><span class="kt">int</span> <span class="o">*</span><span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="o">*</span><span class="n">y</span><span class="p">){</span>
	<span class="kt">int</span> <span class="n">temp</span> <span class="o">=</span> <span class="o">*</span><span class="n">x</span><span class="p">;</span>
    <span class="o">*</span><span class="n">x</span> <span class="o">=</span> <span class="o">*</span><span class="n">y</span><span class="p">;</span>
    <span class="o">*</span><span class="n">y</span> <span class="o">=</span> <span class="n">temp</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// Call : swap(&amp;a, &amp;b)</span>
</code></pre></div></div>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Swap Macro</span>
<span class="cp">#define SWAP(x,y,t) ((t) = (x), (x) = (y), (y) = (t)
</span></code></pre></div></div>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Selection Sort</span>
<span class="kt">void</span> <span class="nf">sort</span><span class="p">(</span><span class="kt">int</span> <span class="n">list</span><span class="p">[],</span> <span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
  	<span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">min</span><span class="p">,</span> <span class="n">temp</span><span class="p">;</span>
  	<span class="k">for</span><span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
    	<span class="n">min</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span>
    	<span class="k">for</span><span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
      	<span class="k">if</span><span class="p">(</span><span class="n">list</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">list</span><span class="p">[</span><span class="n">min</span><span class="p">])</span>
        	<span class="n">min</span> <span class="o">=</span> <span class="n">j</span><span class="p">;</span>
   		<span class="n">SWAP</span><span class="p">(</span><span class="n">list</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">list</span><span class="p">[</span><span class="n">min</span><span class="p">],</span> <span class="n">temp</span><span class="p">);</span>
  	<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<ul>
  <li>Sort 알고리즘은 n $\geq$ 1 이상의 정수들의 모음을 정렬한다.</li>
</ul>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//Compare Function</span>
<span class="kt">int</span> <span class="nf">compare</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="kt">int</span> <span class="n">y</span><span class="p">){</span>
  <span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">&lt;</span> <span class="n">y</span><span class="p">)</span> <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
  <span class="k">else</span> <span class="k">if</span><span class="p">(</span><span class="n">x</span> <span class="o">==</span> <span class="n">y</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">else</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Compare Macro</span>
<span class="cp">#define COMPARE (x,y) ((x) &lt; (y)) ? -1: ((x) == (y)) ? 0 : 1)
</span></code></pre></div></div>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Binary Search</span>
<span class="kt">int</span> <span class="nf">binsearch</span><span class="p">(</span><span class="kt">int</span> <span class="n">list</span><span class="p">[],</span> <span class="kt">int</span> <span class="n">searchnum</span><span class="p">,</span> <span class="kt">int</span> <span class="n">left</span><span class="p">,</span> <span class="kt">int</span> <span class="n">right</span><span class="p">){</span>
  <span class="kt">int</span> <span class="n">middle</span><span class="p">;</span>
  <span class="k">while</span><span class="p">(</span><span class="n">left</span> <span class="o">&lt;=</span> <span class="n">right</span><span class="p">){</span>
    <span class="n">middle</span> <span class="o">=</span> <span class="p">(</span><span class="n">left</span> <span class="o">+</span> <span class="n">right</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
    <span class="k">switch</span><span class="p">(</span><span class="n">COMPARE</span><span class="p">(</span><span class="n">list</span><span class="p">[</span><span class="n">middle</span><span class="p">],</span> <span class="n">searchnum</span><span class="p">)){</span>
      <span class="k">case</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
        <span class="n">left</span> <span class="o">=</span> <span class="n">middle</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
        <span class="k">break</span><span class="p">;</span>
      <span class="k">case</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="n">middle</span><span class="p">;</span>
      <span class="k">case</span> <span class="mi">1</span><span class="p">:</span> <span class="n">right</span> <span class="o">=</span> <span class="n">middle</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h3 id="22-재귀-알고리즘">2.2 재귀 알고리즘</h3>

<ul>
  <li>Direct recursion : 직접 순환. 함수가 그 수행이 완료되기 전에 자기 자신을 다시 호출</li>
  <li>Indirect recursion : 간접 순환. 호출 함수를 다시 호출하게 되어 있는 다른 함수를 호출</li>
  <li>[Binomial Coefficients] : 조합의 재귀적 표현</li>
  <li>[Fatorial] : 팩토리얼</li>
  <li>[Binary Search] : 이진 탐색</li>
</ul>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>BSrch[key, left, right]
	if key &lt; list[middle]
    	BSrch[key, left, middle-1]
    if key = list[middle]
    	list[middle]
    if key &gt; list[middle]
    	BSrch[key, middle+1, right]
</code></pre></div></div>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 이진 탐색 재귀적 구현</span>
<span class="kt">int</span> <span class="nf">binsearch</span><span class="p">(</span><span class="kt">int</span> <span class="n">list</span><span class="p">[],</span> <span class="kt">int</span> <span class="n">searchnum</span><span class="p">,</span> <span class="kt">int</span> <span class="n">left</span><span class="p">,</span> <span class="kt">int</span> <span class="n">right</span><span class="p">){</span>
  <span class="kt">int</span> <span class="n">middle</span><span class="p">;</span>
  <span class="k">if</span><span class="p">(</span><span class="n">left</span> <span class="o">&lt;=</span> <span class="n">right</span><span class="p">){</span>
    <span class="n">middle</span> <span class="o">=</span> <span class="p">(</span><span class="n">left</span> <span class="o">+</span> <span class="n">right</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
    <span class="k">switch</span><span class="p">(</span><span class="n">COMPARE</span><span class="p">(</span><span class="n">list</span><span class="p">[</span><span class="n">middle</span><span class="p">],</span> <span class="n">searchnum</span><span class="p">)){</span>
      <span class="k">case</span> <span class="o">-</span><span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">binsearch</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">searchnum</span><span class="p">,</span> <span class="n">middle</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">right</span><span class="p">);</span>
      <span class="k">case</span> <span class="mi">0</span><span class="p">:</span> <span class="k">return</span> <span class="n">middle</span><span class="p">;</span>
      <span class="k">case</span> <span class="mi">1</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">binsearch</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">searchnum</span><span class="p">,</span> <span class="n">left</span><span class="p">,</span> <span class="n">middle</span> <span class="o">-</span> <span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<ul>
  <li>[Fibonacci Number] : 피보나치 수열</li>
</ul>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 일반 함수</span>
<span class="kt">int</span> <span class="nf">fibo</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
	<span class="kt">int</span> <span class="n">g</span><span class="p">,</span> <span class="n">h</span><span class="p">,</span> <span class="n">f</span><span class="p">,</span> <span class="n">i</span><span class="p">;</span>
    <span class="k">if</span><span class="p">(</span><span class="n">n</span><span class="o">&gt;</span><span class="mi">1</span><span class="p">){</span>
    	<span class="n">g</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="n">h</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
        <span class="k">for</span><span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
        	<span class="n">f</span> <span class="o">=</span> <span class="n">g</span> <span class="o">+</span> <span class="n">h</span><span class="p">;</span>
            <span class="n">g</span> <span class="o">=</span> <span class="n">h</span><span class="p">;</span>
            <span class="n">h</span> <span class="o">=</span> <span class="n">f</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="n">f</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">f</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 재귀 함수</span>
<span class="kt">int</span> <span class="nf">rfibo</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
	<span class="k">if</span><span class="p">(</span><span class="n">n</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">)</span>
    	<span class="k">return</span> <span class="n">rfibo</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">rfibo</span><span class="p">(</span><span class="n">n</span><span class="o">-</span><span class="mi">2</span><span class="p">);</span>
    <span class="k">else</span> <span class="k">return</span> <span class="n">n</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<ul>
  <li>[Permutations] : 순열 생성</li>
</ul>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 순열의 재귀적 생성</span>
<span class="kt">void</span> <span class="nf">perm</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="n">list</span><span class="p">,</span> <span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
  <span class="kt">int</span> <span class="n">j</span><span class="p">,</span> <span class="n">temp</span><span class="p">;</span>
  <span class="k">if</span><span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="n">n</span><span class="p">){</span>
    <span class="k">for</span><span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
      <span class="n">printf</span><span class="p">(</span><span class="s">"%c"</span><span class="p">,</span> <span class="n">list</span><span class="p">[</span><span class="n">j</span><span class="p">]);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\\</span><span class="s">n"</span><span class="p">);</span>
  <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
  	<span class="c1">// list에 1개 이상의 문자가 들어있으면 재귀적으로 생성</span>
    <span class="k">for</span><span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="n">i</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;=</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">){</span>
      <span class="n">SWAP</span><span class="p">(</span><span class="o">&amp;</span><span class="n">list</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">list</span><span class="p">[</span><span class="n">j</span><span class="p">]);</span>
      <span class="n">perm</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">n</span><span class="p">);</span>
      <span class="n">SWAP</span><span class="p">(</span><span class="o">&amp;</span><span class="n">list</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">list</span><span class="p">[</span><span class="n">j</span><span class="p">]);</span>
    <span class="p">}</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="3-data-abstraction">3. Data Abstraction</h2>

<ul>
  <li>데이터 타입 : 객체(object)와 그 객체를 가지고 하는 연산(operation)들의 모음
    <ul>
      <li>C의 기본 데이터 타입 : <code class="language-plaintext highlighter-rouge">char</code>, <code class="language-plaintext highlighter-rouge">int</code>, <code class="language-plaintext highlighter-rouge">float</code>, <code class="language-plaintext highlighter-rouge">double</code> …</li>
      <li>여러 데이터를 grouping : <code class="language-plaintext highlighter-rouge">array</code>, <code class="language-plaintext highlighter-rouge">struct</code></li>
      <li>pointer 타입</li>
    </ul>
  </li>
  <li>추상 데이터 타입(ADT, Abstract Data Type) : 객체와 연산의 명세가 구현으로부터 분리된 데이터 타입.
→ 내부적 표현 or 구현에 대한 설명이 필요 없음
    <ul>
      <li>ADT 가 가지는 함수의 종류
        <ol>
          <li>생성자(creater)/구성자(constructor) : 지정된 타입에 맞는 새로운 인스턴스 생성</li>
          <li>변환자(transformer) : 1개 이상의 다른 인스턴스를 사용해 지정된 타입의 한 인스턴스 만듬.</li>
          <li>관찰자(observers)/보고자(reporter) : 인스턴스에 대한 정보 제공. 변화는 X</li>
        </ol>
      </li>
    </ul>
  </li>
  <li>[ADT <strong>Natural_Number</strong> ]</li>
  <li>자세한 구현을 피하기 위해 ADT 사용</li>
</ul>

<h2 id="4-performance-analysis">4. Performance Analysis</h2>

<h3 id="성능-분석의-기준">성능 분석의 기준</h3>

<ol>
  <li>프로그램이 원래의 명세와 부합하는가?</li>
  <li>정확하게 작동하는가?</li>
  <li>프로그램을 어떻게 사용하고 어떻게 수행하는지에 관한 문서화가 프로그램 내에 되어져 있는가?</li>
  <li>논리적 단위를 생성하기 위해 프로그램이 함수를 효과적으로 사용하는가?</li>
  <li>프로그램 코드는 읽기 쉬운가?
    <ul>
      <li>성능 분석</li>
    </ul>
  </li>
  <li>프로그램이 메인 메모리와 보조기억장치를 효율적으로 사용하는가?</li>
  <li>작업에 대한 프로그램의 실행 시간은 허용할 만한가?
    <ul>
      <li>Performance Analysis : 기계와 독립적인 시간 &amp; 공간에 대해 평가</li>
      <li>Performace Measurement : 기계와 독립적이지 않은(의존적인) running time 계산. 비효율적인 코드 찾을 때 사용</li>
    </ul>
  </li>
</ol>

<h3 id="41-공간-복잡도">4.1 공간 복잡도</h3>

<ul>
  <li>Fixed space requirement : 고정 공간 요구. 프로그램 입출력의 횟수나 크기와 관계 없는 공간 요구
    <ul>
      <li>명령어 공간, 단순 변수, 고정 크기의 구조화 변수, 상수 등.</li>
    </ul>
  </li>
  <li>Variable space requirement : 특정 인스턴스에 의존하는 크기를 가진 구조화 변수의 공간</li>
  <li>
    <p>전체 프로그램이 필요한 공간 : 고정 공간 + 가변 공간
→ 공간 복잡도 분석시에는 가변 공간 요구에만 관심 가짐.</p>
  </li>
  <li>공간 복잡도 구하는 예시</li>
</ul>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 단순 산술 함수</span>
<span class="kt">float</span> <span class="nf">abc</span><span class="p">(</span><span class="kt">float</span> <span class="n">a</span><span class="p">,</span> <span class="kt">float</span> <span class="n">b</span><span class="p">,</span> <span class="kt">float</span> <span class="n">c</span><span class="p">){</span>
  <span class="k">return</span> <span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="o">+</span><span class="n">b</span><span class="o">*</span><span class="n">c</span><span class="o">+</span><span class="p">(</span><span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="o">-</span><span class="n">c</span><span class="p">)</span><span class="o">/</span><span class="p">(</span><span class="n">a</span><span class="o">+</span><span class="n">b</span><span class="p">)</span><span class="o">+</span><span class="mi">4</span><span class="p">.</span><span class="mi">0</span><span class="p">;</span>
</code></pre></div></div>

<p>→ $S_{abc}(I) = 0$</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 리스트에 있는 수를 합산하기 위한 반복 함수</span>
<span class="kt">float</span> <span class="nf">sum</span><span class="p">(</span><span class="kt">float</span> <span class="n">list</span><span class="p">[],</span> <span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
  <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
  <span class="kt">float</span> <span class="n">tempSum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">for</span><span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
    <span class="n">tempSum</span> <span class="o">+=</span> <span class="n">list</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
  <span class="k">return</span> <span class="n">tempSum</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>→ $S_{n}(I) = 0$ : 인자가 pass-by-reference일 때(포인터로 전달)
→ $S_{n}(I) = n$ : 인자가 pass-by-value일 때(전체 배열 복사)</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 리스트에 있는 수를 합산하기 위한 순환 함수</span>
<span class="kt">float</span> <span class="nf">rsum</span><span class="p">(</span><span class="kt">float</span> <span class="n">list</span><span class="p">[],</span> <span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
  <span class="k">if</span><span class="p">(</span><span class="n">n</span><span class="p">)</span> <span class="k">return</span> <span class="n">rsum</span><span class="p">(</span><span class="n">list</span><span class="p">,</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="n">list</span><span class="p">[</span><span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">];</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>→ 같은 함수라도 순환 함수로 구현하면 공간 요구가 더 커짐.</p>

<h3 id="42-시간-복잡도">4.2 시간 복잡도</h3>

<ul>
  <li>
    <p>소요되는 총 시간 : 컴파일 시간 + 실행 시간
→ 시간 복잡도 분석시에는 실행 시간에만 관심 가짐.</p>
  </li>
  <li>프로그램 단계 program step : 실행 시간이 인스턴스 특성에 구문적으로 / 의미적으로 독립성을 갖는 프로그램의 단위</li>
  <li>시간 복잡도 구하는 예시</li>
</ul>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 리스트에 있는 수를 합산하기 위한 반복 함수</span>
<span class="kt">float</span> <span class="nf">sum</span><span class="p">(</span><span class="kt">float</span> <span class="n">list</span><span class="p">[],</span> <span class="kt">int</span> <span class="n">n</span><span class="p">){</span>
  <span class="kt">int</span> <span class="n">i</span><span class="p">;</span>
  <span class="kt">float</span> <span class="n">tempSum</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">for</span><span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
    <span class="n">tempSum</span> <span class="o">+=</span> <span class="n">list</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
  <span class="k">return</span> <span class="n">tempSum</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>→ 2n + 3</p>

<ul>
  <li>단계 수 테이블 방식 : 명령문에 대한 단계수(s/e, steps/execution), 빈도수(명령문이 수행되는 횟수, frequency)
    <ul>
      <li>s/e * 빈도수 = 총 단계 수 (total steps)</li>
      <li><img src="https://velog.velcdn.com/images/yeonbo_ra/post/45770e01-6c03-46d3-8b4b-516eb624cd23/image.png" alt="" /></li>
    </ul>
  </li>
  <li>같은 함수라도 case에 따라 step count가 다를 수 있다.</li>
</ul>

<h2 id="43-asymptotic-notation-o-omega-theta">4.3 Asymptotic Notation (O, $\Omega$, $\Theta$)</h2>

<ul>
  <li>Step count를 직접 구하는 대신 점근 표기법 사용</li>
</ul>

<h3 id="big-o-notation">Big-O Notation</h3>

<ul>
  <li>최고 차항만 남기기</li>
  <li>Big-O의 예시
    <ul>
      <li>3n + 2 = O(n)</li>
      <li>10n<sup>2</sup> + 4n + 2 = O(n<sup>2</sup>)</li>
      <li>6 $\cdot$ 2<sup>n</sup> + 4n<sup>2</sup> + 2 = O(2<sup>n</sup>)
<img src="https://velog.velcdn.com/images/yeonbo_ra/post/497c63eb-c1af-44f5-a7e8-f0cd101a10ec/image.png" alt="" /></li>
    </ul>
  </li>
</ul>

<h3 id="big-omega">Big-Omega</h3>

<ul>
  <li>빅오가 상한값이하면, 오메가는 하한값.</li>
  <li>작은 것 중 가장 큰 것.</li>
  <li>Big-$\Omega$의 예시
    <ul>
      <li>3n + 2 = $\Omega$(n)</li>
      <li>10n<sup>2</sup> + 4n + 2 = $\Omega$(n<sup>2</sup>)</li>
      <li>6 $\cdot$ 2<sup>n</sup> + 4n<sup>2</sup> + 2 = $\Omega$(2<sup>n</sup>)</li>
    </ul>
  </li>
</ul>

<h3 id="big-theta">Big-Theta</h3>

<ul>
  <li>Big-$\Theta$의 예시
    <ul>
      <li>3n + 2 = $\Theta$(n)</li>
      <li>10n<sup>2</sup> + 4n + 2 = $\Theta$(n<sup>2</sup>)</li>
      <li>6 $\cdot$ 2<sup>n</sup> + 4n<sup>2</sup> + 2 = $\Theta$(2<sup>n</sup>)</li>
    </ul>
  </li>
</ul>

<h3 id="시간-복잡도-구하기">시간 복잡도 구하기</h3>

<ul>
  <li>[Matrix addition]</li>
</ul>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">[][</span><span class="n">MAX_SIZE</span><span class="p">]</span> <span class="p">...){</span>
	<span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">;</span>
    <span class="k">for</span><span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">rows</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
    	<span class="k">for</span><span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">cols</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
        	<span class="n">c</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">+</span> <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">];</span>
<span class="p">}</span>
</code></pre></div></div>

<p>→ 시간 복잡도 : $\Theta$(rows * cols)</p>

<ul>
  <li>[Binary Search]
→ 시간 복잡도 : $\Theta$(log n)
    <ul>
      <li>best case : $\Theta$(1)</li>
    </ul>
  </li>
  <li>[Magic Square]</li>
</ul>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// 매직 스퀘어 프로그램</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">){</span>
  <span class="c1">// 정방형을 반복적으로 생성</span>
  <span class="kt">int</span> <span class="n">square</span><span class="p">[</span><span class="n">MAX_SIZE</span><span class="p">][</span><span class="n">MAX_SIZE</span><span class="p">];</span>
  <span class="kt">int</span> <span class="n">i</span><span class="p">,</span> <span class="n">j</span><span class="p">,</span> <span class="n">row</span><span class="p">,</span> <span class="n">column</span><span class="p">;</span>  <span class="c1">// 지수</span>
  <span class="kt">int</span> <span class="n">count</span><span class="p">;</span> <span class="c1">// 계수</span>
  <span class="kt">int</span> <span class="n">size</span><span class="p">;</span> <span class="c1">// 정방형의 크기</span>

  <span class="n">printf</span><span class="p">(</span><span class="s">"Enter the size of the square: "</span><span class="p">);</span>
  <span class="n">scanf</span><span class="p">(</span><span class="s">"%d"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">size</span><span class="p">);</span>

  <span class="c1">// 입력에 오류가 있는지 체크</span>
  <span class="k">if</span><span class="p">(</span><span class="n">size</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">size</span> <span class="o">&gt;</span> <span class="n">MAX_SIZE</span> <span class="o">+</span> <span class="mi">1</span><span class="p">){</span>
    <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"Error! Size is out of range</span><span class="se">\\</span><span class="s">n"</span><span class="p">);</span>
    <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="p">(</span><span class="n">size</span> <span class="o">%</span> <span class="mi">2</span><span class="p">)){</span>
    <span class="n">fprintf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,</span> <span class="s">"Error! Size is even</span><span class="se">\\</span><span class="s">n"</span><span class="p">);</span>
    <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
  <span class="p">}</span>

  <span class="k">for</span> <span class="p">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span>
    <span class="k">for</span><span class="p">(</span><span class="n">j</span><span class="o">=</span><span class="mi">0</span><span class="p">;</span> <span class="n">j</span><span class="o">&lt;</span><span class="n">size</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
      <span class="n">square</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="n">square</span><span class="p">[</span><span class="mi">0</span><span class="p">][(</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span> <span class="c1">// 첫 번째 행의 중앙에 1 넣기</span>
  <span class="c1">// i와 j는 현재 위치</span>
  <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="n">j</span> <span class="o">=</span> <span class="p">(</span><span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">;</span>
  <span class="k">for</span><span class="p">(</span><span class="n">count</span> <span class="o">=</span> <span class="mi">2</span><span class="p">;</span> <span class="n">count</span> <span class="o">&lt;=</span> <span class="n">size</span> <span class="o">*</span> <span class="n">size</span><span class="p">;</span> <span class="n">count</span><span class="o">++</span><span class="p">){</span>
    <span class="c1">// 다음 위치 계산</span>
    <span class="n">row</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="o">?</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>  <span class="c1">// 위로</span>
    <span class="n">column</span> <span class="o">=</span> <span class="p">(</span><span class="n">j</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="o">?</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">:</span> <span class="n">j</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>  <span class="c1">// 왼쪽으로</span>
    <span class="c1">// 이미 채워져 있는지 확인</span>
    <span class="k">if</span><span class="p">(</span><span class="n">square</span><span class="p">[</span><span class="n">row</span><span class="p">][</span><span class="n">column</span><span class="p">]){</span>  <span class="c1">// 아래로</span>
      <span class="n">i</span> <span class="o">=</span> <span class="p">(</span><span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="o">%</span> <span class="n">size</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span><span class="p">{</span>  <span class="c1">// 정방형이 비어있을 경우</span>
      <span class="n">i</span> <span class="o">=</span> <span class="n">row</span><span class="p">;</span>
      <span class="n">j</span> <span class="o">=</span> <span class="n">column</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">square</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="n">count</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="c1">// 정방형 출력</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\\</span><span class="s">nMagic Square of size %d: </span><span class="se">\\</span><span class="s">n</span><span class="se">\\</span><span class="s">n"</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span>
  <span class="k">for</span><span class="p">(</span><span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">){</span>
    <span class="k">for</span><span class="p">(</span><span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span>
      <span class="n">printf</span><span class="p">(</span><span class="s">"%5d"</span><span class="p">,</span> <span class="n">square</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">j</span><span class="p">]);</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\\</span><span class="s">n"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"</span><span class="se">\\</span><span class="s">n</span><span class="se">\\</span><span class="s">n"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>시간 복잡도 : $\Theta$(n<sup>2</sup>)</p>

<h3 id="44-실용적-복잡도">4.4 실용적 복잡도</h3>

<p><img src="https://velog.velcdn.com/images/yeonbo_ra/post/da35dc0d-55cb-4007-a87a-6e8570fa71e7/image.png" alt="" /></p>

<p><img src="https://velog.velcdn.com/images/yeonbo_ra/post/74ab5420-a837-4f30-9d08-9d669b00c267/image.png" alt="" /></p>

<p><img src="https://velog.velcdn.com/images/yeonbo_ra/post/02d9f3b2-99a2-407c-b84b-ccdd7f08a1a0/image.png" alt="" /></p>

<h2 id="5-performance-measurement">5. Performance Measurement</h2>

<ul>
  <li>시간 측정 방법 : <time.h> 사용</time.h></li>
</ul>

<table>
  <thead>
    <tr>
      <th style="text-align: left"> </th>
      <th style="text-align: left">Method1</th>
      <th style="text-align: left">Method2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">Start Timing</td>
      <td style="text-align: left">Start = clock();</td>
      <td style="text-align: left">Start = time(NULL);</td>
    </tr>
    <tr>
      <td style="text-align: left">Stop Timing</td>
      <td style="text-align: left">Stop = clock();</td>
      <td style="text-align: left">Stop = time(NULL);</td>
    </tr>
    <tr>
      <td style="text-align: left">Type returned</td>
      <td style="text-align: left">Clock_t</td>
      <td style="text-align: left">Time_t</td>
    </tr>
    <tr>
      <td style="text-align: left">Result in second</td>
      <td style="text-align: left">Duration = ((double)(Stop-Start))/CLOCKS_PER_SEC;</td>
      <td style="text-align: left">Duration=(double)difftime(Stop,Start)</td>
    </tr>
  </tbody>
</table>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="Data-Structure" /><category term="DS" /><category term="자료 구조" /><category term="시간 복잡도" /><summary type="html"><![CDATA[1. System Life cycle]]></summary></entry><entry><title type="html">[DM] Propositional Logic</title><link href="https://yeonb0.github.io/discrete-math/dm/" rel="alternate" type="text/html" title="[DM] Propositional Logic" /><published>2026-03-18T11:18:00+09:00</published><updated>2026-03-18T11:18:00+09:00</updated><id>https://yeonb0.github.io/discrete-math/%5Bdm%5D</id><content type="html" xml:base="https://yeonb0.github.io/discrete-math/dm/"><![CDATA[<h1 id="module-1-foundation-of-logic">Module #1: Foundation of Logic</h1>

<h2 id="서론">서론</h2>

<h2 id="1-basic-definition">1. Basic Definition</h2>

<p>의문문, 명령문, 감탄문 등은 참/거짓 판정이 불가하기에 명제가 아니다.
x + 1 = 2 와 같은 명제는 값이 배정되지 않은 변수(x)가 존재하므로 명제가 아니다.</p>

<h3 id="논리-연산자">논리 연산자</h3>

<dl>
  <dt><strong>부정</strong></dt>
  <dd>
    <p>p가 명제가 하면 p의 부정(negation)은</p>
  </dd>
</dl>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~p
</code></pre></div></div>

<p>로 표기된다.</p>

<p><img src="https://velog.velcdn.com/images/yeonbo_ra/post/5fa14fd5-65c9-4396-bebf-d89e33a0ccd2/image.png" alt="" /></p>

<dl>
  <dt><strong>논리곱</strong></dt>
  <dd>
    <p>p, q가 명제면 p와 q의 논리곱(conjunction)은</p>
  </dd>
</dl>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>p ∧ q
</code></pre></div></div>

<p>로 표기된다. 이는 ‘p and q’를 의미한다.</p>

<p><img src="https://velog.velcdn.com/images/yeonbo_ra/post/2ab56e45-4214-4183-9cc4-1f136e366402/image.png" alt="" /></p>

<dl>
  <dt><strong>논리합</strong></dt>
  <dd>
    <p>p, q가 명제면 논리합(disjuction)은</p>
  </dd>
</dl>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>p ∨ q
</code></pre></div></div>

<p>로 표기된다. 이는 ‘p or q’를 의미한다.</p>

<p><img src="https://velog.velcdn.com/images/yeonbo_ra/post/c4f5fe9d-2a37-4766-91c4-65368858f7f2/image.png" alt="" /></p>

<p>영어에서 or은 포괄적 논리합 / 베타적 논리합의 의미로 사용될 수 있다. 논리합 ∨은 포괄적 논리합에 대응한다.</p>

<h3 id="여러-연산자가-같이-사용될-때">여러 연산자가 같이 사용될 때</h3>

<p>부정(~) 기호가 가장 높은 우선순위를 지닌다.
∧과 ∨이 동시에 사영될을 때는 ∧이 더 높은 우선순위를 지닌다.
그렇지만 괄호를 잘 사용해 헷갈릴 일이 없도록 하자.</p>

<dl>
  <dt><strong>베타적 논리합</strong></dt>
  <dd>
    <p>베타적 논리합 : p, q가 명제면 p와 q의 베타적 논리합(disjunction)은</p>
  </dd>
</dl>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>p ⊕ q
</code></pre></div></div>

<p>로 표기된다. 이는 ‘p exclusive-or q’를 의미한다.</p>

<p><img src="https://velog.velcdn.com/images/yeonbo_ra/post/ac9f15d5-c8a1-485e-8de7-aa726ccd276e/image.png" alt="" /></p>

<dl>
  <dt><strong>조건문(함축)</strong></dt>
  <dd>
    <p>p, q가 명제면 p와 q의 조건문(implication)은</p>
  </dd>
</dl>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>p → q
</code></pre></div></div>

<p>로 표기된다. 이는 ‘if p, then  q’를 의미한다. 이때 p를 가정, q를 결론이라고 한다.</p>

<p><img src="https://velog.velcdn.com/images/yeonbo_ra/post/608e92cf-7485-4d8b-8fef-c4bb4b50fef8/image.png" alt="" /></p>

<ul>
  <li>p→q 의 영어 표현들
    <ul>
      <li>if p, q / q if p / if p, then q</li>
      <li>p only if q / q provided that p</li>
      <li>p is sufficient for q / q is necessary for p</li>
      <li>p implies q / q is implied by p</li>
      <li>when p, q / q when p / whenever p, q</li>
    </ul>
  </li>
  <li>조건문 p → q에 대해
    <ul>
      <li><strong>역(converse)</strong> : q → p</li>
      <li><strong>이(inverse)</strong> : ~p → ~q</li>
      <li><strong>대우(contrapositive)</strong> : ~q → ~p</li>
    </ul>
  </li>
</ul>

<dl>
  <dt><strong>상호 조건문</strong></dt>
  <dd>
    <p>p, q가 명제면 p와 q의 상호 조건문(biconditional statement)은</p>
  </dd>
</dl>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>p ↔ q
</code></pre></div></div>

<p>로 표기된다. 이는 ‘p if and only if(iff) q’를 의미한다.</p>

<p><img src="https://velog.velcdn.com/images/yeonbo_ra/post/f636492a-1337-4ad6-9a8d-5c384e0660a5/image.png" alt="" /></p>

<h3 id="비트bit와-비트-연산자">비트(bit)와 비트 연산자</h3>

<p><strong>비트(bit)</strong> : binary digit. 0 또는 1로 구성된 이진수</p>

<ul>
  <li>0은 <code class="language-plaintext highlighter-rouge">거짓</code>, 1은 <code class="language-plaintext highlighter-rouge">참</code>을 의미한다.</li>
  <li>+은 ‘or’을 의미하고, · 은 ‘and’를 의미한다
<img src="https://velog.velcdn.com/images/yeonbo_ra/post/e20ed3aa-81df-4c7d-8171-40a05c82cf14/image.png" alt="" /></li>
</ul>

<p><strong>비트 문자열</strong> : 0개 이상의 비트를 갖는 비트열</p>

<h2 id="2-propositional-equivalence">2. Propositional Equivalence</h2>

<ul>
  <li><strong>동치(equivalent)</strong> : 두 개의 복합명제가 <code class="language-plaintext highlighter-rouge">항상 같은 진리값</code>을 가질 경우</li>
  <li><strong>항진명제(tautology)</strong> : 복합명제를 구성하고 있는 명제 변수가 어떠한 진리값을 갖는다 하여도 전체 복합 명제의 값이 <code class="language-plaintext highlighter-rouge">항상 참</code>일 때</li>
  <li><strong>모순(contradiction)</strong> : 복합명제를 구성하고 있는 명제 변수가 어떠한 진리값을 갖는다 하여도 전체 복합 명제의 값이 <code class="language-plaintext highlighter-rouge">항상 거짓</code>일 때</li>
</ul>

<h3 id="equivalence-laws-동치-규칙들">Equivalence Laws 동치 규칙들</h3>

<p><strong>T</strong>는 <code class="language-plaintext highlighter-rouge">항진</code> 명제, <strong>F</strong>는 <code class="language-plaintext highlighter-rouge">모순</code> 명제</p>

<h3 id="동치로-논리-연산자-정의하기">동치로 논리 연산자 정의하기</h3>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="Discrete-Math" /><category term="이산 구조" /><category term="논리 연산자" /><summary type="html"><![CDATA[Module #1: Foundation of Logic]]></summary></entry><entry><title type="html">[Java] OOP</title><link href="https://yeonb0.github.io/java/java-oop/" rel="alternate" type="text/html" title="[Java] OOP" /><published>2026-03-18T11:13:00+09:00</published><updated>2026-03-18T11:13:00+09:00</updated><id>https://yeonb0.github.io/java/%5Bjava%5D-oop</id><content type="html" xml:base="https://yeonb0.github.io/java/java-oop/"><![CDATA[<h2 id="1-introduction-to-oop">1. Introduction to OOP</h2>

<h3 id="oop의-정의">OOP의 정의</h3>

<ul>
  <li><strong>Object-Oriented Programming</strong> : 객체지향적 프로그래밍
    <ul>
      <li>Object : 객체, 데이터와 메소드를 캡슐화한 class의 인스턴스 단위</li>
      <li>Class : 클래스, Object의 청사진</li>
      <li>Data : 변수, field</li>
      <li>Code : 메소드, method</li>
    </ul>
  </li>
</ul>

<h3 id="oop의-장점">OOP의 장점</h3>

<ul>
  <li>Modularity 모듈성 : 하나의 큰 덩어리를 만들기 위해 작은 모듈로 나누는 것</li>
  <li>Reusability 재사용성 : 코드를 재사용 하기 좋음</li>
  <li>Extensibility 확장성 : 존재하는 코드의 기능을 늘리기 좋음 (상속)
    <ul>
      <li>core 한 기능을 구현 해놓고 파츠를 붙임</li>
    </ul>
  </li>
  <li>Maintainability 유지성 : 부분들이 나눠져 있어 유지 보수에 좋음
    <ul>
      <li>변화가 필요한 부분에만 코드 수정</li>
    </ul>
  </li>
</ul>

<h2 id="2-classes-and-objects">2. Classes and Objects</h2>

<h3 id="class---클래스">Class - 클래스</h3>

<ul>
  <li><strong>Class</strong> : object를 만드는 청사진. 변수와 메소드를 정의함.</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Car</span><span class="o">{</span>
	<span class="nc">String</span> <span class="n">color</span><span class="o">;</span>
    <span class="kt">int</span> <span class="n">speed</span><span class="o">;</span>
    <span class="c1">//field</span>

    <span class="kt">void</span> <span class="nf">accelerate</span><span class="o">(){</span>
    	<span class="n">speed</span> <span class="o">+=</span> <span class="mi">10</span><span class="o">;</span>
    <span class="o">}</span>
    <span class="c1">// method</span>
<span class="o">}</span>
</code></pre></div></div>

<h3 id="object---객체">Object - 객체</h3>

<ul>
  <li><strong>Object</strong> : class의 인스턴스. new 키워드를 사용해서 만들어짐.</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">Car</span> <span class="n">myCar</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Car</span><span class="o">();</span>
<span class="c1">// Car 클래스의 myCar라는 새로운 객체 생성</span>
<span class="n">myCar</span><span class="o">.</span><span class="na">color</span> <span class="o">=</span> <span class="s">"red"</span><span class="o">;</span>
<span class="n">myCar</span><span class="o">.</span><span class="na">accelerate</span><span class="o">();</span>
<span class="c1">// 클래스 정의 시의 변수와 메소드 사용 가능</span>
</code></pre></div></div>

<h2 id="3-constructors-and-methods">3. Constructors and Methods</h2>

<h3 id="constructor---생성자">Constructor - 생성자</h3>

<ul>
  <li><strong>Constructor</strong> : 객체가 생성될 때 <strong>초기화</strong> 할 수 있는 특별한 메소드
    <ul>
      <li>생성자의 이름은 class 명과 동일.</li>
      <li>this 키워드 사용 가능(오직 생성자에서만 사용 가능)</li>
      <li>Overloading 가눙</li>
    </ul>
  </li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Car</span><span class="o">{</span>
		<span class="nc">String</span> <span class="n">color</span><span class="o">;</span>
    <span class="kt">int</span> <span class="n">speed</span><span class="o">;</span>

    <span class="c1">//Constructor</span>
    <span class="kd">public</span> <span class="nf">Car</span><span class="o">(</span><span class="nc">String</span> <span class="n">color</span><span class="o">,</span> <span class="kt">int</span> <span class="n">speed</span><span class="o">){</span>
	    	<span class="k">this</span><span class="o">.</span><span class="na">color</span> <span class="o">=</span> <span class="n">color</span><span class="o">;</span>
        <span class="k">this</span><span class="o">.</span><span class="na">speed</span> <span class="o">=</span> <span class="n">speed</span><span class="o">;</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<h3 id="methods---메소드">Methods - 메소드</h3>

<ul>
  <li><strong>Method</strong> : class 안에 존재하는 함수들</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Car</span><span class="o">{</span>
	<span class="nc">String</span> <span class="n">color</span><span class="o">;</span>
    <span class="kt">int</span> <span class="n">speed</span><span class="o">;</span>

    <span class="c1">// Method</span>
    <span class="kt">void</span> <span class="nf">accelerate</span><span class="o">(){</span>
    	<span class="n">speed</span> <span class="o">+=</span> <span class="mi">10</span><span class="o">;</span>
    <span class="o">}</span>

<span class="o">}</span>
</code></pre></div></div>

<h2 id="3-inheritance-and-polymorphism">3. Inheritance and Polymorphism</h2>

<h3 id="inheritance---상속">Inheritance - 상속</h3>

<ul>
  <li><strong>상속</strong> : 다른 class의 메소드와 변수를 상속 받는 것
    <ul>
      <li><code class="language-plaintext highlighter-rouge">extends</code> 키워드 사용
        <ul>
          <li>superclass : 상위 클래스</li>
          <li>subclass : 하위 클래스</li>
        </ul>
      </li>
    </ul>
  </li>
  <li>장점 : Reusability(재사용성), Hierarchy(상하관계), Overriding(오버라이딩)</li>
  <li>생성자에서 <code class="language-plaintext highlighter-rouge">super</code> 키워드 사용 가능</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Animal</span><span class="o">{</span>
	<span class="kd">private</span> <span class="nc">String</span> <span class="n">name</span><span class="o">;</span>

    <span class="c1">// Constructor</span>
    <span class="kd">public</span> <span class="nf">Animal</span><span class="o">(</span><span class="nc">String</span> <span class="n">name</span><span class="o">){</span>
    	<span class="k">this</span><span class="o">.</span><span class="na">name</span> <span class="o">=</span> <span class="n">name</span><span class="o">;</span>
    <span class="o">}</span>

    <span class="c1">// Method</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">makeSound</span><span class="o">(){</span>
    	<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Some animal Sound"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>→ 상위 클래스</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Dog</span> <span class="kd">extends</span> <span class="nc">Animal</span><span class="o">{</span>
    <span class="c1">// Constructor</span>
    <span class="kd">public</span> <span class="nf">Dog</span><span class="o">(</span><span class="nc">String</span> <span class="n">name</span><span class="o">){</span>
    	<span class="kd">super</span><span class="o">(</span><span class="n">name</span><span class="o">);</span>
    <span class="o">}</span>

    <span class="nd">@Override</span>
    <span class="kd">public</span> <span class="kt">void</span> <span class="nf">makeSound</span><span class="o">(){</span>
    	<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Bark"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>→ 하위 클래스</p>

<ul>
  <li>상속에는 다양한 형태가 있다.
<img src="https://velog.velcdn.com/images/yeonbo_ra/post/10dc28ce-bcc3-40e1-bbb6-e5e95aecc1b2/image.png" alt="" /></li>
</ul>

<h3 id="polymorphism---다형성">Polymorphism - 다형성</h3>

<ul>
  <li><strong>Method Overriding</strong> : 상위 클래스의 메소드를 하위 클래스에서 재사용 하는 것</li>
  <li><strong>Method Overloading</strong> : 같은 이름, 다른 인자를 가지는 메소드를 만드는 것. <code class="language-plaintext highlighter-rouge">반드시 다른 인자를 가져야 함.</code></li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">MathOperations</span><span class="o">{</span>
	<span class="c1">// 두 정수 더하기</span>
    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">add</span><span class="o">(</span><span class="kt">int</span> <span class="n">a</span><span class="o">,</span> <span class="kt">int</span> <span class="n">b</span><span class="o">)</span>
    	<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="o">;</span>

    <span class="c1">// 세 정수 더하기로 overloading</span>
    <span class="kd">public</span> <span class="kt">int</span> <span class="nf">add</span><span class="o">(</span><span class="kt">int</span> <span class="n">a</span><span class="o">,</span> <span class="kt">int</span> <span class="n">b</span><span class="o">,</span> <span class="kt">int</span> <span class="n">c</span><span class="o">)</span>
    	<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="o">+</span> <span class="n">c</span><span class="o">;</span>

    <span class="c1">// 두 실수 더하기로 overloading</span>
    <span class="kd">public</span> <span class="kt">double</span> <span class="nf">add</span><span class="o">(</span><span class="kt">double</span> <span class="n">a</span><span class="o">,</span> <span class="kt">double</span> <span class="n">b</span><span class="o">)</span>
    	<span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>

<ul>
  <li><strong>Dynamic Method Dispatch</strong> : 동적 메소드 디스패치. 하위 클래스는 상위 클래스를 대체할 수 있다.</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">){</span>
	<span class="nc">Animal</span> <span class="n">myDog</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Dog</span><span class="o">(</span><span class="s">"Buddy"</span><span class="o">);</span>
    <span class="nc">Animal</span> <span class="n">myCat</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Cat</span><span class="o">(</span><span class="s">"Whiskers"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<ul>
  <li>Animal 배열에 myDog, myCat이 들어갈 수 있다(Animal class를 상속하고 있기 때문에)</li>
</ul>

<h2 id="4-encapsulation-and-abstraction">4. Encapsulation and Abstraction</h2>

<h3 id="encapsulation---캡슐화">Encapsulation - 캡슐화</h3>

<ul>
  <li>접근 권한을 제한하기 위해 사용</li>
  <li>접근 제한자를 활용한 데이터 숨김 → 함부로 열 수 없다</li>
  <li>Getter &amp; Setter</li>
</ul>

<h3 id="access-modifier---접근-제한자">Access Modifier - 접근 제한자</h3>

<ul>
  <li><strong>default</strong> : 기본값. 같은 package 내에서 사용 가능</li>
  <li><strong>public</strong> : 어디에서나, 누구나 사용 가능</li>
  <li><strong>private</strong> : class 내부에서만 사용 가능</li>
  <li><strong>protected</strong> : 같은 package + package 밖의 상속된 하위 클래스에서 사용 가능
    <ul>
      <li>보안 수준 : private &lt; default &lt; protected &lt; public</li>
      <li>package 패키지 : 다른 패키지의 class를 이용하기 위해선 import 사용해야 한다.</li>
    </ul>
  </li>
</ul>

<h3 id="abstraction---추상화">Abstraction - 추상화</h3>

<ul>
  <li>디테일이 없는, 모양만 잡아둔 것. class, method 에 사용할 수 있다</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Shape</span><span class="o">{</span> <span class="c1">// 추상 클래스</span>
	<span class="kd">abstract</span> <span class="kt">double</span> <span class="nf">area</span><span class="o">();</span>  <span class="c1">// 추상 메소드</span>
<span class="o">}</span>
</code></pre></div></div>

<ul>
  <li>추상 메소드는 내부에 코드를 작성하지 않는다.</li>
</ul>

<h2 id="5-interfaces-and-abstract-classes">5. Interfaces and Abstract Classes</h2>

<h3 id="abstract-class---추상-클래스">Abstract Class - 추상 클래스</h3>

<ul>
  <li>class이지만 인스턴스를 생성할 수 없다. <code class="language-plaintext highlighter-rouge">상속</code>의 역할.</li>
  <li>추상 메소드 + 일반 메소드 both 생성 가능</li>
  <li>변수 포함 가능</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">abstract</span> <span class="kd">class</span> <span class="nc">Shape</span><span class="o">{</span>
	<span class="kt">double</span> <span class="n">length</span><span class="o">;</span>  <span class="c1">// 변수</span>

    <span class="kd">abstract</span> <span class="kt">double</span> <span class="nf">area</span><span class="o">();</span>  <span class="c1">// 추상 메소드</span>
    <span class="kt">void</span> <span class="nf">display</span><span class="o">(){</span>  <span class="c1">// 일반 메소드</span>
    	<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Displaying Shape"</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<ul>
  <li>상속 후 <code class="language-plaintext highlighter-rouge">overriding</code>을 통해 메소드의 세부 내용을 채워야 함.</li>
  <li><code class="language-plaintext highlighter-rouge">A는 B다</code>의 관계
    <ul>
      <li>고양이는 동물이다</li>
      <li>직사각형은 도형이다</li>
    </ul>
  </li>
</ul>

<h3 id="interface-인터페이스">Interface 인터페이스</h3>

<ul>
  <li>추상 메소드만 포함 가능.</li>
  <li>클래스와 상관없이 사용 가능.</li>
  <li><code class="language-plaintext highlighter-rouge">implements</code> 키워드 사용. 한 번에 다양한 인터페이스 implement 가능</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">interface</span> <span class="nc">Sound</span> <span class="o">{</span>
	<span class="kt">void</span> <span class="nf">makeSound</span><span class="o">();</span>
<span class="o">}</span>

<span class="kd">class</span> <span class="nc">Dog</span> <span class="kd">implements</span> <span class="nc">Sound</span><span class="o">{</span>
	<span class="nd">@Override</span>
	<span class="kd">public</span> <span class="kt">void</span> <span class="nf">makeSound</span><span class="o">(){</span>
    	<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Bark"</span><span class="o">);</span>
    <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<ul>
  <li><code class="language-plaintext highlighter-rouge">기능</code>에 관한 내용
    <ul>
      <li>동물은 귀여운 소리를 낸다</li>
      <li>로봇은 귀여운 소리를 낸다</li>
    </ul>
  </li>
</ul>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="Java" /><category term="Java" /><category term="OOP" /><summary type="html"><![CDATA[1. Introduction to OOP]]></summary></entry><entry><title type="html">[Java] Java Basics</title><link href="https://yeonb0.github.io/java/java-java-basics/" rel="alternate" type="text/html" title="[Java] Java Basics" /><published>2026-03-18T11:10:00+09:00</published><updated>2026-03-18T11:10:00+09:00</updated><id>https://yeonb0.github.io/java/%5Bjava%5D-java-basics</id><content type="html" xml:base="https://yeonb0.github.io/java/java-java-basics/"><![CDATA[<h2 id="1-java-syntax-and-structure">1. Java Syntax and Structure</h2>

<h3 id="자바-프로그램의-기본-구조">자바 프로그램의 기본 구조</h3>

<ul>
  <li>class : object 를 만드는 청사진. 변수와 메소드로 구성</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">ClassName</span><span class="o">{</span>
 	<span class="c1">// fields 변수</span>
    <span class="c1">// methods 함수</span>
<span class="o">}</span>
</code></pre></div></div>

<ul>
  <li>main 함수 : 실행의 시작점. 클래스에 1개만 존재할 수 있음</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span><span class="o">[]</span> <span class="n">args</span><span class="o">)</span> <span class="o">{</span>
  	<span class="c1">// 실행할 코드</span>
<span class="o">}</span>
</code></pre></div></div>

<h3 id="문법-규칙">문법 규칙</h3>

<ul>
  <li>대문자 / 소문자 구별</li>
  <li>이름 짓는 규칙
    <ul>
      <li>class : 대문자 시작, <code class="language-plaintext highlighter-rouge">CamelCase</code> 사용
<code class="language-plaintext highlighter-rouge">MyClass</code></li>
      <li>메소드 &amp; 변수 : 소문자 시작, <code class="language-plaintext highlighter-rouge">camelCase</code> 사용
<code class="language-plaintext highlighter-rouge">myVariable</code> / <code class="language-plaintext highlighter-rouge">myMethod</code></li>
      <li>상수 : 대문자로만 작성, 공백은 <code class="language-plaintext highlighter-rouge">_</code> 사용
<code class="language-plaintext highlighter-rouge">MAX_VALUE</code></li>
    </ul>
  </li>
  <li>주석
    <ul>
      <li>한 줄 주석 : <code class="language-plaintext highlighter-rouge">//</code></li>
      <li>여러 줄 주석 : <code class="language-plaintext highlighter-rouge">/* */</code></li>
      <li>Documentation Comments : <code class="language-plaintext highlighter-rouge">/** */</code></li>
    </ul>
  </li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">Class</span><span class="o">{</span>
	<span class="c1">// 한 줄 주석</span>

    <span class="cm">/* 여러 줄
       주석 */</span>

    <span class="cm">/**
     * Documentation
     * Comments
     */</span>
 <span class="o">}</span>
</code></pre></div></div>

<h2 id="2-data-types-variavles-and-operators">2. Data Types, Variavles, and Operators</h2>

<h3 id="원시-데이터-타입">원시 데이터 타입</h3>

<ul>
  <li>정수</li>
</ul>

<table>
  <thead>
    <tr>
      <th style="text-align: left">byte</th>
      <th style="text-align: left">short</th>
      <th style="text-align: left">int</th>
      <th style="text-align: left">long</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">8 bit</td>
      <td style="text-align: left">16bit</td>
      <td style="text-align: left">32 bit</td>
      <td style="text-align: left">64 bit</td>
    </tr>
    <tr>
      <td style="text-align: left">~128 ~ 127</td>
      <td style="text-align: left">-32,768 ~ 32,767</td>
      <td style="text-align: left">-2<sup>31</sup> ~ 2<sup>31</sup>-1</td>
      <td style="text-align: left">-2<sup>63</sup> ~ 2<sup>63</sup>-1</td>
    </tr>
  </tbody>
</table>

<ul>
  <li>실수</li>
</ul>

<table>
  <thead>
    <tr>
      <th style="text-align: left">float</th>
      <th style="text-align: left">double</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">32 bit</td>
      <td style="text-align: left">64 bit</td>
    </tr>
  </tbody>
</table>

<ul>
  <li>기타 타입</li>
</ul>

<table>
  <thead>
    <tr>
      <th style="text-align: left">char</th>
      <th style="text-align: left">boolean</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">16 bit</td>
      <td style="text-align: left">1 bit</td>
    </tr>
    <tr>
      <td style="text-align: left">0 ~ 65,535</td>
      <td style="text-align: left">true / false</td>
    </tr>
  </tbody>
</table>

<h3 id="변수와-변수의-범위">변수와 변수의 범위</h3>

<ul>
  <li>변수의 선언과 초기화</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">number</span><span class="o">;</span>  <span class="c1">// 선언</span>
<span class="n">number</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span> <span class="c1">// 초기화</span>
<span class="kt">int</span> <span class="n">number</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span> <span class="c1">// 선언과 동시에 초기화 가능</span>
</code></pre></div></div>

<h3 id="변수의-범위">변수의 범위</h3>

<ul>
  <li>지역 변수 : 메소드나 중괄호 블럭 내에 선언된 변수. 벗어날 시 소멸</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">void</span> <span class="nf">myMethod</span><span class="o">(){</span>
	<span class="kt">int</span> <span class="n">localVar</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span>  <span class="c1">// myMethod 내부에서만 존재하는 지역 변수</span>
<span class="o">}</span>
<span class="c1">// 메소드 밖으로 나가면 소멸</span>
</code></pre></div></div>

<ul>
  <li>인스턴스 변수(객체 변수) : 클래스 안에 있지만 메소드 밖에 있는 변수. 객체(인스턴스) 당 하나
→ 클래스 안 모든 메소드에서 사용 가능. 객체(인스턴스) 소멸 시 같이 소멸</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">myClass</span><span class="o">{</span>
	<span class="kt">int</span> <span class="n">instanceVar</span><span class="o">;</span>  <span class="c1">// myClass 안에서 존재하는 인스턴스 변수</span>
<span class="o">}</span>
</code></pre></div></div>

<ul>
  <li>static variable 정적 변수, 클래스 변수 : static 키워드가 붙은 클래스 변수
    <ul>
      <li>같은 클래스를 가지는 모든 객체(인스턴스)가 공유. 클래스 당 하나</li>
      <li>클래스가 로딩되는 시점에 생겨남. (객체 생성 이전)</li>
    </ul>
  </li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kd">class</span> <span class="nc">myClass</span><span class="o">{</span>
	<span class="kd">static</span> <span class="kt">int</span> <span class="n">classVar</span><span class="o">;</span>  <span class="c1">// 같은 클래스를 가진 모든 객체가 공유하는 변수</span>
<span class="o">}</span>
</code></pre></div></div>

<h3 id="연산자">연산자</h3>

<ul>
  <li>비교 연산자</li>
</ul>

<table>
  <thead>
    <tr>
      <th style="text-align: left">==</th>
      <th style="text-align: left">!=</th>
      <th style="text-align: left">&gt;</th>
      <th style="text-align: left">&gt;=</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">같을 때 참</td>
      <td style="text-align: left">다를 때 참</td>
      <td style="text-align: left">클 때 참</td>
      <td style="text-align: left">크거나 같을 때 참</td>
    </tr>
  </tbody>
</table>

<ul>
  <li>논리 연산자</li>
</ul>

<table>
  <thead>
    <tr>
      <th style="text-align: left">&amp;&amp;</th>
      <th style="text-align: left"> </th>
      <th style="text-align: left"> </th>
      <th> </th>
      <th>!</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: left">AND</td>
      <td style="text-align: left">OR</td>
      <td style="text-align: left">NOT</td>
      <td> </td>
      <td> </td>
    </tr>
  </tbody>
</table>

<h2 id="3-control-flow-statements">3. Control Flow Statements</h2>

<h3 id="조건문">조건문</h3>

<ul>
  <li>if, else if, else</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">number</span> <span class="o">=</span> <span class="mi">10</span><span class="o">;</span>
<span class="k">if</span> <span class="o">(</span><span class="n">number</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
	<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Positive"</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="k">if</span> <span class="o">(</span><span class="n">number</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
	<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Negative"</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
	<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Zero"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<ul>
  <li>switch</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">day</span> <span class="o">=</span> <span class="mi">3</span><span class="o">;</span>
<span class="k">switch</span><span class="o">(</span><span class="n">day</span><span class="o">)</span> <span class="o">{</span>
	<span class="k">case</span> <span class="mi">1</span> <span class="o">:</span>
		<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Monday"</span><span class="o">);</span>
		<span class="k">break</span><span class="o">;</span>
	<span class="k">case</span> <span class="mi">2</span> <span class="o">:</span>
		<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Tuesday"</span><span class="o">);</span>
		<span class="k">break</span><span class="o">;</span>
	<span class="k">case</span> <span class="mi">3</span> <span class="o">:</span>
		<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Wednesday"</span><span class="o">);</span>
		<span class="k">break</span><span class="o">;</span>
	<span class="k">default</span><span class="o">:</span>
		<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Other day"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<h3 id="반복문">반복문</h3>

<ul>
  <li>for</li>
  <li>while</li>
  <li>do ~ while</li>
</ul>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span>
<span class="k">do</span> <span class="o">{</span>
	<span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Iteration: "</span> <span class="o">+</span> <span class="n">i</span><span class="o">);</span>
	<span class="n">i</span><span class="o">++;</span>
<span class="o">}</span> <span class="k">while</span> <span class="o">(</span><span class="n">i</span><span class="o">&lt;</span><span class="mi">5</span><span class="o">);</span>
</code></pre></div></div>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="Java" /><category term="Java" /><summary type="html"><![CDATA[1. Java Syntax and Structure]]></summary></entry><entry><title type="html">[Silver / 2865] 나는 위대한 슈퍼스타K</title><link href="https://yeonb0.github.io/boj/silver/boj-2865/" rel="alternate" type="text/html" title="[Silver / 2865] 나는 위대한 슈퍼스타K" /><published>2026-03-18T00:00:00+09:00</published><updated>2026-03-18T00:00:00+09:00</updated><id>https://yeonb0.github.io/boj/silver/boj-2865</id><content type="html" xml:base="https://yeonb0.github.io/boj/silver/boj-2865/"><![CDATA[<p><a href="https://www.acmicpc.net/problem/2865">문제 링크</a></p>

<hr />

<h2 id="-분류">🔷 분류</h2>
<p>그리디 알고리즘, 정렬</p>

<h2 id="️-문제-설명">✒️ 문제 설명</h2>
<p>상근이는 한국 최고의 가수를 뽑는 “나는 위대한 슈퍼스타K”의 감독이다. 상근이는 다음과 같이 참가자를 선발하려고 한다.</p>

<p>“나는 위대한 슈퍼스타K”의 예선에는 N명이 참가했고, 서로 다른 M개 장르에 대한 오디션을 보았다. 심사위원은 모든 참가자의 각 장르에 대한 능력을 점수로 매겼다. 이 점수는 실수로 나타낸다.</p>

<p>본선에는 총 K명이 나갈 수 있다. 각 참가자는 본선에서 단 하나의 장르만 부를 수 있고, 이 장르는 상근이가 정해준다. 한 사람이 여러 장르를 부를 수는 없지만, 여러 사람이 같은 장르를 부를 수는 있다.</p>

<p>모든 참가자의 각 장르에 대한 능력이 주어진다. 이때, 능력의 합이 최대가 되도록 참가자와 장르를 선택하는 프로그램을 작성하시오.</p>

<h2 id="️-입력">⬅️ 입력</h2>
<p>첫째 줄에 N, M, K가 주어진다. (1 ≤ M ≤ 100, 1 ≤ K ≤ N ≤ 100)</p>

<p>다음 M개의 줄은 각 장르에 대한 참가자의 능력이 주어진다. 이 줄에는 N개의 (i, s)쌍이 주어진다. 여기서 i는 참가자의 번호, s는 그 참가자의 장르에 대한 능력이다. 이 쌍은 능력이 감소하는 순서대로 주어진다. 참가자의 번호는 1부터 N까지 이다.</p>

<p>각 줄에 모든 학생은 한 번씩 등장한다.</p>

<h2 id="️-출력">➡️ 출력</h2>
<p>첫째 줄에 본선 참가자의 능력의 합을 소수점 첫째자리까지 반올림해 출력한다.</p>

<h2 id="-코드-c">💻 코드 (C++)</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;utility&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
</span><span class="k">using</span> <span class="k">namespace</span> <span class="n">std</span><span class="p">;</span>

<span class="kt">float</span> <span class="n">score</span><span class="p">[</span><span class="mi">101</span><span class="p">];</span>
<span class="kt">bool</span> <span class="n">vis</span><span class="p">[</span><span class="mi">101</span><span class="p">];</span>
<span class="kt">float</span> <span class="n">ans</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">ios</span><span class="o">::</span><span class="n">sync_with_stdio</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	<span class="n">cin</span><span class="p">.</span><span class="n">tie</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
	
	<span class="kt">int</span> <span class="n">n</span><span class="p">,</span> <span class="n">m</span><span class="p">,</span> <span class="n">k</span><span class="p">;</span>
	<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">n</span> <span class="o">&gt;&gt;</span> <span class="n">m</span> <span class="o">&gt;&gt;</span> <span class="n">k</span><span class="p">;</span>
	
	<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">m</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
		<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="n">n</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
			<span class="kt">int</span> <span class="n">person</span><span class="p">;</span>
			<span class="kt">float</span> <span class="n">sco</span><span class="p">;</span>
			<span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">person</span> <span class="o">&gt;&gt;</span> <span class="n">sco</span><span class="p">;</span>
			<span class="n">score</span><span class="p">[</span><span class="n">person</span><span class="p">]</span> <span class="o">=</span> <span class="n">max</span><span class="p">(</span><span class="n">score</span><span class="p">[</span><span class="n">person</span><span class="p">],</span> <span class="n">sco</span><span class="p">);</span>
		<span class="p">}</span>
	<span class="p">}</span>
	
	<span class="n">sort</span><span class="p">(</span><span class="n">score</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">score</span> <span class="o">+</span> <span class="n">n</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
	
	<span class="k">for</span><span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span> <span class="n">i</span> <span class="o">&gt;</span> <span class="n">n</span> <span class="o">-</span> <span class="n">k</span><span class="p">;</span> <span class="n">i</span><span class="o">--</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">ans</span> <span class="o">+=</span> <span class="n">score</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
	<span class="p">}</span>
    
    <span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">fixed</span><span class="p">;</span>
    <span class="n">cout</span><span class="p">.</span><span class="n">precision</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>        
	<span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">ans</span><span class="p">;</span>
	
	<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>]]></content><author><name>연보라</name><email>kby7576@sogang.ac.kr</email></author><category term="BOJ" /><category term="Silver" /><category term="C++" /><category term="그리디 알고리즘" /><category term="정렬" /><summary type="html"><![CDATA[문제 링크]]></summary></entry></feed>