<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>hwang_bbang.log</title>
        <link>https://velog.io/</link>
        <description>https://hwangbbang.tistory.com/</description>
        <lastBuildDate>Thu, 16 Feb 2023 03:51:32 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>hwang_bbang.log</title>
            <url>https://velog.velcdn.com/images/hwang_bbang/profile/baf7f654-947c-467d-ae43-1dc9d81e6f08/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. hwang_bbang.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/hwang_bbang" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[PS][BOJ/2565]- 전깃줄 ]]></title>
            <link>https://velog.io/@hwang_bbang/PSBOJ2565-%EC%A0%84%EA%B9%83%EC%A4%84</link>
            <guid>https://velog.io/@hwang_bbang/PSBOJ2565-%EC%A0%84%EA%B9%83%EC%A4%84</guid>
            <pubDate>Thu, 16 Feb 2023 03:51:32 GMT</pubDate>
            <description><![CDATA[<p> <img src="https://velog.velcdn.com/images/hwang_bbang/post/dba25402-f5e1-41de-9c20-5cb624e2623b/image.png" alt=""></p>
<h3 id="문제-설명">문제 설명</h3>
<p>두 전봇대 A와 B 사이에 하나 둘씩 전깃줄을 추가하다 보니 전깃줄이 서로 교차하는 경우가 발생하였다. 합선의 위험이 있어 이들 중 몇 개의 전깃줄을 없애 전깃줄이 교차하지 않도록 만들려고 한다.</p>

<p>예를 들어, < 그림 1 >과 같이 전깃줄이 연결되어 있는 경우 A의 1번 위치와 B의 8번 위치를 잇는 전깃줄, A의 3번 위치와 B의 9번 위치를 잇는 전깃줄, A의 4번 위치와 B의 1번 위치를 잇는 전깃줄을 없애면 남아있는 모든 전깃줄이 서로 교차하지 않게 된다.</p>

<p style="text-align: center;"><img alt="" src="https://upload.acmicpc.net/d90221dd-eb80-419f-bdfb-5dd4ebac23af/-/preview/" style="width: 183px; height: 288px;"></p>

<p style="text-align: center;">< 그림 1 ></p>

<p>전깃줄이 전봇대에 연결되는 위치는 전봇대 위에서부터 차례대로 번호가 매겨진다. 전깃줄의 개수와 전깃줄들이 두 전봇대에 연결되는 위치의 번호가 주어질 때, 남아있는 모든 전깃줄이 서로 교차하지 않게 하기 위해 없애야 하는 전깃줄의 최소 개수를 구하는 프로그램을 작성하시오.</p>

<h3 id="입력">입력</h3>
 <p>첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는 위치의 번호가 차례로 주어진다. 위치의 번호는 500 이하의 자연수이고, 같은 위치에 두 개 이상의 전깃줄이 연결될 수 없다.</p>

<h3 id="출력">출력</h3>
 <p>첫째 줄에 남아있는 모든 전깃줄이 서로 교차하지 않게 하기 위해 없애야 하는 전깃줄의 최소 개수를 출력한다.</p>

<h3 id="문제-분석-과정">문제 분석 과정</h3>
<p>문제를 분석하는 과정에서 시행착오가 있었다. 
첫 시도는 데이터를 튜플형태로 받은 후 각 인덱스 마다 교차하는 갯수를 구하였다. 
그리고 2차원 dp 테이블을 활용하여 dp 테이블을 초기화 시켜간후,
교차하는 갯수가 0일 때 활성화된 인덱스가 최소인 것을 찾으려했다.</p>
<pre><code class="language-python"> dp = [0]*(n+1)
 ALinkB = [(0,0)]

 for _ in range(n):
     ALinkB.append(tuple(map(int,input().split())))

 for i in range(1,n+1):
     for j in range(1,n+1):
         if isCross(i,j):
             cross[i] += 1
</code></pre>
<p>교차함을 확인하는 함수 </p>
<pre><code class="language-python">def isCross(x,y):
    if x != y:
        if ALinkB[x][0] &lt; ALinkB[y][0] and ALinkB[y][1] &lt; ALinkB[x][1]:
            return True
        if ALinkB[x][0] &gt; ALinkB[y][0] and ALinkB[y][1] &gt; ALinkB[x][1]:
            return True
    return False</code></pre>
<p>그렇다. 진심 개어렵다. 코드를 짜내려가다보니 이방법이 아닌것 같다는 생각이들어서 테스트 케이스를 분석해보았다.</p>
<p>문제 예시를 통한 분석을 해보자 . 
문제설명에서 주어진 (1,8),(3,9),(4,1) 이 녀석들은 제거되는 녀석들이다.</p>
<blockquote>
</blockquote>
<p>8
1 8 (X)
2 2
3 9 (X)
4 1 (X)
6 4
7 6
9 7
10 10</p>
<p>B를 관찰해 보면 2, 4, 6, 7, 10 로 증가 하는 수열임을 알 수 있다.
없애는 전기줄이 최소이기 위해선 가장 긴 증가 수열을 만들면 된다.
우선 입력받은 리스트(튜플)을 정렬하고 
리스트[][1] 은 하나의 리스트이므로 이 리스트에대한 가장 긴 증가 수열을 만들어보자.</p>
<p><a href="https://hwangbbang.tistory.com/12">가장 긴 증가 수열</a>은 에서 볼 수 확인 할 수 있다.</p>
<h4 id="소스코드">소스코드</h4>
<pre><code class="language-python">

n = int(input())
ALinkB = [(0,0)]
for _ in range(n):
    ALinkB.append(tuple(map(int,input().split())))

# 문제 예시를 통한 분석을 해보자 . 
# 문제에선 (1,8),(3,9),(4,1)
# 8
# 1 8 (X)
# 2 2
# 3 9 (X)
# 4 1 (X)
# 6 4
# 7 6
# 9 7
# 10 10
# B를 관찰해 보면 2, 4, 6, 7, 10 로 증가 하는 수열임을 알 수 있다.
# 없애는 전기줄이 최소이기 위해선 가장 긴 증가 수열을 만들면 된다.
# 우선 입력받은 리스트(튜플)을 정렬하고 
# 리스트[][1] 은 하나의 리스트이므로 이 리스트에대한 가장 긴 증가 수열을 만들어보자.
# [가장 긴 증가 수열](https://hwangbbang.tistory.com/12)은 에서 볼 수 확인 할 수 있다.

ALinkB.sort()
dp = [1]*(n+1)
for i in range(1,n+1):
    for j in range(1,i+1):
        if ALinkB[i][1] &gt; ALinkB[j][1]:
            dp[i] = max(dp[i], dp[j]+1)



print(n - max(dp))


# &lt;시행 착오 &gt;
# dp = [0]*(n+1)
# ALinkB = [(0,0)]
# def isCross(x,y):
#     if x != y:
#         if ALinkB[x][0] &lt; ALinkB[y][0] and ALinkB[y][1] &lt; ALinkB[x][1]:
#             return True
#         if ALinkB[x][0] &gt; ALinkB[y][0] and ALinkB[y][1] &gt; ALinkB[x][1]:
#             return True
#     return False

# for _ in range(n):
#     ALinkB.append(tuple(map(int,input().split())))

# for i in range(1,n+1):
#     for j in range(1,n+1):
#         if isCross(i,j):
#             cross[i] += 1

# dp table 만들기 .. 
# 근데 너무 비효율적,, 다른 방법없을까?</code></pre>
<h4 id="분류">분류</h4>
<p>다이나믹 프로그래밍(dp)</p>
<p><a href="https://www.acmicpc.net/problem/2565">문제 원본</a> 
<a href="https://github.com/HwangBBang/BOJ_Work_Space/tree/main/%EB%B0%B1%EC%A4%80/Gold/2565.%E2%80%85%EC%A0%84%EA%B9%83%EC%A4%84">소스코드 원본</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB.SQL] INSERT, UPDATE, DELETE 구문]]></title>
            <link>https://velog.io/@hwang_bbang/DB.SQL-INSERT-UPDATE-DELETE-%EA%B5%AC%EB%AC%B8</link>
            <guid>https://velog.io/@hwang_bbang/DB.SQL-INSERT-UPDATE-DELETE-%EA%B5%AC%EB%AC%B8</guid>
            <pubDate>Wed, 15 Feb 2023 13:36:21 GMT</pubDate>
            <description><![CDATA[<h2 id="insert-구문">INSERT 구문</h2>
<p><code>INSERT</code> 문 을 사용하여 테이블에 새 행을 입력한다.</p>
<h4 id="테이블-생성">테이블 생성</h4>
<pre><code class="language-sql">create table sawon(
id number(5),
name varchar2(20),
salary number(20)
);</code></pre>
<h4 id="테이블-확인">테이블 확인</h4>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/2a870475-ac18-442c-b06a-fd30708ae71c/image.58" alt=""></p>
<pre><code class="language-sql">select * from sawon;</code></pre>
<h3 id="insert-구문-1">insert 구문</h3>
<h4 id="지정하지않고-넣기">지정하지않고 넣기</h4>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/e07d56cf-ae71-49f7-b74b-d13ed630632d/image.png" alt=""></p>
<pre><code class="language-sql">insert into sawon values( 100, &#39;김구&#39;, 3300);</code></pre>
<hr>
<h4 id="지정해서-넣기">지정해서 넣기</h4>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/dfc9bac4-4903-4a54-ba46-79e808693930/image.png" alt=""></p>
<pre><code class="language-sql">insert into sawon (name,id) values(&#39;홍길동&#39;, 200);</code></pre>
<h4 id="다른-테이블에서-추출해서-넣기">다른 테이블에서 추출해서 넣기</h4>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/b5493f76-bd54-432e-861d-7b3345a67572/image.png" alt=""></p>
<p>같은 쿼리문 2번 수행하면 중복 값이 추가됨</p>
<pre><code class="language-sql">insert into sawon select empno,ename,sal*2
from emp
where deptno = 10;</code></pre>
<h2 id="update-구문">UPDATE 구문</h2>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/3bedd508-2444-420a-8762-d7f3950c495b/image.png" alt=""></p>
<p><code>UPDATE</code> 문 을 사용하여 특정 열의 값을 변경할 수 있음
<code>WHERE</code> 절을 생략하면 테이블의 모든 행이 수정됨의 유의</p>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/3a4a15bb-440d-41c6-9d3c-946a2f02e119/image.png" alt=""></p>
<pre><code class="language-sql">update sawon 
set salary = 5500, name=&#39;김구성&#39;
where name =&#39;김구&#39;;</code></pre>
<p>sawon 테이블을 수정할거야 
name 이 김구 인 녀석의 
salary 를 5500으로 name을 김구성으로 바꿔줘</p>
<hr>
<h4 id="서브쿼리를-이용한-update">서브쿼리를 이용한 UPDATE</h4>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/ae16f5ae-d1b6-4ccc-b833-29881ac153b6/image.png" alt=""></p>
<pre><code class="language-sql">-- sawon 테이블의 id =200 인 녀석을 emp 테이블 10번 부서 급여 합계로 변경해줘
update sawon
set salary = (select sum(sal) 
              from emp
              where deptno = 10)
where id = 200;</code></pre>
<p>sawon 테이블의 id =200 인 녀석을
emp 테이블 10번 부서 급여 합계로 변경해줘</p>
<hr>
<h2 id="delete-구문">DELETE 구문</h2>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/d49f08c8-6dec-437b-aa9d-4a27d4d56801/image.png" alt=""></p>
<hr>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/d1f1b0ad-9be0-45de-89d9-9ffae253a499/image.png" alt=""></p>
<pre><code class="language-sql">delete sawon where id = 100;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB.SQL]서브쿼리]]></title>
            <link>https://velog.io/@hwang_bbang/DB.SQL%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC</link>
            <guid>https://velog.io/@hwang_bbang/DB.SQL%EC%84%9C%EB%B8%8C%EC%BF%BC%EB%A6%AC</guid>
            <pubDate>Wed, 15 Feb 2023 11:36:16 GMT</pubDate>
            <description><![CDATA[<h2 id="서브-쿼리-사용-예시">서브 쿼리 사용 예시</h2>
<pre><code class="language-sql">-- player 선수중에서 서동명 선수와 포지션이 같은 선수는??
-- &quot;=&quot; 을 사용하면 결과 한개만 가능 
select player_name, height, position
from player 
where position = (select position
                  from player
                  where player_name = &#39;서동명&#39;);


-- player 선수중에서 박동우 선수와 포지션이 같은 선수는??
-- &quot;in&quot; 을 사용하면 결과 한개만 가능 
select player_name, height, position
from player 
where position in (select position
                  from player
                  where player_name = &#39;박동우&#39;);                  </code></pre>
<h3 id="any">ANY</h3>
<pre><code class="language-sql">-- emp 테이블 30번 부서에서 소속된 아무 사원 보다 급여를 더 많이 받는 사원을 조회 
select ename, sal, deptno 
from emp
where sal &gt; any(select sal from emp
                where deptno = 30);     </code></pre>
<p>같은 의미로 <code>Any</code> 을 사용하지 않고 표현 할 수 있다.</p>
<pre><code class="language-sql"> -- emp 테이블 30번 부서에서 소속된 아무 사원 보다 급여를 더 많이 받는 사원을 조회 
select ename, sal, deptno 
from emp
where sal &gt; (select min(sal) from emp
                where deptno = 30);   </code></pre>
<h3 id="all">ALL</h3>
<pre><code class="language-sql">-- emp 테이블 30번 부서에서 소속된 모든 사원 보다 급여를 더 많이 받는 사원을 조회 
select ename, sal, deptno 
from emp
where sal &gt; all(select sal from emp
                where deptno = 30);    </code></pre>
<p>같은 의미로 <code>All</code> 을 사용하지 않고 표현 할 수 있다.</p>
<pre><code class="language-sql">select ename, sal, deptno 
from emp
where sal &gt; (select max(sal) from emp
                where deptno = 30);
</code></pre>
<h2 id="다중-컬럼-서브퀴리-사용-예시">다중 컬럼 서브퀴리 사용 예시</h2>
<p>(<code>player_name</code>이 <code>&#39;사샤&#39;</code>,<code>&#39;박동우&#39;</code> 둘 중 하나랑 같으면 돼요)
AND
(<code>position</code>이 <code>&#39;사샤&#39;</code>,<code>&#39;박동우&#39;</code> 둘 중 하나랑 같으면 돼요)
<img src="https://velog.velcdn.com/images/hwang_bbang/post/6590bdd7-3ae0-4cdb-ae43-4454daea571c/image.png" alt=""></p>
<pre><code class="language-sql">select team_id, player_name, height, position
from player 
where team_id in (select team_id from player
                  where player_name in(&#39;샤샤&#39;, &#39;박동우&#39;))
      and
      position in ( select position from player
                  where player_name in(&#39;샤샤&#39;, &#39;박동우&#39;));</code></pre>
<hr>
<p><code>player_name</code>,<code>position</code>이 <code>&#39;사샤&#39;</code>,<code>&#39;박동우&#39;</code> 둘과 같아야 돼요</p>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/cfc4a68b-9faa-4046-998b-8eb5662e7376/image.png" alt=""></p>
<pre><code class="language-sql">
select team_id, player_name, height, position
from player 
where (team_id,position) in ( select team_id,position
                  from player
                  where player_name in(&#39;샤샤&#39;, &#39;박동우&#39;));
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PS][BOJ/7869번] 두 원]]></title>
            <link>https://velog.io/@hwang_bbang/PSBOJ7869%EB%B2%88-%EB%91%90-%EC%9B%90</link>
            <guid>https://velog.io/@hwang_bbang/PSBOJ7869%EB%B2%88-%EB%91%90-%EC%9B%90</guid>
            <pubDate>Wed, 15 Feb 2023 11:03:02 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-설명">문제 설명</h3>
<p><img alt="" src="https://www.acmicpc.net/upload/images/one(1).png" style="float:right; height:120px; opacity:0.9; width:162px">
  두 원이 주어졌을 때, 교차하는 영역의 넓이를 소수점 셋째자리까지 구하는 프로그램을 작성하시오.</p>


<h3 id="입력">입력</h3>
 <p>첫째 줄에 두 원의 중심과 반지름 x1, y1, r1, x2, y2, r2가 주어진다. 실수는 최대 소수점 둘째자리까지 주어진다.</p>

<h3 id="출력">출력</h3>
 <p>첫째 줄에 교차하는 영역의 넓이를 반올림해 소수점 셋째자리까지 출력한다.</p>

<h3 id="문제-분석-과정">문제 분석 과정</h3>
<p>주어진 값은 두 원의 중심과 반지름이다. 우선 두 원의 중심을 알고 있으니
두 원의 중심 사이 거리를 구할 수 있다. (점과 점사이의 거리) </p>
<p>두 원의 중심 사이의 거리를 알았다면 두 원의 포지션을 3가지로 나눌 수 있게된다.</p>
<blockquote>
</blockquote>
<p> Case1. 교집합 면적이 작은원 그 자체인 경우  : |r1-r2|&gt;=d
 Case2. 교집합 면적이 없는 경우  : r1+r2&lt;=d
 Case3. 그 외의 모든 경우 </p>
<p>우선 Case1.의 경우 작은 원이 교집합되는 면적 그 자체이기 때문에 추가적인 계산 없이 작은 원의 넓이를 출력하면 된다.</p>
<p>다음으로 Case2.의 경우 작은 원이 교집합되는 면적이 없기 때문에 0.000 을 출력하면 된다.(한 점에서 만나는 경우도 포함시켰으나 한 점에서 만나는 경우는 두 원이 접하는 경우 이므로 카운팅하지않는다.)</p>
<p>마지막으로  Case3. 의 경우가 가장 일반적인 경우인데 이때의 두 원을 관찰해보자. Case3.의 두 원은 반드시 두점에서 만나게 된다. 이 경우 우리는 각 원의 중심과 반지름 그리고 각 원의 중심 사이 거리를 알 수 있다. 두 원의 중심끼리 선(이하 d)으로 이어보자.
그럼 d를 공유하는 두개의 삼각형이 만들어진다.이때 두 삼각형은 SSS합동이고, 이 두 삼각형의 모든 변의 길이를 우리는 알고 있게된다. 모든 변의 길이를 알고 있으므로 제 2 코사인 법칙을 이용해 각도 또한 알 수있고, 두 삼각형은 합동이므로 두 삼각형을 합친 각도까지 알 수 있다.</p>
<p>교집합을 구하기위해서는 각 원의 부채꼴의 넓이와 선분d 를 공유하는 두 삼각형의 넓이를 알아야한다. (부채꼴 - 삼각형) 
삼각형의 넓이는 두 변과 끼인 사잇각을 통해서 구할 수 있다.</p>
<p>위 과정을 거치면 정답을 구할 수 있다.</p>
<h4 id="점과-점사이의-거리">점과 점사이의 거리</h4>
<p>$$
d = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2}
$$</p>
<h4 id="제-2-코사인-법칙">제 2 코사인 법칙</h4>
<p>$$
\cos\theta = (r_1^2 + d^2 - r_2^2) \over (2<em>r_1</em>d)
$$
$$
\theta = \arccos({ r_1^2 + d^2 - r_2^2 \over 2<em>r_1</em>d})
$$</p>
<h4 id="삼각형의-넓이">삼각형의 넓이</h4>
<p>$$
S = {sin(\theta)*r_1^2\over2}
$$</p>
<h4 id="소스코드">소스코드</h4>
<pre><code class="language-python">import math

x1, y1, r1, x2, y2, r2 = map(float,input().split())
# 두 원의 중심사이 거리
d = math.sqrt(pow(x1-x2,2)+pow(y1-y2,2))

def getS(d,r1,r2):
    # 제2 코사인 으로 사잇각 구하기
    theta = math.acos((pow(r1,2) + pow(d,2) - pow(r2,2)) / (2*r1*d))

    s2 = math.sin(2*theta)*pow(r1,2)/2
    s1 = pow(r1,2)*theta

    return(s1-s2)

#영역이 없다.
if r1+r2&lt;=d :
    result = 0.000

# 큰원에 작은원이 포함된 경우
elif abs(r1-r2)&gt;=d :    
    result = math.pi * pow(min(r1,r2),2) 

else:
    result = getS(d,r1,r2)+ getS(d,r2,r1)  




print(&#39;%.3f&#39; % result)
</code></pre>
<p><a href="https://github.com/HwangBBang/BOJ_Work_Space/tree/main/%EB%B0%B1%EC%A4%80/Gold/7869.%E2%80%85%EB%91%90%E2%80%85%EC%9B%90">소스코드 원본</a>
<a href="https://www.acmicpc.net/problem/7869">문제 원본</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PS][BOJ/11053번]가장 긴 증가하는 부분 수열]]></title>
            <link>https://velog.io/@hwang_bbang/PSBOJ11053%EB%B2%88%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4</link>
            <guid>https://velog.io/@hwang_bbang/PSBOJ11053%EB%B2%88%EA%B0%80%EC%9E%A5-%EA%B8%B4-%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4</guid>
            <pubDate>Wed, 15 Feb 2023 02:47:42 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-설명">문제 설명</h3>
<p>수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오.</p>
<p>예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이고, 길이는 4이다.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000)이 주어진다.</p>
<p>둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ Ai ≤ 1,000)</p>
<h3 id="출력">출력</h3>
<p>첫째 줄에 수열 A의 가장 긴 증가하는 부분 수열의 길이를 출력한다.</p>
<h3 id="문제분석과정">문제분석과정</h3>
<p>가장 긴 증가하는 부분 수열을 구하기 위해서 어떻게해야할까 ? 
일단 메모지에이션을 하기위해 dp를 정의하고 dp[1]뭔지 찾아보자
dp를 어떻게 정의해야할지 감이 오지않으니까 증가부분수열을 관찰해보자</p>
<h4 id="i에-대한-분석">i에 대한 분석</h4>
<blockquote>
</blockquote>
<p>6
10 20 10 30 20 50 이 주어졌을 때, </p>
<blockquote>
</blockquote>
<p>10 - 1  / 
10 20  - 2  / 
10 20 10  - 1 /<br>10 20 10 30  - 3 /<br>10 20 10 30 20  - 2 /<br>10 20 10 30 20 50 -  4 /</p>
<p>dp[끝나는 인덱스] =  끝나는 인덱스 일때 최장 부분 수열</p>
<p>한칸씩 이동하며 전체적으로 증가시킴
모든 초기값은 자기자신 한 개인 경우로 1개이다.</p>
<blockquote>
</blockquote>
<p>10 20 10 30 20 50 일 때
1 1  1  1  1  1  1 / i = 2
1 1  2  1  1  1  1 / i = 3
1 1  2  1  3  1  1 / i = 4
1 1  2  2  3  2  1 / i = 5
1 1  2  2  3  2  4 / i = 6</p>
<h4 id="j에-대한-분석">j에 대한 분석</h4>
<p>점화식 을 찾기 위해서 i = 5를 관찰해보자, 20과 같거나 큰 녀석들은 무시한다.</p>
<blockquote>
</blockquote>
<p>1  1   2   1  3  1  1  / 현재 dp Table 
   10     10     20(현재 피벗)   dp[4] = 1</p>
<blockquote>
</blockquote>
<p>1  1   2   1  3  1  1  / 현재 dp Table / j = 1
   10(체크)10     20(현재 피벗)   dp[4] = (1 , dp[1]+1 = 2)</p>
<blockquote>
</blockquote>
<p>1  1   2   1  3  1  1  / 현재 dp Table / j = 4
   10     10(체크)20(현재 피벗)   dp[4] = max(1 , dp[4]+1 = 2)</p>
<p>i를 조사할때, 현재까지 인덱스i로 끝나는 녀석
인덱스j로 조사하는데 인덱스j로 끝나는 녀석에게 인덱스i를 붙힌 녀석
둘중 큰값을 dp[i]로 최신화 되며, j를 다돌면 dp[i]가 산정된다.</p>
<p>각 i 마다 위과정들을 다 거친후 max(dp) 하게되면 정답을 구할 수 있다.
한 가지 주의 사항은 0번째 index를 추가해줄때 입력값을 고려해서 추가해줘야한다.</p>
<p>입력으로 1000 보다 큰 수가 나올 수 없으므로 정답에 영향을 주지 못한다. 
다른 방법으로는 dp ,arr 의 크기를 n+1 이아니라 n으로 초기화해도 가능하지만 다이나믹 프로그래밍 알고리즘은 리스트의 인덱스를 헷갈리지않게 처리해야하므로 입력값을 고려하는게 더 좋은 선택이라고 생각한다.</p>
<pre><code class="language-python">n = int(input())

arr = [1001] + list(map(int,input().split()))

# 가장 긴 증가하는 부분 수열을 구하기 위해서 어떻게해야할까 ? 
# 일단 메모지에이션을 하기위해 dp를 정의하고 dp[1]뭔지 찾아보자
# dp를 어떻게 정의해야할지 감이 오지않으니까 증가부분수열을 관찰해보자
# 10 - 1   
# 10 20  - 2   
# 10 20 10  - 1   
# 10 20 10 30  - 3    
# 10 20 10 30 20  - 2    
# 10 20 10 30 20 50 -  4 


# dp[끝나는 인덱스] =  끝나는 인덱스 일때 최장 부분 수열
# 한칸씩 이동하며 전체적으로 증가시킴
# 모든 초기값은 자기자신 한 개인 경우로 1개이다.

# 10 20 10 30 20 50 일 때
#1 1  1  1  1  1  1 / i = 2
#1 1  2  1  1  1  1 / i = 3
#1 1  2  1  3  1  1 / i = 4
#1 1  2  2  3  2  1 / i = 5
#1 1  2  2  3  2  4 / i = 6

# 점화식 을 찾기 위해서 i = 5를 관찰해보자 
# 20과 같거나 큰 녀석들은 무시한다.

# 1  1   2   1  3  1  1  / 현재 dp Table 
#    10     10     20(현재 피벗)   dp[4] = 1

# 1  1   2   1  3  1  1  / 현재 dp Table / j = 1
#    10(체크)10     20(현재 피벗)   dp[4] = (1 , dp[1]+1 = 2)

# 1  1   2   1  3  1  1  / 현재 dp Table / j = 4
#    10     10(체크)20(현재 피벗)   dp[4] = max(1 , dp[4]+1 = 2)
# i를 조사할때
# 현재까지 인덱스i로 끝나는 녀석
# 인덱스j로 조사하는데 인덱스j로 끝나는 녀석에게 인덱스i를 붙힌 녀석
# 둘중 큰값을 dp[i]로 최신화. j를 다돌면 dp[i]가 산정된다.
# 위과정들을 다
# 정답은 max(dp)
dp = [1]*(n+1)

for i in range(2,n+1):
    for j in range(1,i):
        if arr[i] &gt; arr[j]:
            dp[i] = max(dp[i], dp[j] + 1)

print(max(dp))</code></pre>
<h4 id="분류">분류</h4>
<p>다이나믹 프로그래밍(dp)</p>
<p><a href="https://github.com/HwangBBang/BOJ_Work_Space/tree/main/%EB%B0%B1%EC%A4%80/Silver/11053.%E2%80%85%EA%B0%80%EC%9E%A5%E2%80%85%EA%B8%B4%E2%80%85%EC%A6%9D%EA%B0%80%ED%95%98%EB%8A%94%E2%80%85%EB%B6%80%EB%B6%84%E2%80%85%EC%88%98%EC%97%B4">소스코드 원본</a></p>
<p><a href="https://www.acmicpc.net/problem/11053">문제원본</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PS][BOJ/10844번] 쉬운계단수]]></title>
            <link>https://velog.io/@hwang_bbang/PSBOJ10844%EB%B2%88-%EC%89%AC%EC%9A%B4%EA%B3%84%EB%8B%A8%EC%88%98</link>
            <guid>https://velog.io/@hwang_bbang/PSBOJ10844%EB%B2%88-%EC%89%AC%EC%9A%B4%EA%B3%84%EB%8B%A8%EC%88%98</guid>
            <pubDate>Tue, 14 Feb 2023 04:50:58 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-설명">문제 설명</h3>
<p>45656이란 수를 보자.</p>
<p>이 수는 인접한 모든 자리의 차이가 1이다. 이런 수를 계단 수라고 한다.</p>
<p>N이 주어질 때, 길이가 N인 계단 수가 총 몇 개 있는지 구해보자. 0으로 시작하는 수는 계단수가 아니다.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 N이 주어진다. N은 1보다 크거나 같고, 100보다 작거나 같은 자연수이다.</p>
<h3 id="출력">출력</h3>
<p>첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다.</p>
<h3 id="문제분석과정">문제분석과정</h3>
<p>45656 ? 인잡한 자리가 1 씩 차이가난다.</p>
<p>N 주어질 때, 총 계단의 길이가 N 인 계단수를 구하자.</p>
<p>N = 1 일때는 어떻게 될까? </p>
<p>N = 1 일때는 한자리 모든수가 가능하다 0씩 차이난다고 볼 수 있기 때문이다.</p>
<p>N = 2 일때는? 10의자리는 N = 1일때와같다.</p>
<p>겹치니 점화식을 사용하기위해 N = k 일때 dp[k]는 계단 수의 갯수라고 하자.</p>
<p>다시 N = 2 일때를 살펴보자 10의자리는 N = 1일때와 같으므로
(십의 자리])(일의 자리) = (dp[1])(dp[1]+-1) = dp[1]*2 - 1(10일때)</p>
<p>dp 테이블이만들어지기위해서는 자리수와 앞에오는 자리를 통제할 수있어야한다.
따라서 2차원 dp 테이블로 만들어야한다. </p>
<blockquote>
</blockquote>
<p>dp[자리 수 1][앞에 어떤 수?] = 현재 자리수 + 앞에 어떤 수 = 갯수<br>정답은 sum(dp[n])</p>
<blockquote>
</blockquote>
<p>dp[1][1] ~ dp[1][9] = 1
 1  2  3  4  5  6  7  8  9<br> 1  1  1  1  1  1  1  1  1</p>
<blockquote>
</blockquote>
<p>dp[2][1] = 1 , dp[2][2] ~ dp[2][8] = 2 ,dp[2][9] = 1
0  1  2  3  4  5  6  7  8  9<br>1  1  2  2  2  2  2  2  2  1</p>
<blockquote>
</blockquote>
<p>dp[3][1]~ dp[3][8] 
 1  2  3  4  5  6  7  8 
dp[3][1<del>8] = dp[2][0</del>7] + dp[2][1~9]
dp[3][9] = dp[2][8]</p>
<blockquote>
</blockquote>
<p>dp[현재 자리수][0] = dp[현재 자리수 -1][1]
dp[현재 자리수][1~8] = dp[현재 자리수 -1][앞의 수 +-1]
dp[현재 자리수][9] = dp[현재 자리수 -1][8]</p>
<pre><code class="language-python">#  
import sys
input = sys.stdin.readline

# 45656 ? 인잡한 자리가 1 씩 차이가난다.
# N 주어질 때, 총 계단의 길이가 N 인 계단수를 구하자.
# N = 1 일때는 어떻게 될까? 

# N = 1 일때는 한자리 모든수가 가능하다 0씩 차이난다고 볼 수 있기 때문
# N = 2 일때는? 10의자리는 N = 1일때와같다. 겹치니 점화식을 사용하기위해 
# N = k 일때 dp[k]는 계단 수의 갯수라고 하자.
# 다시 N = 2 일때를 살펴보자 10의자리는 N = 1일때와 같으므로
# (십의 자리])(일의 자리) = (dp[1])(dp[1]+-1) = dp[1]*2 - 1(10일때)
# dp 테이블이만들어지기위해서는 자리수와 앞에오는 자리를 통제할 수있어야한다.
# 따라서 2차원 dp 테이블로 만들어야한다. 

# dp[자리 수 1][앞에 어떤 수?] = 현재 자리수 + 앞에 어떤 수 = 갯수  
# 정답은 sum(dp[n])

# dp[1][1] ~ dp[1][9] = 1
#  1  2  3  4  5  6  7  8  9  
#  1  1  1  1  1  1  1  1  1

# dp[2][1] = 1 , dp[2][2] ~ dp[2][8] = 2 ,dp[2][9] = 1
# 0  1  2  3  4  5  6  7  8  9  
# 1  1  2  2  2  2  2  2  2  1

# dp[3][1]~ dp[3][8] 
#  1  2  3  4  5  6  7  8 
# dp[3][1~8] = dp[2][0~7] + dp[2][1~9]
# dp[3][9] = dp[2][8]

# dp[현재 자리수][0] = dp[현재 자리수 -1][1]
# dp[현재 자리수][1~8] = dp[현재 자리수 -1][앞의 수 +-1]
# dp[현재 자리수][9] = dp[현재 자리수 -1][8]
n = int(input())

dp = [0]*(n+1)
dp[1] = [1 for _ in range(1,10)] +[0]

for i in range(2,n+1):
    dp[i] = [0 for _ in range(0,11)]


for i in range(2,n+1):

    dp[i][0] = dp[i-1][1]

    for j in range(1,9):
        dp[i][j] = dp[i-1][j-1]+dp[i-1][j+1]

    dp[i][9] = dp[i-1][8]

print(sum(dp[n])%1000000000)</code></pre>
<h4 id="분류">분류</h4>
<p>다이나믹 프로그래밍(dp)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PS][BOJ/1912번]-연속합]]></title>
            <link>https://velog.io/@hwang_bbang/PSBOJ1912%EB%B2%88-%EC%97%B0%EC%86%8D%ED%95%A9</link>
            <guid>https://velog.io/@hwang_bbang/PSBOJ1912%EB%B2%88-%EC%97%B0%EC%86%8D%ED%95%A9</guid>
            <pubDate>Mon, 13 Feb 2023 03:07:21 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/936a6bf6-a08f-4020-b3b5-2a3172386d17/image.26" alt=""></p>
<h3 id="문제-설명">문제 설명</h3>
<p>n개의 정수로 이루어진 임의의 수열이 주어진다. 우리는 이 중 연속된 몇 개의 수를 선택해서 구할 수 있는 합 중 가장 큰 합을 구하려고 한다. 단, 수는 한 개 이상 선택해야 한다.</p>
<p>예를 들어서 10, -4, 3, 1, 5, 6, -35, 12, 21, -1 이라는 수열이 주어졌다고 하자. 여기서 정답은 12+21인 33이 정답이 된다.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.</p>
<h3 id="출력">출력</h3>
<p>첫째 줄에 답을 출력한다.</p>
<h3 id="문제-분석과정">문제 분석과정</h3>
<p>연속합의 최대는 어떻게 만들어질까? </p>
<p>연속합은 어떤인덱스 x 에서 시작해서 어떤인덱스 y에서 종료된다.
종료되는 y 인덱스 관점에서 살펴보자 
dpTable 을 생성하고 dpTable에 의미를 부여하자(정의하자)
dpTable은 종료되는 인덱스까지의 연속합의 맥스값이다.
정답은 max(dpTable)이 될 것이다.</p>
<p>테이블을 만들기위해 초기값을 살펴보자 
(인덱스가 헷갈릴 수 있으므로 배열으크기를 n+1로 초기화해준다. )
주어진 배열이 0 10 -4 3 1 5 6 -35 12 21 -1 라고 할때
dp[1]은 무엇일까?</p>
<blockquote>
</blockquote>
<p>dp[1]은 10이다. 
dp[2]는? dp[2]은 10 -4 이다. 
dp[3]는? dp[3]은 10 -4 +3 이다. 
dp[4]는? dp[4]은 10 -4 +3 +1이다. 
dp[5]는? dp[5]은 10 -4 +3 +1 +5이다. 
dp[6]는? dp[6]은 (10 -4 +3 +1 +5+ 6) = 21이다. 
dp[7]는? dp[7]은 (10 -4 +3 +1 +5+ 6 -35) = -14이다. 
dp[8]는? dp[8]은 max((10 -4 +3 +1 +5+ 6 -35),12) = 12이다. 
dp[k] = max(dp[k-1]+arr[k], arr[k]) 위 케이스를 통해서 점화식을 생성할 수 있다.
dp[9] = max(dp[8]=12+21, 21) = 33
dp[10] = max (dp[9]-1, -1) = 32</p>
<p>여기서 주의사항이 한가지가 있다.
바로 초기화값인데, 인덱스를 헷갈리지않게 하기위해서 추가하는데이터값에 주의해야한다.</p>
<p>보통이런경우 통상적으로 0을 추가하는데 해당문제에서 0으로 추가하는 경우 통과하지못하는 테스트 케이스가 나온다.</p>
<p>어떤 케이스 일까 ? 바로 모든 수가 음수인 경우이다. 
-3 -4 -7 -3
다음과 같은 테스트케이스가 들어왔다고 생각해보자.
그럼 arr는 arr = [0,-3,-4,-7,-3]이 될 테고 
dp = [0,-3,-4,-7,-3]이 될것이다. 따라서 max(dp) = 0이되고 원하는 답인 -3 이 출력되지않게된다.
그럼 방지하기위해서 어떻게해야할까?
입력데이터를 확인해보자, 입력데이터는 &quot;-1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.&quot; 라고 주어져있다.
따라서 -1001 보다 같거나 작은수는 절대로 나올 수 없다 . 그럼 이조건을 활용해 인덱스 0번째 데이터를 -1001로 초기화하면 
모든 수가 음수인 경우를 문제없이 해결할 수 있다.</p>
<h4 id="소스코드">소스코드</h4>
<pre><code class="language-python">import math
n = int(input())
arr = [0]+list(map(int,input().split()))
dp = [-1001]*(n+1)
# 연속합의 최대는 어떻게 만들어질까? 

# sol
# 연속합은 어떤인덱스 x 에서 시작해서 어떤인덱스 y에서 종료된다.
# 종료되는 y 인덱스 관점에서 살펴보자 
# dpTable 을 생성하고 dpTable에 의미를 부여하자(정의하자)
# dpTable은 종료되는 인덱스까지의 연속합의 맥스값이다.
# 정답은 max(dpTable)이 될 것이다.
# 테이블을 만들기위해 초기값을 살펴보자 
# (인덱스가 헷갈릴 수 있으므로 배열으크기를 n+1로 초기화해준다. )
# 주어진 배열이 0 10 -4 3 1 5 6 -35 12 21 -1 라고 할때
# dp[1]은 무엇일까? dp[1]은 10이다. 
# dp[2]는? dp[2]은 10 -4 이다. 
# dp[3]는? dp[3]은 10 -4 +3 이다. 
# dp[4]는? dp[4]은 10 -4 +3 +1이다. 
# dp[5]는? dp[5]은 10 -4 +3 +1 +5이다. 
# dp[6]는? dp[6]은 (10 -4 +3 +1 +5+ 6) = 21이다. 
# dp[7]는? dp[7]은 (10 -4 +3 +1 +5+ 6 -35) = -14이다. 
# dp[8]는? dp[8]은 max((10 -4 +3 +1 +5+ 6 -35),12) = 12이다. 
# dp[k] = max(dp[k-1]+arr[k], arr[k]) 위 케이스를 통해서 점화식을 생성할 수 있다.
# dp[9] = max(dp[8]=12+21, 21) = 33
# dp[10] = max (dp[9]-1, -1) = 32

# 여기서 주의사항이 한가지가 있다.
# 바로 초기화값인데, 인덱스를 헷갈리지않게 하기위해서 추가하는데이터값에 주의해야한다.
# 보통이런경우 통상적으로 0을 추가하는데 해당문제에서 0으로 추가하는 경우 통과하지못하는 테스트 케이스가 나온다.
# 어떤 케이스 일까 ? 바로 모든 수가 음수인 경우이다. 
# -3 -4 -7 -3
# 다음과 같은 테스트케이스가 들어왔다고 생각해보자.
# 그럼 arr는 arr = [0,-3,-4,-7,-3]이 될 테고 
# dp = [0,-3,-4,-7,-3]이 될것이다. 따라서 max(dp) = 0이되고 원하는 답인 -3 이 출력되지않게된다.
# 그럼 방지하기위해서 어떻게해야할까?
# 입력데이터를 확인해보자, 입력데이터는 &quot;-1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다.&quot; 라고 주어져있다.
# 따라서 -1001 보다 같거나 작은수는 절대로 나올 수 없다 . 그럼 이조건을 활용해 인덱스 0번째 데이터를 -1001로 초기화하면 
# 모든 수가 음수인 경우를 문제없이 해결할 수 있다.

for i in range (1,n+1):
    dp[i] = max(dp[i-1]+arr[i],arr[i])

print(max(dp))
</code></pre>
<p><a href="https://github.com/HwangBBang/BOJ_Work_Space/tree/main/%EB%B0%B1%EC%A4%80/Silver/1912.%E2%80%85%EC%97%B0%EC%86%8D%ED%95%A9">소스코드 원본</a></p>
<p><a href="https://www.acmicpc.net/problem/1912">문제 원본</a></p>
<h4 id="분류">분류</h4>
<p>다이나믹 프로그래밍(dp)</p>
<p>오류나 질문에 대한 문의 댓글로 남겨주세요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[PS][BOJ/2839]-설탕배달]]></title>
            <link>https://velog.io/@hwang_bbang/PSBOJ2839-%EC%84%A4%ED%83%95%EB%B0%B0%EB%8B%AC</link>
            <guid>https://velog.io/@hwang_bbang/PSBOJ2839-%EC%84%A4%ED%83%95%EB%B0%B0%EB%8B%AC</guid>
            <pubDate>Sat, 11 Feb 2023 03:55:18 GMT</pubDate>
            <description><![CDATA[<h3 id="문제-설명">문제 설명</h3>
<p>상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그램 봉지와 5킬로그램 봉지가 있다.</p>
<p>상근이는 귀찮기 때문에, 최대한 적은 봉지를 들고 가려고 한다. 예를 들어, 18킬로그램 설탕을 배달해야 할 때, 3킬로그램 봉지 6개를 가져가도 되지만, 5킬로그램 3개와 3킬로그램 1개를 배달하면, 더 적은 개수의 봉지를 배달할 수 있다.</p>
<p>상근이가 설탕을 정확하게 N킬로그램 배달해야 할 때, 봉지 몇 개를 가져가면 되는지 그 수를 구하는 프로그램을 작성하시오.</p>
<h3 id="입력">입력</h3>
<p>첫째 줄에 N이 주어진다. (3 ≤ N ≤ 5000)</p>
<h3 id="출력">출력</h3>
<p>상근이가 배달하는 봉지의 최소 개수를 출력한다. 만약, 정확하게 N킬로그램을 만들 수 없다면 -1을 출력한다.</p>
<h4 id="문제분석과정">문제분석과정</h4>
<p>우선 주어진 테스트 케이스로 분석을 시작해보자 
에는 dp(k) 는 k만큼 배달해야 할 때 최소 봉지 갯수이다. 
n 이 3일 때는 1 이되고 dp[3]이다
dp[3] = 1 ,n 이 5일 때 역시 1 이되고 dp[5] = 1 이 된다.
n=6 일 때는 2가 되는데 3+3 이합쳐서 2가된다 이것을 다시 표현하면 dp[6] = dp[3]+dp[3]으로 표현 할 수있다
아래같은 방법을 진행하다보면 </p>
<p>4가지 경우가 있다는 것을 알 수 있다.</p>
<ul>
<li><p>3만 가능한 경우
  3키로 추가만 가능하다면 3키로 전 dp값에 1 추가</p>
</li>
<li><p>5만 가능한 경우
  5키로 추가만 가능하다면 5키로 전 dp값에 1추가</p>
</li>
<li><p>3,5 둘다 가능한 경우
  3,5키로 추가만 가능하다면 5키로 전 dp값에 1추가</p>
</li>
<li><p>둘다 불가능한 경우
  둘 다 불가능하다면 연산 불가 (-1) 할당</p>
</li>
</ul>
<h4 id="소스코드">소스코드</h4>
<pre><code class="language-python">n = int(input())

dp = [-1 for _ in range(5001)]


# n = 3 / 1 # dp[3]
# n = 5 / 1 # dp[5]
# n = 6 / 2 # dp[3]+dp[3]
# n = 8 / 2 # dp[3]+dp[5]
# n = 9 / 3 # dp[3]+dp[6]
# n = 10 / 2 # dp[5]+dp[5]
# n = 11 / 3 # dp[5]+dp[6]
# n = 12 / 4 # dp[3]+dp[9]
# n = 13 / 3 # dp[3]+dp[10]
# n = 15 / 3 # min(dp[3]+dp[12], dp[5]+dp[10])
dp[3] = 1
dp[5] = 1

# dp 테이블 작성
for i in range(6, n + 1):
# a : 5키로 추가 전 무게의 봉투 최소값
# b : 3키로 추가 전 무게의 봉투 최소값
    a, b = dp[i], dp[i] 

# 5키로 추가 전 메모라값 할당
    if dp[i - 5] != -1:
        a = dp[i - 5]
# 3키로 추가 전 메모리값 할당
    if dp[i - 3] != -1:
        b = dp[i - 3]

# 3, 5키로 둘 다 가능하다면 둘 중 작은 값 선택
    if a &gt; 0 and b &gt; 0:
        dp[i] = min(a + 1, b + 1)
# 5키로 추가만 가능하다면 5키로 전 dp값에 1추가
    elif a &gt; 0 and b &lt; 0:
        dp[i] = a + 1
# 3키로 추가만 가능하다면 3키로 전 dp값에 1 추가
    elif a &lt; 0 and b &gt; 0:
        dp[i] = b + 1
# 둘 다 불가능하다면 연산 불가 (-1) 할당
    else:
        dp[i] = -1

print(dp[n])</code></pre>
<h4 id="분류">분류</h4>
<p>다이나믹 프로그래밍(dp), 그리디 알고리즘(greedy), 수학(math)</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB.SQL] 윈도우 함수 ]]></title>
            <link>https://velog.io/@hwang_bbang/DB.SQL-%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%95%A8%EC%88%98</link>
            <guid>https://velog.io/@hwang_bbang/DB.SQL-%EC%9C%88%EB%8F%84%EC%9A%B0-%ED%95%A8%EC%88%98</guid>
            <pubDate>Tue, 07 Feb 2023 11:58:01 GMT</pubDate>
            <description><![CDATA[<h2 id="윈도우-함수-종류">윈도우 함수 종류</h2>
<h3 id="rank">#RANK</h3>
<p>각 Row 에 순위를 부여하는 함수 
<code>order by</code> 절의 기준으로 정렬
동일한 값일 경우 같은 순위로 출력</p>
<pre><code class="language-sql">select empno, ename, deptno, sal,
       rank() over (order by sal desc) 순위
from emp;
</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/aaa8e7f7-c1d9-4792-b345-5db46ef76a2d/image.png" alt=""></p>
<pre><code class="language-sql">select empno, ename, deptno, sal,
       rank() over (partition by deptno order by sal desc) 순위
from emp;
</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/e700da3c-519d-4669-9352-f26998e48612/image.png" alt=""></p>
<h3 id="dense_rank">#DENSE_RANK()</h3>
<p>RANK()와 모든 기능이 같음 </p>
<ul>
<li><code>DENSE_RANK()</code> : 동일한 값일 경우 갯수와 상관없이 다음 순위 +1</li>
<li><code>RANK()</code> : 동일한 값일 경우 갯수를 고려해서 +n</li>
</ul>
<pre><code class="language-sql">select empno, ename, deptno, sal,
        dense_rank() over (order by sal desc) 순위1번,
        rank() over (order by sal desc) 순위2번
from emp;
</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/e7cc75ac-6d7d-441c-9f60-e86c3d6997ba/image.png" alt=""></p>
<h3 id="row_number">#ROW_NUMBER()</h3>
<p>RANK()와 모든 기능이 같음 </p>
<pre><code class="language-sql">select empno, ename, deptno, sal,
        dense_rank() over (order by sal desc) 순위1번,
        rank() over (order by sal desc) 순위2번,
        row_number() over (order by sal desc) 순위3번
from emp;
</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/43ca204c-448b-45dc-87fd-9141d55bb628/image.png" alt=""></p>
<hr>
<h3 id="ntile">#NTILE()</h3>
<p><code>NTILE(arg)</code> 은 <code>order by</code> 절 기준을 따라서<code>arg</code> 개 만큼 그룹으로 나누는 함수 </p>
<pre><code class="language-sql">select ename,  sal, 
       ntile(3) over (order by sal desc)        
from emp;</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/4f3261e4-5e79-467d-b115-bc5a82b09132/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB.SQL] GROUP BY 와 HAVING]]></title>
            <link>https://velog.io/@hwang_bbang/DB.SQL-GROUP-BY-%EC%99%80-HAVING</link>
            <guid>https://velog.io/@hwang_bbang/DB.SQL-GROUP-BY-%EC%99%80-HAVING</guid>
            <pubDate>Tue, 07 Feb 2023 10:48:10 GMT</pubDate>
            <description><![CDATA[<h2 id="group-by-의-기능">group by 의 기능</h2>
<p>select 한 col을 값들로 그룹화 한다.
<img src="https://velog.velcdn.com/images/hwang_bbang/post/1622e2a2-bb1b-4185-9fed-7f0117e956e8/image.png" alt=""></p>
<h3 id="한-개-그룹으로-묶기">한 개 그룹으로 묶기</h3>
<pre><code class="language-sql">select deptno,count(*),sum(sal), avg(sal)
from emp
group by deptno
order by deptno;</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/0de44a7d-998a-413c-ad55-8e687a957d20/image.png" alt=""></p>
<h3 id="두-개-그룹으로-묶기">두 개 그룹으로 묶기</h3>
<pre><code class="language-sql">select job,deptno,count(*),sum(sal), avg(sal)
from emp
group by job,deptno
order by deptno;</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/637c0740-8e26-458f-b7e2-a6ee8142f084/image.png" alt=""></p>
<h2 id="having-의-기능">HAVING 의 기능</h2>
<p><code>group by</code>로 집계된 데이터를 <code>having 조건</code>으로 필터링함</p>
<p>그럼 <code>group by</code> 와 <code>having</code> 의 차이는 뭘까?</p>
<ul>
<li><code>where</code> 절은 <strong>묶기 전</strong>에 조건으로 필터링함</li>
<li><code>having</code>절은 <strong>묶고 난 후</strong> 조건으로 필터링함</li>
</ul>
<h3 id="having-사용-예시">having 사용 예시</h3>
<pre><code class="language-sql">select team_id, avg(height)
from player
group by team_id
order by avg(height);</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/897ebd3f-9405-49c0-91fd-acfcb5ee5a13/image.png" alt=""></p>
<pre><code class="language-sql">select team_id, avg(height)
from player
group by team_id
having avg(height) &gt; 180
order by avg(height);</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/42fa5c6d-c9ca-4942-aaf9-c7c827d2a566/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB.SQL] 다중 행(그룹) 함수 ]]></title>
            <link>https://velog.io/@hwang_bbang/DB.SQL-%EB%8B%A4%EC%A4%91-%ED%96%89%EA%B7%B8%EB%A3%B9-%EB%A9%94%EC%86%8C%EB%93%9C</link>
            <guid>https://velog.io/@hwang_bbang/DB.SQL-%EB%8B%A4%EC%A4%91-%ED%96%89%EA%B7%B8%EB%A3%B9-%EB%A9%94%EC%86%8C%EB%93%9C</guid>
            <pubDate>Tue, 07 Feb 2023 10:05:28 GMT</pubDate>
            <description><![CDATA[<h1 id="다중-행-함수란">다중 행 함수란?</h1>
<p>다중 행 메소드 는 <em><strong>그룹 함수</strong></em>, <em><strong>집계 함수</strong></em> 라고도 한다.</p>
<p>단일 행 메소드와 달리 <em><strong>그룹 함수</strong></em> 는 전체 집합 또는 그룹으로 분류된 집합에 작용하여 그룹당 하나의 결과를 생성한다.</p>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/e363dfa2-a145-46a3-a3ee-dc525ea0d579/image.png" alt=""></p>
<h1 id="다중-행-함수의-종류">다중 행 함수의 종류</h1>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/521d4930-0435-4278-b373-c80e736119a8/image.png" alt=""></p>
<h4 id="distinct-와-all">DISTINCT 와 ALL</h4>
<p>다중 행 메소드에서는 
<code>DISTINCT</code> 를 사용하여 중복을 제거 할 수 있다.
중복된 데이터들도 표현하기 2 가지 방법이 있는데 ,
 <code>ALL</code>을 사용하여 중복되는 데이터를 표현 하거나
지정을 아예 안하여 중복되는 데이터를 표현할 수 있다. (즉, default 가<code>ALL</code>임)</p>
<hr>
<h3 id="count와-count">#COUNT()와 COUNT(*)</h3>
<h4 id="count">#COUNT()</h4>
<ul>
<li>COUNT() 는 <code>NULL</code> 을 제외하고 처리한다.</li>
<li>모든 타입을 사용한다.
<code>NULL</code>  을 제외하고 데이터의 갯수를 반환 
```sql
select count(sal)
from emp
where sal &gt; 1000;</li>
<li><ul>
<li>sal 이 1000 초과인 데이터의 갯수(NULL 제외) 는 12개<pre><code>![](https://velog.velcdn.com/images/hwang_bbang/post/365e0f7f-7a31-4b9e-89b2-4450ffbbb035/image.png)


</code></pre></li>
</ul>
</li>
</ul>
<h4 id="count-1">#COUNT(*)</h4>
<ul>
<li>COUNT(*) 는 <code>NULL</code> 을 포함하고 처리한다.</li>
<li>모든 타입을 사용한다.
<code>NULL</code>  을 포함한 데이터의 갯수를 반환 
```sql
select count(*)
from emp
where sal &gt; 1000;</li>
<li><ul>
<li>sal 이 1000 초과인 데이터의 갯수(NULL 포함) 는 12개<pre><code>![](https://velog.velcdn.com/images/hwang_bbang/post/ac30f7a5-0658-421e-91ec-caa48e5a61e5/image.png)
</code></pre></li>
</ul>
</li>
</ul>
<hr>
<h3 id="sum">#SUM()</h3>
<ul>
<li><code>NULL</code> 을 제외하고 처리한다.</li>
<li>숫자 타입만 사용한다.<pre><code class="language-sql">select sum(comm)
from emp;</code></pre>
<img src="https://velog.velcdn.com/images/hwang_bbang/post/cc503f24-5c69-424b-b224-e5eec9981e12/image.png" alt=""></li>
</ul>
<hr>
<h3 id="avg">#AVG()</h3>
<ul>
<li><code>NULL</code> 을 제외하고 처리한다.</li>
<li>숫자 타입만 사용한다.</li>
</ul>
<pre><code class="language-sql">select avg(comm)
from emp;</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/7a4176a2-cfe9-4094-9b7d-f435697ebaaf/image.png" alt=""></p>
<h4 id="null-값을-0으로-반환-하여-평균을-내는-경우"><code>NULL</code> 값을 0으로 반환 하여 평균을 내는 경우</h4>
<pre><code class="language-sql">select avg(nvl(comm,0))
from emp;</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/ef3da411-3d61-4e2e-a33f-12ad912a046b/image.png" alt=""></p>
<hr>
<h3 id="max">#MAX()</h3>
<ul>
<li><code>NULL</code> 을 제외하고 처리한다.</li>
<li>모든 타입을 사용한다.</li>
</ul>
<hr>
<h3 id="min">#MIN()</h3>
<ul>
<li><code>NULL</code> 을 제외하고 처리한다.</li>
<li>모든 타입을 사용한다.</li>
</ul>
<hr>
<h3 id="stddev">#STDDEV()</h3>
<ul>
<li><code>NULL</code> 을 제외하고 처리한다.</li>
<li>숫자 타입만 사용한다.</li>
</ul>
<hr>
<h3 id="variance">#VARIANCE()</h3>
<ul>
<li><code>NULL</code> 을 제외하고 처리한다.</li>
<li>숫자 타입만 사용한다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB.SQL] 단일 행 함수 ]]></title>
            <link>https://velog.io/@hwang_bbang/DB.SQL-%EB%A9%94%EC%86%8C%EB%93%9C</link>
            <guid>https://velog.io/@hwang_bbang/DB.SQL-%EB%A9%94%EC%86%8C%EB%93%9C</guid>
            <pubDate>Tue, 07 Feb 2023 09:07:00 GMT</pubDate>
            <description><![CDATA[<h1 id="단일-행-함수의-종류">단일 행 함수의 종류</h1>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/82ca3644-6129-4dd5-aed4-c7fff9d90082/image.png" alt=""></p>
<h2 id="문자-함수">#문자 함수</h2>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/fbbfd999-f03b-42a4-a712-aeabbc5567cc/image.png" alt=""></p>
<h3 id="lower">LOWER()</h3>
<h3 id="upper">UPPER()</h3>
<h2 id="숫자-함수">#숫자 함수</h2>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/a4fcdd23-3776-4b4f-a8b8-7a921f7e3fa2/image.png" alt=""></p>
<h3 id="round">ROUND()</h3>
<h3 id="trunc">TRUNC()</h3>
<h3 id="modmn">MOD(M,N)</h3>
<h3 id="abs">ABS()</h3>
<h3 id="floor">FLOOR()</h3>
<h3 id="ceil">CEIL</h3>
<h3 id="sign">SIGN</h3>
<h3 id="powermn">POWER(M,N)</h3>
<h2 id="날짜-함수">#날짜 함수</h2>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/fb047583-e09b-4423-b985-667846a9b14a/image.png" alt=""></p>
<h2 id="변환-함수">#변환 함수</h2>
<h2 id="일반-함수">#일반 함수</h2>
<hr>
<h3 id="nvlpar1-par2">NVL(par1, par2)</h3>
<p><code>NULL</code> 값을 다른 값으로 변경할 때 사용함 </p>
<p><code>par1</code>가 <code>NULL</code>이라면 <code>par2</code>를 반환 
<code>par1</code>가 <code>NULL</code>아니라면 <code>par1</code>를 반환 </p>
<pre><code class="language-sql">select ename, sal, comm, NVL(comm,0) from emp;
-- comm 가 NULL 이라면 0
-- comm 가 NULL 이 아니라면 comm
</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/d72df87f-5d50-45f8-afdc-6a244160ba90/image.png" alt=""></p>
<hr>
<h3 id="nvl2par1-par2-par3">NVL2(par1, par2, par3)</h3>
<p><code>NULL</code> 값을 다른 값으로 변경할 때 사용함 </p>
<p><code>par1</code>가 <code>NULL</code>이라면 <code>par3</code>를 반환 
<code>par1</code>가 <code>NULL</code>아니라면 <code>par2</code>를 반환 </p>
<pre><code class="language-sql">select ename, comm, NVL2(comm,&#39;[등록O]&#39;||comm, &#39;[등록X]&#39;)
from emp;
-- comm 가 NULL 이라면 par3 실행 : &#39;[등록X]&#39;
-- comm 가 NULL 이 아니라면 par2 실행 : &#39;[등록O]&#39;||comm</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/6e6e51b1-e144-46a8-8b7b-b6110234d73e/image.png" alt=""></p>
<hr>
<h3 id="nullifpar1-par2">NULLIF(par1, par2)</h3>
<p><code>par1</code> 값과 <code>par2</code>가 같을 때,  <code>NULL</code> 을 반환
<code>par1</code> 값과 <code>par2</code>가 같지 않을 때,  <code>par1</code> 을 반환</p>
<pre><code class="language-sql">select ename,job, nullif(job,&#39;SALESMAN&#39;)
from emp;

-- job 이 &#39;SALESMAN&#39; 이라면 Null 반환  
-- job 이 &#39;SALESMAN&#39; 이 아니라면 job 을 반환</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/3341f10b-3c99-426d-932f-3bea646e0559/image.png" alt=""></p>
<hr>
<h3 id="coalescepar1par2---parn">COALESCE(par1,par2, , , parN)</h3>
<p><code>par1</code> 부터 <code>parN</code>까지 순서대로 조회해서
처음으로 등장하는 <code>NULL</code> 이 아닌 값을 반환
모든 <code>par</code> 가 <code>NULL</code>이라면 <code>NULL</code> 반환</p>
<pre><code class="language-sql">select comm,sal,9999,coalesce( comm ,sal,9999)
from emp;
-- comm 이 NULL 이 아니라면 comm 반환
-- comm 이 NULL 이 라면 sal 확인 
-- sal 이 NULL 이 아니라면 sal 반환 
-- sal 이 NULL 이라면 9999 확인 
-- 9999 는 NULL 이 아니므로 9999 반환 </code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/d9246b9e-4a5c-4a27-b676-e4f8c5ea4e32/image.png" alt=""></p>
<hr>
<h3 id="decodeval-comp1-res1-comp2-res2-default">DECODE(val, comp1, res1, comp2, res2..., default)</h3>
<p><code>select</code> 에 <code>=</code> 조건을 걸어 사용할 때 사용</p>
<p>c.f) <code>where</code>절은 필터링 되어 표시 또한 <code>select</code> 절에 사용 불가함</p>
<pre><code class="language-sql">select ename, sal, decode(sal,
3000,&#39;A팀&#39;,
5000,&#39;B팀&#39;,
&#39;C팀&#39;)
from emp;
-- sal = 3000 이라면 &#39;A팀&#39;
-- sal = 5000 이라면 &#39;B팀&#39;
-- 그 외의 sal 값은 &#39;C팀&#39;</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/90212dc0-9ede-4684-aac6-c61f0c1d120b/image.png" alt=""></p>
<hr>
<h3 id="case">CASE</h3>
<p><code>select</code> 에 다양한 조건을 걸어 사용할 때 사용</p>
<blockquote>
</blockquote>
<p><code>case</code> 
<code>when</code> 조건 <code>then</code> 반환값
<code>when</code> 조건 <code>then</code> 반환값
<code>when</code> 조건 <code>then</code> 반환값
<code>else</code> 디폴트반환값 <code>end</code></p>
<p>c.f) <code>DECODE</code>는 <code>=</code>만 사용 할 수 있는 반면 , <code>CASE</code> 는 다양한 조건을 걸어서 사용 할 수 있다.</p>
<pre><code class="language-sql">select ename, sal, 
case when sal &lt; 3000 then &#39;A팀&#39;
when sal &gt; 4000 then &#39;B팀&#39;
else &#39;C팀&#39; end
from emp;
</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/6c6907fb-d9dd-4772-9db4-aa467299282b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C/C++] 문자와 문자열 ]]></title>
            <link>https://velog.io/@hwang_bbang/CC-%EB%AC%B8%EC%9E%90%EC%99%80-%EB%AC%B8%EC%9E%90%EC%97%B4</link>
            <guid>https://velog.io/@hwang_bbang/CC-%EB%AC%B8%EC%9E%90%EC%99%80-%EB%AC%B8%EC%9E%90%EC%97%B4</guid>
            <pubDate>Mon, 06 Feb 2023 12:40:34 GMT</pubDate>
            <description><![CDATA[<h2 id="문자와-단위">문자와 단위</h2>
<h3 id="char--1byte">char : 1Byte</h3>
<p>문자 하나를 1바이트로 표현 
1Byte = 8Bit 이고, 8Bit는 0<del>255 까지 이다.
하지만 맨 앞자리에 UTF-8 같은 것을 표현해야하므로, 실질적으로 0</del>127 까지만 표현 할 수 있고 아스키코드 또한 0~127 까지 있다. 
이러한 이유로 char 형을 사용하면 한글은 표현 할 수없다.</p>
<pre><code class="language-cpp">    char c = &#39;a&#39;;</code></pre>
<h3 id="wchar--2byte">wchar : 2Byte</h3>
<p>문자 하나를 2바이트로 표현 </p>
<pre><code class="language-cpp">    wchar_t c = L&#39;a&#39;;</code></pre>
<p>문자앞에 <code>L</code>을 붙혀준다. (2byte 단위로 사용한다는 의미이다.)</p>
<p>추가적으로, 문자열 이라고 다를껀 없다. 
c.f) 문자열 끝 NULL이 있는것 까지 생각해서 문자열 크기를 산정해야한다.</p>
<pre><code class="language-cpp">    wchar_t c[10] = L&quot;abcdef&quot;;</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB.SQL] SQL 문]]></title>
            <link>https://velog.io/@hwang_bbang/DB.SQL-SQL-%EB%AC%B8</link>
            <guid>https://velog.io/@hwang_bbang/DB.SQL-SQL-%EB%AC%B8</guid>
            <pubDate>Sun, 05 Feb 2023 08:52:00 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/4e4b2896-f74b-47b8-8f7e-d6e84f1ba717/image.png" alt=""></p>
<h3 id="select-구문">SELECT 구문</h3>
<pre><code class="language-sql">select 컬럼명 from 테이블명;</code></pre>
<p><code>select</code> : 표시할 Column 들을 선택함</p>
<p><code>from</code> : 테이블을 선택함 </p>
<h3 id="산술-연산">산술 연산</h3>
<p>산술 연산자 <code>+</code> ,<code>-</code>,<code>*</code>,<code>/</code> 를 이용해서 숫자나 날짜 데이터에 대한 계산 식을 작성할 수 있다.</p>
<pre><code class="language-sql">select ename, sal, sal*3 
from emp;</code></pre>
<p><strong>결과</strong>
<img src="https://velog.velcdn.com/images/hwang_bbang/post/ad865d2f-7e2a-4d32-b2de-625a58451e18/image.png" alt=""></p>
<h3 id="column의-heading-변경하기">Column의 Heading 변경하기</h3>
<pre><code class="language-sql">select col명 as 변경할 헤딩명  from ~;
select col명 변경할 헤딩명  from ~;
select col명 as &quot;변경할 헤딩명&quot;  from ~; </code></pre>
<ul>
<li><p><code>as</code> 는 생략 가능 </p>
</li>
<li><p>특수문자나 공백을 쓰고 싶을 땐 <code>&quot; &quot;</code>    을 사용하면 됨</p>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/627037ce-be40-4d8e-b835-f2f849eaa519/image.png" alt=""></p>
<h3 id="연결연산자">연결연산자</h3>
<h4 id="연결연산자를-사용하지않았을-때">연결연산자를 사용하지않았을 때</h4>
<pre><code class="language-sql">  select ename , job from emp;</code></pre>
<p><img src="https://velog.velcdn.com/images/hwang_bbang/post/937a4e67-c212-4d39-942f-b1b3be6e1904/image.png" alt=""></p>
<h4 id="연결-연산자를-사용하였을-때">연결 연산자를 사용하였을 때</h4>
<pre><code class="language-sql">select ename || job from emp;</code></pre>
<ul>
<li><code>||</code> 을 사용해서 조회하는 데이터를 붙일 수 있다. 
<img src="https://velog.velcdn.com/images/hwang_bbang/post/75307dca-1a3c-4a84-8e87-51e117a99c22/image.png" alt=""></li>
</ul>
<h3 id="중복-행-제거">중복 행 제거</h3>
<pre><code class="language-sql">select distinct deptno from emp;</code></pre>
<ul>
<li><code>distinct</code> 을 사용해서 중복을 제거 할 수 있다.</li>
<li>단, <code>distinct</code> 는 <code>select</code> 바로 뒤에 사용해야 한다.</li>
</ul>
<h3 id="where-절">WHERE 절</h3>
<p><code>where</code> 을 사용하면 조건을 주어서 Row 를 선택 할 수 있음.
다시 말해, <code>select  Col 명</code> 으로 Col 을 선택한 후, <code>where 특정조건</code> 으로 Row 를 선택하는 것 임.</p>
<pre><code class="language-sql">select Col명 from 테이블명 where 조건식;</code></pre>
<h4 id="예시">예시</h4>
<pre><code class="language-sql">select ename ,sal ,deptno
from emp
where sal &gt; 2000;</code></pre>
<p><img src="blob:https://velog.io/8b0ab319-3326-4745-83d6-fd7ba728c2e6" alt="업로드중.."></p>
<h3 id="between-a-and-b-문">between A and B 문</h3>
<pre><code class="language-sql">select ename ,sal ,deptno
from emp
where sal between 850 and 1300 ;</code></pre>
<h3 id="like--문">Like  문</h3>
<pre><code class="language-sql">select ename ,sal ,deptno
from emp
where ename like &#39;A&#39; ;</code></pre>
<p>like 를 사용하여 포함되는지 확인할 수 있다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB.SQL] 테이블 생성]]></title>
            <link>https://velog.io/@hwang_bbang/DB.SQL-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1</link>
            <guid>https://velog.io/@hwang_bbang/DB.SQL-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1</guid>
            <pubDate>Fri, 03 Feb 2023 13:45:35 GMT</pubDate>
            <description><![CDATA[<h2 id="테이블-생성">테이블 생성</h2>
<h3 id="테이블-이름-규칙">테이블 이름 규칙</h3>
<blockquote>
</blockquote>
<ul>
<li>문자로 시작해야 한다.</li>
<li>len 30 이하여야 한다.</li>
<li>중복된 테이블명이 없어야한다.</li>
<li><code>A-z</code>, <code>0-9</code>, <code>#</code>, <code>$</code>, <code>_</code> , 한글</li>
<li>Oracle 의 예약어가 아니여야 한다. </li>
</ul>
<h3 id="테이블-생성시-주의사항">테이블 생성시 주의사항</h3>
<blockquote>
</blockquote>
<ul>
<li>테이블 이름을 지정하고 각 <code>Col</code> 마다 괄호 <code>(</code>, <code>)</code> 로 묶어야 함</li>
<li><code>Col</code> 명 뒤에 데이터 타입을 꼭 지정해야함 </li>
</ul>
<p>여기서 선언한 <strong>데이터 타입</strong>은 <code>col</code> 에서 받아드릴 데이터의 유형을 설정함</p>
<p>또한, Oracle 에서 제공하는 데이터타입의 종류는 <strong>문자형</strong>, <strong>숫자형</strong> , <strong>날짜형</strong> 이 있음 </p>
<blockquote>
<h4 id="예시">예시</h4>
</blockquote>
<pre><code class="language-sql">create table 테이블명(
    col명_1 number [default 기본값][조건], 
    col명_2 char [default 기본값][조건], 
    ...
)</code></pre>
<h2 id="데이터-타입">데이터 타입</h2>
<h3 id="문자-데이터-타입">문자 데이터 타입</h3>
<blockquote>
</blockquote>
<ul>
<li><code>CHAR(size입력)</code>
길이 : 고정 
최대 : 2000Byte
Default-size : 1<blockquote>
</blockquote>
</li>
<li><code>VARCHAR2(size입력)</code>
길이 : 가변
최대 : 4000Byte
Default-size : x / 무조건 size 설정 해줘야야댐</li>
</ul>
<h3 id="숫자-데이터-타입">숫자 데이터 타입</h3>
<blockquote>
</blockquote>
<ul>
<li><code>NUMBER(precision, scale)</code>
<code>precision</code> : 최대 자릿수 설정
<code>scale</code> : 소수점 이하 자릿수 설정
특징 : 정수, 실수 모두 표현하고 저장한다.
최대크기 : 21 Byte</li>
</ul>
<h3 id="날짜-데이터-타입">날짜 데이터 타입</h3>
<blockquote>
</blockquote>
<ul>
<li><code>DATE</code>
특징 : 고정 길이의 날짜와 시간을 표현
길이 : 7 Byte</li>
<li><code>TIMESTAMP</code>
특징 : ms 까지 표현가능 
길이 : 7~11 Byte</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C/C++] 포인터와 상수]]></title>
            <link>https://velog.io/@hwang_bbang/CC-%ED%8F%AC%EC%9D%B8%ED%84%B0</link>
            <guid>https://velog.io/@hwang_bbang/CC-%ED%8F%AC%EC%9D%B8%ED%84%B0</guid>
            <pubDate>Mon, 30 Jan 2023 09:19:22 GMT</pubDate>
            <description><![CDATA[<h2 id="포인터pointer">포인터(Pointer)</h2>
<h3 id="포인터-변수란">포인터 변수란?</h3>
<blockquote>
<pre><code class="language-cpp">int* pInt1 = nullptr; 
int* pInt2 = &amp;p ; </code></pre>
</blockquote>
<pre><code>포인터 변수:  주소를 가리키는 변수이다.

### 포인터 변수의 자료형
&gt;어떤 데이터 타입을 가리킬건지 정하는 용도이다.
포인터 변수에 자료형이 있는 이유는 다음과 같다.
만약에 포인터 변수에 자료형이 없다면?
![](https://velog.velcdn.com/images/hwang_bbang/post/50a7628f-feda-4512-b8c7-01d5858757d9/image.png)
가리키는 주소로 접근하였을 때 어디까지 읽어야하는지 알 수 없다.
예를 들어 ```int``` 형은 4 Byte 인데 ```double```형은 8 Byte 이다.
이런 경우 ```double``` 형을 ```int```형으로 읽었을 떄 잘못 된 값으로 해석해서 전혀 이상한 주소로 접근 할 수 있다. 
이런 경우 때문에 주소를 가리키는 변수(포인터 변수)의 자료형이 필요하다.
&gt;
즉, 정리하자면 ```자료형``` + ```* 변수명``` 에서 ```자료형``` 은 해당 포인터에게 전달된 주소를 해석하는 단위 이다.


```cpp

// nullptr : null_Pointer == 아무것도 가리키지않는다.

int* pInt = nullptr; // int* pInt = 0;


// int* : int자료 변수를 가리키는 포인터 변수라고 선언
// pInt : 포인터 변수로서, 변수 i의 주소 값을 가리킨다(저장한다).

int i = 100;
int* pInt = &amp;i


// 포인터 변수를 이용해 변수의 값을 수정하기

// *pInt : pInt가 가리키는(저장한(주소)) 변수를 참조(접근)할게요.
// pInt는 변수i읠 주소를 저장해두었다. 
// 따라서 *pInt 는 변수i 값을 가리킨다. 

(*pInt) = 200; // i : 100 -&gt; i : 200 

</code></pre><h3 id="주소adress">주소(adress)</h3>
<blockquote>
<p>주소의 단위는 Byte = (8 Bit)
주소는 정수표현 방식</p>
</blockquote>
<pre><code class="language-cpp">int i = 0;
int* pInt = &amp;i;
pInt += 1;</code></pre>
<p>pInt 는 int* 변수 이기때문에, 따라서 가리키는 곳 (주소)를 int 로 해석한다.
따라서 <code>pInt += 1;</code>&quot;주소값을 1을 증가한다&quot; 라는 의미는 다음 int 위치로 접근 즉, <code>sizeof(int)</code> : 4Byte 단위로 증가하게 된다.</p>
<h3 id="포인터와-배열">포인터와 배열</h3>
<blockquote>
<h4 id="배열의-특징">배열의 특징</h4>
</blockquote>
<ol>
<li>배열의 묶음의 메모리는 연속적인 구조이다.</li>
<li>배열의 이름은 배열의 시작 주소이다.
```cpp
int iArr[10] = {};
// int 단위로 접근</li>
</ol>
<p>*(iArr) = 42; // 배열의 [0]인덱스로 접근 후 초기화
*(iArr + 1) = 16; // 배열의 [1]인덱스로 접근 후 초기화</p>
<pre><code>
---
## 상수 (Const)

### 상수란?
&gt; 
```cpp
const int i = 100; </code></pre><p><code>const</code>  : 변하지 않는 값 , 상수를 나타낸다.</p>
<h3 id="상수와-포인터">상수와 포인터</h3>
<blockquote>
</blockquote>
<h5 id="1-const-를-사용하지-않은-경우">#1. const 를 사용하지 않은 경우</h5>
<pre><code class="language-cpp">int a = 0;
int* pA = &amp;a;
&gt;
*pA = 1; // a = 1 ,  가능
pA = nullptr; // 가능</code></pre>
<h5 id="2-포인터-변수가-가리키는-원본을-const화-한-경우">#2. 포인터 변수가 가리키는 원본을 const화 한 경우</h5>
<p>c.f) 포인터 변수가 가리키는 원본을 수정하는 기능이 제한되는 것</p>
<pre><code class="language-cpp">int a = 0;
const int* pConstA = &amp;a;
&gt;
*pConstA = 1; // 불가능 
pConstA = nullptr; // 가능</code></pre>
<h5 id="3-포인터-변수-자체를-const화-한-경우">#3. 포인터 변수 자체를 const화 한 경우</h5>
<pre><code class="language-cpp">int a = 0;
int* const pAConst = &amp;a;
&gt;
*pAConst = 1; // 가능 
pAConst = nullptr; // 불가능</code></pre>
<h5 id="4-포인터-변수-자체와-포인터-변수가-가리키는-원본을--const화-한-경우">#4. 포인터 변수 자체와 포인터 변수가 가리키는 원본을  const화 한 경우</h5>
<pre><code class="language-cpp">int a = 0;
const int* const pConstAConst = &amp;a;
&gt;
*pAConst = 1; // 불가능 
pAConst = nullptr; // 불가능</code></pre>
<h4 id="🚨주의-사항🚨">🚨주의 사항🚨</h4>
<pre><code class="language-cpp">int a = 0;
const int* pInt = &amp;a; // 포인터변수가 가리키는 원본을 Const화
&gt;
a = 100;  // 이 코드는 문제가 되지 않는다. 
*pInt = 12; // 단, 이 코드는 문제가 된다.</code></pre>
<h5 id="why">WHY???</h5>
<p><code>const int* pInt = &amp;a;</code> 이 코드는 a 가 상수화가 된 것이 이라고 말하는게 아니다.
<code>int*</code> 포인터의 기능을 제한한 것 이지 <code>a</code> 라는 변수가 상수화가 된 것이 아니기 때문이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB.SQL]  SQL 명령문]]></title>
            <link>https://velog.io/@hwang_bbang/DB.SQL-SQL-%EB%AA%85%EB%A0%B9%EB%AC%B8</link>
            <guid>https://velog.io/@hwang_bbang/DB.SQL-SQL-%EB%AA%85%EB%A0%B9%EB%AC%B8</guid>
            <pubDate>Thu, 19 Jan 2023 11:26:47 GMT</pubDate>
            <description><![CDATA[<h2 id="sql문">SQL문</h2>
<h3 id="dmldata-manipulation-language-데이터-조작어">DML(Data Manipulation Language) 데이터 조작어</h3>
<ul>
<li><p><code>SELECT</code> : DB에서 Data를 검색할 때 사용 </p>
</li>
<li><p><code>INSERT</code> : Talbe의 새로운 행(row)을 추가한다.</p>
</li>
<li><p><code>UPDATE</code> : Talbe의 어떤 행을 변경(업데이트)한다.</p>
</li>
<li><p><code>DELETE</code> : Talbe의 행(row)을 제거한다.</p>
</li>
<li><p><code>MERGE</code> : <code>INSERT</code>와<code>UPDATE</code>를 동시에 사용한다.</p>
</li>
</ul>
<h3 id="ddldata-definition-language-데이터-정의어">DDL(Data Definition Language) 데이터 정의어</h3>
<ul>
<li><p><code>CREATE</code> : Talbe을 생성한다.</p>
</li>
<li><p><code>ALTER</code> :Talbe을 수정한다.</p>
</li>
<li><p><code>DROP</code> :Talbe을 삭제한다.</p>
</li>
<li><p><code>RENAME</code> : Talbe의 이름을 바꾼다.</p>
</li>
<li><p><code>TRUNCATE</code> : Talbe을 초기화 한다.</p>
</li>
</ul>
<h3 id="tcltransaction-control-language-트랜잭션-제어어">TCL(Transaction Control Language) 트랜잭션 제어어</h3>
<ul>
<li><p><code>GRANT</code>: 특정 DB 사용자에게 작업에 대한 엑세스 권한을 부여한다.</p>
</li>
<li><p><code>REVOKE</code>: 특정 DB 사용자에게 작업에 대한 엑세스 권한을 제거한다.</p>
</li>
</ul>
<h3 id="dcldata-control-language-데이터-제어어">DCL(Data Control Language) 데이터 제어어</h3>
<ul>
<li><p><code>COMMIT</code> : DML(데이터 조작어) 문을 반영한다. / 작업을 Commit함 </p>
</li>
<li><p><code>ROLLBACK</code> : DML(데이터 조작어) 문을 취소한다./ 원상태로 롤백(복구)한다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB] 데이터베이스 개념 및 기본용어]]></title>
            <link>https://velog.io/@hwang_bbang/DB-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B8%B0%EB%B3%B8%EC%9A%A9%EC%96%B4</link>
            <guid>https://velog.io/@hwang_bbang/DB-%EB%8D%B0%EC%9D%B4%ED%84%B0%EB%B2%A0%EC%9D%B4%EC%8A%A4-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EA%B8%B0%EB%B3%B8%EC%9A%A9%EC%96%B4</guid>
            <pubDate>Thu, 19 Jan 2023 10:52:08 GMT</pubDate>
            <description><![CDATA[<h2 id="databasedb">Database(DB)</h2>
<blockquote>
</blockquote>
<p>연관된 데이터를 모아 일정한 형태로 저장해놓은것
통합 + 저장의 형태들의 집합 이라고 할 수 있다.</p>
<h4 id="db의-4-가지-특징">DB의 4 가지 특징</h4>
<ul>
<li>*<em>Integrated *</em> </li>
<li>*<em>Stored *</em> </li>
<li>*<em>Operational *</em></li>
<li>*<em>Shared *</em> </li>
</ul>
<h2 id="database-management-systemdbms">Database Management System(DBMS)</h2>
<blockquote>
</blockquote>
<p>직역 하면, 데이터 베이스 관리 프로그램 
DBMS 를 활용하여 데이터를 입력 ,수정,삭제 등의 동작을 수행한다.</p>
<h4 id="dbms의-6가지-특징">DBMS의 6가지 특징</h4>
<ul>
<li>데이터 중복의 최소화</li>
<li>데이터의 공용화</li>
<li>데이터의 일관성 유지</li>
<li>데이터의 무결성 유지</li>
<li>데이터의 보안성</li>
<li>표준화</li>
</ul>
<h2 id="entity-relationship-diagramerd">Entity Relationship Diagram(ERD)</h2>
<blockquote>
</blockquote>
<p>개체-관계 모델. 테이블간의 관계를 설명해주는 다이어그램
즉  DB의 구조 이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C/C++] 전처리기]]></title>
            <link>https://velog.io/@hwang_bbang/CC-%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0</link>
            <guid>https://velog.io/@hwang_bbang/CC-%EC%A0%84%EC%B2%98%EB%A6%AC%EA%B8%B0</guid>
            <pubDate>Wed, 18 Jan 2023 05:05:50 GMT</pubDate>
            <description><![CDATA[<p>본 포스팅은 <a href="https://velog.io/@hwang_bbang/CC-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90">[C/C++] 비트 연산자</a>과 연관되어있습니다. <a href="https://velog.io/@hwang_bbang/CC-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90">[C/C++] 비트 연산자</a>를 보지 않으셨다면 보고오시는것을 추천드립니다.</p>
<h3 id="전처리기란">전처리기란?</h3>
<p><code>#</code>이 붙은 구문은 모든 컴파일 과정 중 가장 먼저 처리된다. 이 과정을 <em><strong>전처리기</strong></em> 라고한다.</p>
<h4 id="define-전처리기">define 전처리기</h4>
<h5 id="전처리기-전">&lt;전처리기 전&gt;</h5>
<pre><code class="language-cpp">    #define STARVE 0x0
    #define NORMAL 0x1
    #define FULL 0x2

    int main(void)
    {
     unsigned int state = 0x0;
     state = state | STARVE;
     state = state | NORMAL;
     state = state | FULL;

      if (state &amp; STARVE){
          cout &lt;&lt; &quot;i&#39;m hungry&quot;;
          }
      else if (state &amp; NORMAL){
          cout &lt;&lt; &quot;i&#39;m good&quot;;
          }
      else if (state &amp; FULL){
          cout &lt;&lt; &quot;i&#39;m full&quot;;
          }
      else{
          cout &lt;&lt; &quot;i don&#39;t know&quot;;
          }
      int state = NORMAL;          
      int state = FULL;

    }</code></pre>
<blockquote>
</blockquote>
<p>전처리 과정을 먼저 거친 후 코드가 진행된다.</p>
<h5 id="전처리기-후">&lt;전처리기 후&gt;</h5>
<pre><code class="language-cpp">    #define STARVE 0x0
    #define NORMAL 0x1
    #define FULL 0x2

    int main(void)
    {

     unsigned int state = 0x0;

     state = state | STARVE;
     state = state | NORMAL;
     state = state | FULL;

      if (state &amp; 0x0){
          cout &lt;&lt; &quot;i&#39;m hungry&quot;;
          }
      else if (state &amp; 0x1){
          cout &lt;&lt; &quot;i&#39;m good&quot;;
          }
      else if (state &amp; 0x2){
          cout &lt;&lt; &quot;i&#39;m full&quot;;
          }
      else{
          cout &lt;&lt; &quot;i don&#39;t know&quot;;
          }

      int state = 2;

    }</code></pre>
<h3 id="전처리기를-왜-사용할까">전처리기를 왜 사용할까?</h3>
<blockquote>
<p><code>define</code> 전처리기를 사용하면?
-&gt; <em><strong><em>가독성</em></strong></em> 을 얻을 수 있다.
-&gt; <em><strong><em>유지 보수</em></strong></em> 에 용이하다.</p>
</blockquote>
<p>오류나 질문에 대한 문의 댓글 혹은 메일로 남겨주세요!</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[C/C++] 비트 연산자]]></title>
            <link>https://velog.io/@hwang_bbang/CC-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90</link>
            <guid>https://velog.io/@hwang_bbang/CC-%EB%B9%84%ED%8A%B8-%EC%97%B0%EC%82%B0%EC%9E%90</guid>
            <pubDate>Wed, 18 Jan 2023 05:05:12 GMT</pubDate>
            <description><![CDATA[<p>본 포스팅은 [[C / C++] 진법과 비트] (<a href="https://velog.io/@hwang_bbang/CC-%EC%A7%84%EB%B2%95%EA%B3%BC-%EB%B9%84%ED%8A%B8)%EC%99%80">https://velog.io/@hwang_bbang/CC-%EC%A7%84%EB%B2%95%EA%B3%BC-%EB%B9%84%ED%8A%B8)와</a> 연관되어있습니다. [[C / C++] 진법과 비트] (<a href="https://velog.io/@hwang_bbang/CC-%EC%A7%84%EB%B2%95%EA%B3%BC-%EB%B9%84%ED%8A%B8)%EB%A5%BC">https://velog.io/@hwang_bbang/CC-%EC%A7%84%EB%B2%95%EA%B3%BC-%EB%B9%84%ED%8A%B8)를</a> 보지 않으셨다면 보고오시는것을 추천드립니다.</p>
<h1 id="비트-연산자">비트 연산자</h1>
<h3 id="쉬프트">쉬프트</h3>
<p><code>&lt;&lt;</code>, <code>&gt;&gt;</code> 화살표가 가리키는 방향으로 한칸씩 민다.</p>
<h4 id="2진수">2진수</h4>
<p>$$
0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 1 \ _2 = 1 
$$
$$
\ shift \ (\Leftarrow) \qquad \times 2
$$
$$
\0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 1 \ 0 \ _2 = 2 
$$
$$
\ shift \ (\Leftarrow) \qquad \times 2
$$
$$
\0 \ 0 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ _2 = 4 
$$
$$
\ shift \ (\Leftarrow) \qquad \times 2
$$
$$
\0 \ 0 \ 0 \ 0 \ 1 \ 0 \ 0 \ 0 \ _2 = 8 
$$</p>
<hr>
<h4 id="10진수">10진수</h4>
<p>$$
\qquad\quad 2 _{10} \  = \ 2 
$$
$$
\ shift \ (\Leftarrow) \ \ \ \times 10
$$
$$
\qquad\quad 20 _{10} \  = \ 20 
$$
$$
\ shift \ (\Leftarrow) \ \ \ \times 10
$$
$$
\qquad\quad 200 _{10} \  = \ 200 
$$
$$
\ shift \ (\Leftarrow) \ \ \ \times 10
$$
$$
\qquad\quad 2000 _{10} \  = \ 200 0
$$</p>
<blockquote>
</blockquote>
<p>10진수 에서 자릿수 하나가 올라간다. -&gt; 10배 증가
2진수 에서 자릿수 하나가 올라간다. -&gt; 2배 증가</p>
<h4 id="소스코드">소스코드</h4>
<pre><code class="language-cpp">    // 쉬프트 &lt;&lt;, &gt;&gt; 화살표가 가리키는 방향으로 한칸씩 민다.

    // 2진수 에서 자릿수 하나가 올라간다. -&gt; 2배 증가
    // 10진수 에서 자릿수 하나가 올라간다. -&gt; 10배 증가

    int n ; 

    unsigned char byte = 1;

    byte = byte &lt;&lt; 1; // 한 칸 민다.
    byte &lt;&lt;= 1; // 한 칸 민다. 2배 한다.
    byte &lt;&lt;= 3; // 세 칸 민다. 2^3배 한다.
    byte &lt;&lt;= n; // 2^n 배 한다.


    // &gt;&gt; 으로 밀때는 
    // 나누기  만약 나머지가 남는다면 ?
    // 주어진 구간밖으로 밀려남 -&gt; 사라짐 

    byte = byte &gt;&gt; 1; // 한 칸 민다.
    byte &gt;&gt;= 1; // 한 칸 민다. 2으로 나눈 몫이된다.
    byte &gt;&gt;= 3; // 세 칸 민다. 2^3 으로 나눈 몫이된다.
    byte &gt;&gt;= n; // 2^n 으로 나눈 몫이된다.
</code></pre>
<h3 id="비트-곱">비트 곱</h3>
<p><code>&amp;</code> 비트간의 AND 연산이다.</p>
<p>$$
10010011 \ &amp; \ 10000001 \ = <br>                10000001
$$</p>
<h3 id="비트-합">비트 합</h3>
<p><code>|</code> 비트간의 OR 연산이다.</p>
<p>$$
10010011 \ | \ 10000001 \ = <br>10010011
$$</p>
<h3 id="비트-역">비트 역</h3>
<p><code>~</code> 비트간의 NOT 연산이다.</p>
<p>$$
\sim 10010011 \ = <br>01101100
$$</p>
<h3 id="특정-자리의-비트값-제거">특정 자리의 비트값 제거</h3>
<p>특정 비트값을 제거하기위해선 많은 방법이 있다.
그 중에서 <code>~</code>역 연산 후 <code>&amp;</code>곱 연산을 하여 비트 값을 제거할 수 있다.</p>
<pre><code class="language-cpp">    unsigned int A;
    unsigned int B;

    A = A &amp; (~B);</code></pre>
<p>$$
 111010\mathbf10 \ &amp;= <br>(\sim 00000010)
$$
$$
 111010\mathbf10 \ &amp;= <br>(11111101)
$$
$$
 111010\mathbf00
$$</p>
<p>오류나 질문에 대한 문의 댓글 혹은 메일로 남겨주세요!</p>
]]></description>
        </item>
    </channel>
</rss>