<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>굴굴이의 삶</title>
    <link>https://gyk7.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 26 Aug 2026 22:01:42 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>gyk7</managingEditor>
    <image>
      <title>굴굴이의 삶</title>
      <url>https://tistory1.daumcdn.net/tistory/6680505/attach/3101aafc5c7a4ebdb9ca908606a608fd</url>
      <link>https://gyk7.tistory.com</link>
    </image>
    <item>
      <title>Join의 종류와 수행원리(1)</title>
      <link>https://gyk7.tistory.com/61</link>
      <description>&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- JOIN의 종류&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Inner Join, Outer Join, Cross Join, Natural Join 외에도&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Nested Loop Join, Sort Merge Join, Hash Join이 있다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;우선 Join은 2개 이상의 테이블에서 조건에 맞는 데이터를 추출하기 위해 사용하는 쿼리문을 의미한다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Inner Join&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2개 이상의 테이블에서 교집합만을 추출한다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Left Outer Join&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2개 이상의 테이블에서 FROM문에 해당하는 부분을 추출한다. 보통 RIGHT JOIN보다 LEFT JOIN을 주로 사용한다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Right Outer Join&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2개 이상의 테이블에서 FROM문의 테이블과 JOIN하는 테이블에 해당하는 부분을 추출한다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. Cross Join&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;한 쪽 테이블의 모든 행과 다른 쪽 테이블의 모든 행을 조인시키는 기능이다. 상호 조인 결과의 전체 행 개수는 두 테이블의 각 행의 개수를 곱한 수만큼이 된다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CARTESIAN PRODUCT(카티션 곱)&lt;/b&gt;라고도 한다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. Natural Join&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;공통된 속성을 찾아 같은 값을 갖는 항목끼리 결합시켜준다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* Natural Join vs Inner Join&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;- Inner Join은 조인 조건을 ON 또는 USING 절을 사용하여 명시적으로 지정해야 한다.&lt;/p&gt;
&lt;p style=&quot;color: #222222; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; Natural Join은 두 테이블 간에 동일한 이름을 가진 열을 기준으로 자동으로 조인해서 일치하는 열의 이름을 명시적으로 지정할 필요가 X&lt;/p&gt;</description>
      <category>DB 공부</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/61</guid>
      <comments>https://gyk7.tistory.com/61#entry61comment</comments>
      <pubDate>Mon, 6 Jan 2025 10:11:05 +0900</pubDate>
    </item>
    <item>
      <title>JOIN 종류와 수행 원리(2)</title>
      <link>https://gyk7.tistory.com/60</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- JOIN의 종류&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Inner Join, Outer Join, Cross Join, Natural Join 외에도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Nested Loop Join, Sort Merge Join, Hash Join이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Nested Loop Join&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 중첩 for문과 같은 원리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) IDOL_GROUP, IDOL_MEMBER 테이블을 조인시키려 하고, 조인을 할 수 있는 연결고리는 GROUP_NAME이라고 할 때, 소녀시대 데이터(IDOL_GROUP) 데이터가 멤버 테이블(IDOL_MEMBER) 테이블로 가서 멤버들을 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IDOL_GROUP : Outer Table&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;IDOL_MEMBER : Inner Table&lt;/b&gt; 이 되는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;* 유의해야 할 점 : Inner Table에서&lt;b&gt; Join 컬럼이 인덱스에&lt;/b&gt; 걸려 있지 않으면 굉장한 비효율이 발생한다. 그 이유는 한 건 한 건 갈 때마다 full scan을 해야하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 inner table의 구성 전략에 매우 중요한 요소가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대량의 테이블을 Join하는 방식으로는 적절하지 않고, OLTP 쿼리에 적절하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;GROUP TABLE과 MEMBER TABLE은 1:M의 관계인데&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 1에 해당하는 소량의 데이터를 가진 테이블이 Outer Table로 설정되는 것이 성능에 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Sort Merge Join&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;마찬가지로 중첩 for문과 유사한 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Nested Loop Join과 다른 점은&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블과 테이블을 우선 Join 컬럼을 기준으로 &lt;b&gt;정렬을 시키고 나서, join&lt;/b&gt; 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INNER TABLE 쪽에 적절한 인덱스가 없어 Nested Loop Join을 쓰기에 비효율적인 경우 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- equal Join이 아니라 &lt;b&gt;범위로 Join&lt;/b&gt;을 하는 경우 적절한 수행 원리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- table random access가 일어나지 않고, sorting 작업이 PGA 영역에서 수행되기 때문에 경합이 발생하지 않아서 성능에 유리하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. Hash Join&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;배치 시스템&lt;/b&gt;에서 적절한 수행원리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;b&gt; 대용량 테이블을 JOIN&lt;/b&gt;할 때 HASH JOIN을 사용하면 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 수행 원리 : MEMBER 테이블이 굉장한 대용량 테이블일 때, GROUP 테이블을 Build Input으로 삼아서 Hash 영역에 저장 해놓는다. Hash 영역은 Sort Merge Join과 마찬가지로 Sort Area처럼 PGA영역에 있기 때문에 처리 속도가 매우 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 IDOL_GROUP 테이블이 Hash 영역으로 올라가고, IDOL_MEMBER 테이블이 읽히면서 Join이 되는 원리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Hash 영역으로 올라갈 때는 Join 컬럼을 기준으로 Hash Function이 적용되기 때문에 이 Key 컬럼에 &lt;b&gt;중복값이 없을수록 성능에 유리&lt;/b&gt;하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;EQUAL 조인만&lt;/b&gt; 가능하다. Sort Merge Join처럼 Random Access 부하가 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;* 유의할 점&lt;/b&gt; : Hash 영역에 들어가는 테이블의 크기가 충분히 작아야 성능에 유리하다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Hash 영역의 사이즈가 정해져 있는데 테이블의 용량이 그것을 초과해서 벗어나게 되면, 오히려 디스크 영역을 사용하게 되기 때문에 성능에 매우 불리해진다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또, 수행 빈도가 높은 OLTP에서 Hash Join으로 풀리게 되면 오히려 cpu나 메모리의 사용량이 늘어서 성능이 안 좋아질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 실행 계획을 확인(I/0나 실행시간)하고, ORACLE hint를 써서 다른 수행 방식으로 풀릴 수 있도록 유도를 하는 게 효과적인 튜닝 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : 유튜브 SQL 전문가 정미나님 강의&lt;/p&gt;</description>
      <category>DB 공부</category>
      <category>hash join</category>
      <category>nested loop join</category>
      <category>sort merge join</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/60</guid>
      <comments>https://gyk7.tistory.com/60#entry60comment</comments>
      <pubDate>Mon, 6 Jan 2025 09:57:02 +0900</pubDate>
    </item>
    <item>
      <title>오라클 파티션 인덱스</title>
      <link>https://gyk7.tistory.com/59</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;파티션 테이블에 인덱스를 생성하게 될 때 인덱스에도 타입이 나눠지게 됨.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;로컬 파티션 인덱스, 비파티션 인덱스, 글로벌 파티션 인덱스&lt;/b&gt;가 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 중 로컬 파티션 인덱스를 많이 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;로컬 파티션 인덱스&lt;/b&gt; : &lt;b&gt;테이블 파티션 키 컬럼 기준으로 똑같이 인덱스가 구성되는 것.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;테이블의 파티션 구조가 바뀐다거나 파티션이 삭제가 된다거나 했을 때도 인덱스 재생성이 필요없이 Oracle에서 알아서 관리해주기 때문에 운영에 용이함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 테이블의 파티션이 5개라고 했을 때, 인덱스도 똑같이 5개. 나뉘어지는 기준도 테이블과 동일함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;비파티션 인덱스 : 테이블은 파티션으로 나뉘어져 있지만 인덱스는 통짜로 하나로 관리함.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;b&gt;글로벌 파티션 인덱스 : 파티션으로 인덱스가 나뉘어져 있지만 테이블의 파티션과는 따로 논다. 잘 사용되지 않음.&lt;/b&gt;&lt;/p&gt;</description>
      <category>DB 공부</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/59</guid>
      <comments>https://gyk7.tistory.com/59#entry59comment</comments>
      <pubDate>Wed, 27 Nov 2024 17:40:45 +0900</pubDate>
    </item>
    <item>
      <title>문자열 관련 함수들</title>
      <link>https://gyk7.tistory.com/58</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Oracle&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. LOWER(문자열) / UPPER(문자열) / INITCAP(문자열)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LOWER : 문자열을 모두 소문자로 변환하여 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UPPER : 문자열을 모두 대문자로 변환하여 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;INITCAP : 문자열의 첫 번째 문자는 대문자, 나머지는 소문자로 변환하여 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1724853026565&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 
	LOWER('hello ORACLE!') AS LOWER,
	UPPER('hello ORACLE!') AS UPPER,
    INITCAP('hello ORACLE!') AS INITCAP
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 44.9982%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.31%;&quot;&gt;&lt;b&gt;LOWER&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.5426%;&quot;&gt;&lt;b&gt;UPPER&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 15.637%;&quot;&gt;&lt;b&gt;INITCAP&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 15.31%;&quot;&gt;hello oracle!&lt;/td&gt;
&lt;td style=&quot;width: 15.5426%;&quot;&gt;HELLO ORACLE!&lt;/td&gt;
&lt;td style=&quot;width: 15.637%;&quot;&gt;Hello Oracle!&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. LENGTH(문자열)&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1724853264892&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	LENGTH('Hello Oracle') AS LENGTH
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 10%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;&lt;b&gt;LENGTH&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 100%;&quot;&gt;12&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. CONCAT(문자열1, 문자열2)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열1과 문자열2를 합친다.&lt;/p&gt;
&lt;pre id=&quot;code_1724853414982&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	CONCAT('Hello', 'World') AS CASE1,
    CONCAT('Happy', 'Day') AS CASE2
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724853489482&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT 
	'Hello' || 'World' AS CASE1,
    'Happy' || 'Day' AS CASE2
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 24.302%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.88256%;&quot;&gt;&lt;b&gt;CASE1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 9.87651%;&quot;&gt;&lt;b&gt;CASE2&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 8.88256%;&quot;&gt;HelloWorld&lt;/td&gt;
&lt;td style=&quot;width: 9.87651%;&quot;&gt;HappyDay&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724853643632&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	CONCAT(CONCAT('Hello', ' '), 'World') AS CASE1,
    CONCAT(CONCAT('Happy', ' '), 'Day') AS CASE2
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1724853721730&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	'Hello' || ' ' || 'World' AS CASE1,
     'Happy' || ' ' || 'Day' AS CASE2
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 23.8372%; height: 34px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.2093%; height: 17px;&quot;&gt;&lt;b&gt;CASE1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.6279%; height: 17px;&quot;&gt;&lt;b&gt;CASE2&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 12.2093%; height: 17px;&quot;&gt;Hello World&lt;/td&gt;
&lt;td style=&quot;width: 11.6279%; height: 17px;&quot;&gt;Happy Day&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. SUBSTR(문자열, 시작위치, 길이)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;길이는 생략 가능. 생략 시 문자열의 끝까지 반환.&lt;/p&gt;
&lt;pre id=&quot;code_1724853905600&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	SUBSTR('Hello World', 2) AS CASE1,
    SUBSTR('Hello World', 8, 4) AS CASE2
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 22.907%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.093%;&quot;&gt;&lt;b&gt;CASE1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 10.814%;&quot;&gt;&lt;b&gt;CASE2&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 12.093%;&quot;&gt;ello World&lt;/td&gt;
&lt;td style=&quot;width: 10.814%;&quot;&gt;orld&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-를 쓰면 문자열을 뒤에서부터 자르는 것도 가능함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. LPAD(문자열, 길이, 문자) / RPAD(문자열, 길이, 문자)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력받은 문자열에서 길이까지 입력 문자로 채운다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LPAD : 왼쪽, RPAD : 오른쪽&lt;/p&gt;
&lt;pre id=&quot;code_1724854164918&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	LPAD(10, 5, '0') AS CASE1,
    LPAD(11, 5, '0') AS CASE2,
    LPAD(12, 5, '0') AS CASE3
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 32.2075%; height: 34px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.5891%; height: 17px;&quot;&gt;&lt;b&gt;CASE1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.124%; height: 17px;&quot;&gt;&lt;b&gt;CASE2&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 9.4961%; height: 17px;&quot;&gt;&lt;b&gt;CASE3&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 11.5891%; height: 17px;&quot;&gt;00010&lt;/td&gt;
&lt;td style=&quot;width: 11.124%; height: 17px;&quot;&gt;00011&lt;/td&gt;
&lt;td style=&quot;width: 9.4961%; height: 17px;&quot;&gt;00012&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1724854344319&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	RPAD(1, 5, '0') AS CASE1,
    RPAD(2, 5, '0') AS CASE2,
    RPAD(3, 5, '0') AS CASE3
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 31.3954%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;&lt;b&gt;CASE1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 10.3101%;&quot;&gt;&lt;b&gt;CASE2&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 11.1829%;&quot;&gt;&lt;b&gt;CASE3&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 11.0077%;&quot;&gt;10000&lt;/td&gt;
&lt;td style=&quot;width: 10.3101%;&quot;&gt;20000&lt;/td&gt;
&lt;td style=&quot;width: 11.1829%;&quot;&gt;30000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. TRIM(문자열) / LTRIM(문자열, 옵션) / RTRIM(문자열, 옵션)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TRIM : 문자열의 양쪽 공백을 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LTRIM : 문자열의 왼쪽 공백을 제거하거나, 특정 문자, 반복적인 문자를 제거&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RTRIM : 문자열의 오른쪽 공백을 제거하거나, 특정 문자, 반복적인 문자를 제거&lt;/p&gt;
&lt;pre id=&quot;code_1724854547443&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	TRIM('        Hi      ') AS CASE1,
    TRIM('     Hello      ') AS CASE2
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 19.4186%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;&lt;b&gt;CASE1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 9.3023%;&quot;&gt;&lt;b&gt;CASE2&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 10.1163%;&quot;&gt;Hi&lt;/td&gt;
&lt;td style=&quot;width: 9.3023%;&quot;&gt;Hello&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre id=&quot;code_1724854691764&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT
	LTRIM('    Hi    ') AS CASE1,
    LTRIM('   ?    !') AS CASE2,
    LTRIM('HiHiHello', 'Hi') AS CASE3,
    LTRIM('HiHi Hello', 'H') AS CASE4
FROM test;&lt;/code&gt;&lt;/pre&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;CASE1&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;CASE2&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;CASE3&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;&lt;b&gt;CASE4&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;Hi____&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;?!&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;ello&lt;/td&gt;
&lt;td style=&quot;width: 25%;&quot;&gt;iHi Hello&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB 공부</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/58</guid>
      <comments>https://gyk7.tistory.com/58#entry58comment</comments>
      <pubDate>Wed, 28 Aug 2024 23:24:20 +0900</pubDate>
    </item>
    <item>
      <title>null 값 처리 함수들 특징</title>
      <link>https://gyk7.tistory.com/57</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Oracle&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;NVL(A, B)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 값 A가 NULL일 경우 B로 대체하여 반환한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 값 A가 NULL이 아닐 경우에는 A 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;NVL2(A, B, C)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력값 A가 NULL이 아니면 B, NULL이면 C로 변환하여 반환한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;COALESCE(A, B, C, ...)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A가 NULL이면 B, B도 NULL이면 C와 같이 변환하여 반환한다. ( &lt;b&gt;NULL이 아닌 첫 번째 인자의 값을 반환한다는 뜻. 모든 인자가 NULL이면 NULL 반환&lt;/b&gt;)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;COALESCE 함수는 NVL 함수보다 확장된 개념으로 여러 개의 컬럼의 NULL 값 여부를 판별하면서 값을 변환할 때 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;NULLIF(A, B)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력값 A가 B와 같으면 NULL로 변환하여 반환한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같지 않으면 A 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. &lt;b&gt;LNNVL(조건식)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- LNNVL 함수는 WHERE 절에 사용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조건문 내에 존재하는 컬럼의 값이 NULL이면 TRUE 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조건문에 해당하는 값이 FALSE 또는 UNKNOWN이면 TRUE 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 조건문이 TRUE이면 FALSE 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MYSQL&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1.&lt;b&gt; ISNULL(A, B)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A가 NULL일 경우 B 반환.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ORACLE의 NVL( ) 함수와 같은 기능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;COALESCE(A, B, C, ...)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;목록에서 NULL이 아닌 값을 반환하는 기능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;CASE 문 활용&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CASE 함수는 CASE 조건을 통과하고 첫 번째 조건이 충족될 때 값을 반환함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 조건이 TRUE이면 읽기를 중지하고 결과를 반환함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;조건이 FALSE이면 ELSE 값을 반환함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB 공부</category>
      <category>mysql</category>
      <category>null값</category>
      <category>Oracle</category>
      <category>sql</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/57</guid>
      <comments>https://gyk7.tistory.com/57#entry57comment</comments>
      <pubDate>Tue, 27 Aug 2024 17:08:58 +0900</pubDate>
    </item>
    <item>
      <title>Oracle vs PostgreSQL</title>
      <link>https://gyk7.tistory.com/56</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Oracle의 특징&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대규모 데이터베이스를 지원한다. MSSQL, MYSQL보다 대량의 정보관리를 할 때에 가장 좋은 성능을 보인다.(고가의 HW를 효율적으로 활용할 수 있도록 영역 사용을 완벽하게 제어한다. )&lt;/li&gt;
&lt;li&gt;고성능 트랜잭션 처리를 제공하여 속도가 빠르다.&lt;/li&gt;
&lt;li&gt;SQL문을 실행하는 가장 효율적인 방법을 선택한다.&lt;/li&gt;
&lt;li&gt;Oracle 서버가 운영되려면 인스턴스가 메모리에 할당되어야 하며, 이를 위해서는 파라미터 파일이 필요하다.&lt;/li&gt;
&lt;li&gt;다중 동시 데이터 베이스 사용자를 지원한다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;여러 사용자가 동일한 데이터에서 작동하는 다양한 데이터베이스 응용 프로그램을 실행하도록 지원하여 데이터 경합을 최소화하고 데이터 동시성을 보장&lt;/li&gt;
&lt;li&gt;데이터 경합(row level locking) : 데이터 경쟁, 한 사용자가 데이터를 변경하려고 접근할 때 데이터에 lock이 걸리는 것 말함.&lt;/li&gt;
&lt;li&gt;데이터 동시성 : 다수의 사용자가 동시에 접근 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유료이기 때문에, 상당히 비싼 비용 지불해야 함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;PostgreSQL&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대용량 데이터 처리를 위한 기능 구현.&lt;/li&gt;
&lt;li&gt;다양한 운영체제를 지원함.&lt;/li&gt;
&lt;li&gt;DB 보안을 위해 데이터 암호화, 접근 제어, 접근 감시 3가지로 구성되어 있음.&lt;/li&gt;
&lt;li&gt;C, C++, PL/python 등 여러 언어를 지원함.&lt;/li&gt;
&lt;li&gt;신뢰성과 안정성이 매우 높다.&lt;/li&gt;
&lt;li&gt;오픈 소스이기 때문에 무료로 사용 가능함.&lt;/li&gt;
&lt;li&gt;처리 속도를 빠르게 하기 위해 여러 CPU를 활용하여 쿼리를 실행함.&lt;/li&gt;
&lt;li&gt;데이터베이스 클러스터 백업 기능을 제공함. (클러스터 : 디스크로부터 데이터를 읽어오는 시간을 줄이기 위해 자주 사용되는 테이블의 데이터를 디스크의 같은 위치에 저장시키는 방법)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Oracle vs PostgreSQL&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. MVCC 모델 구현 방식의 차이&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MVCC란, 다중 버전 동시성 제어(multiversion concurrency contrl, MCC, MVCC)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 동시성 제어 없이 누군가가 데이터베이스를 읽는 동시에 다른 누군가가 기록을 하려고 한다면 사용자는 반쯤 기록되거나 일관성이 없는 데이터를 보게 될 가능성이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동시성을 높이기 위해서는 '읽기 작업은 쓰기 작업을 블로킹하지 않고, 쓰기 작업은 읽기 작업을 블로킹하지 않아야 한다'는 원칙을 지켜야 한다. 그 원칙을 지키기 위해 MVCC가 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Oracle : MVCC를 구현하기 위해 UNDO 세그먼트를 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PostgreSQL : 블록 내에 이전 레코드를 저장하는 방식 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. Shared Pool 존재 여부&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Oracle에서는 Parsing작업(문법체크, 권한 유무, Library cache에 기존 쿼리가 있는지를 체크하는 작업)을 하기 위해 Shared Pool을 사용함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Parsing된 정보를 저장하는 Library Cache와 이러한 Parsing 작업을 진행하는 데 필요한 Data Dictionary의 정보를 메모리상에 올려 저장하는 Data Dictionary Cache가 Shared Pool의 핵심이라 볼 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이 Shared&amp;nbsp; Pool을 PostgreSQL에서는 제공 X.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대신, 프로세스 레벨에서 SQL 정보를 공유하는 기능을 제공함. 즉, 하나의 프로세스에서 같은 SQL을 여러번 수행하면 최초 1회만 하드 파싱(Library cache 이전에 실행했던 쿼리가 없는 경우 진행)을 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. PostgreSQL의 사용이 많아지는 이유&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 비용절감.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 빠르고 유연한 개발&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 호환성과 유연성&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Oracle과 PostgreSQL의 문법 차이&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 411px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 20px;&quot;&gt;Oracle&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 20px;&quot;&gt;PostgreSQL&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 20px;&quot;&gt;비고&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 40px;&quot;&gt;decode&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 40px;&quot;&gt;case when&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 40px;&quot;&gt;PostgreSQL에는 decode가 없다,&lt;br /&gt;case when으로 대체해야 한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 40px;&quot;&gt;sysdate&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 40px;&quot;&gt;now&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 40px;&quot;&gt;PostgreSQL에서는 현재 날짜 시간을&amp;nbsp;&lt;br /&gt;now() 함수를 써야한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 40px;&quot;&gt;시퀀스명.NEXTVAL&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 40px;&quot;&gt;NEXTVAL('시퀀스명')&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 40px;&quot;&gt;PostgreSQL에서는 시퀀스(SEQUENCE) 문법이 다르다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 60px;&quot;&gt;nvl&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 60px;&quot;&gt;coalesce&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 60px;&quot;&gt;Oracle은 타입 불일치시 묵시적 형변환 발생, postgre는 컬럼 타입 불일치 시 오류(상수는 가능)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 60px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 60px;&quot;&gt;CLOB&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 60px;&quot;&gt;TEXT&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 60px;&quot;&gt;CLOB : 사이즈가 큰 데이터를 외부 파일로 저장하기위한 데이터 타입, 문자열 데이터를 DB 외부에 저장하기 위한 타입.&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 17px;&quot;&gt;connected by&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 17px;&quot;&gt;with recursive&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 17px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 40px;&quot;&gt;(+)&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 40px;&quot;&gt;outer join&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 40px;&quot;&gt;PostgreSQL에서는 outer join시 (+)를 사용할 수 없다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 40px;&quot;&gt;select '컬럼' from dual&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 40px;&quot;&gt;select '컬럼' from&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 40px;&quot;&gt;PostgreSQL에서는 dual을 사용할 수 없다. dual을 제외하고 사용한다.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 20px;&quot;&gt;CAST&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 20px;&quot;&gt;::[변환할 데이터 타입]&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 20px;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 34px;&quot;&gt;
&lt;td style=&quot;width: 21.124%; height: 34px;&quot;&gt;Select from (select from table_name);&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%; height: 34px;&quot;&gt;Select from (select from table_name) as alias_name;&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%; height: 34px;&quot;&gt;From 절 subquery 사용시 alias 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.124%;&quot;&gt;문자/숫자 비교 묵시적 형변환&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%;&quot;&gt;문자/숫자 비교 시 오류&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;수치 비교시 타입 다르면 오류&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.124%;&quot;&gt;number&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%;&quot;&gt;numeric&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;데이터 타입 차이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.124%;&quot;&gt;Varchar2&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%;&quot;&gt;Varchar&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;데이터 타입 차이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.124%;&quot;&gt;rownum &amp;lt;&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%;&quot;&gt;limit&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;Where 절&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.124%;&quot;&gt;rownum&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%;&quot;&gt;Row_number() over() as rownum&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;Select 절&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 21.124%;&quot;&gt;Instr()&lt;/td&gt;
&lt;td style=&quot;width: 31.4728%;&quot;&gt;Position()&lt;/td&gt;
&lt;td style=&quot;width: 47.4031%;&quot;&gt;문자열 index 찾는 함수 instr(문자열, 검색할 문자) : 해당 문자가 시작되는 위치 반환&lt;br /&gt;instr(문자열, 검색할 문자, 시작시점, n번째 검색단어) : 문자열의 시작시점 설정 &amp;amp; n 번째 나오는 위치 반환&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>DB 공부</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/56</guid>
      <comments>https://gyk7.tistory.com/56#entry56comment</comments>
      <pubDate>Mon, 26 Aug 2024 13:07:15 +0900</pubDate>
    </item>
    <item>
      <title>오라클 쿼리 힌트</title>
      <link>https://gyk7.tistory.com/55</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;힌트(Hint) : dbms에게 SQL의 최적화를 위해 힌트를 주는 것. 데이터베이스관리자나 개발자가 오라클 내부 Optimizer가 선택한 explain plan(실행 계획)을 인위적으로 조정할 수 있는 방법.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Oracle 힌트란&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/* */로 둘러싸여 있음. 단순 주석이 아닌 힌트로 특정 실행계획을 변경하는 지시어&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힌트 작동 방식은 SQL 쿼리를 처리할 때 비용 기반 최적화를 수행함. 비용을 계산해 가장 효율적인 실행 계획을 결정함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Oracle 힌트 사용법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힌트는 오라클 Optimizer에게 힌트를 준다고 생각해도 무방함. 사용하는 방법은 /* + */ 안에 지정하는 형태임.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 /*+ordered*/ 라고 했다면 테이블이 조인되는 순서를 정하는 효과가 난다. from절에 테이블 순서대로 조인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하라는 의미이다.&lt;/p&gt;
&lt;pre id=&quot;code_1724638895473&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;SELECT&amp;nbsp;/*+&amp;nbsp;INDEX(emp&amp;nbsp;emp_ix)&amp;nbsp;LEADING(dept)&amp;nbsp;USE_NL(dept)&amp;nbsp;*/&amp;nbsp;emp_name,&amp;nbsp;dept_name
FROM&amp;nbsp;employees&amp;nbsp;emp,&amp;nbsp;departments&amp;nbsp;dept
WHERE&amp;nbsp;emp.dept_id&amp;nbsp;=&amp;nbsp;dept.dept_id
;

Colored&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;힌트 유형 및 종류&lt;/b&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100.814%; height: 694px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style4&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;구분&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;Hint&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 20px;&quot;&gt;의미&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 100px;&quot; rowspan=&quot;4&quot;&gt;최적화 목표&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;/*+ALL_ROWS */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 20px;&quot;&gt;전체 처리 속도 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;/*+FIRST_ROWS(N) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 20px;&quot;&gt;최초 N건 응답속도 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 40px;&quot;&gt;/*+CHOOSE*/&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 40px;&quot;&gt;테이블의 통계정보 유무에 따라 규칙기반 또는 비용기반으로 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;/*+RULE*/&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 20px;&quot;&gt;규칙기반 옵티마이저를 이용 최적화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 102px;&quot; rowspan=&quot;6&quot;&gt;Index Scan 방식&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+FULL(&amp;lt;Table명&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;TABLE FULL SCAN 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+INDEX(&amp;lt;Table&amp;gt;&amp;lt;Index&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;INDEX SCAN 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+ NO_INDEX(&amp;lt;Table&amp;gt;&amp;lt;Index&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;지정한 인덱스 외 다른 인덱스 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+ INDEX_DESC(&amp;lt;Table&amp;gt;&amp;lt;Index&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;INDEX를 역순으로 Scan하도록 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/* + INDEX_FFS(&amp;lt;Table&amp;gt;&amp;lt;Index&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;INDEX FAST FULL SCAN 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/* + INDEX_SS(&amp;lt;Table&amp;gt;&amp;lt;Index&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;INDEX SKIP SCAN 유도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 51px;&quot; rowspan=&quot;3&quot;&gt;Join 순서&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/* + ORDERED */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;FROM절에 나열된 순으로 Join&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/* + LEADING(&amp;lt;Table1&amp;gt;&amp;lt;Table2&amp;gt;..) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;Hint 괄호 내 기술 순으로 Join&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/* + SWAP_JOIN_INPUTS(&amp;lt;Table&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;HASH Join에서 BUILD INPUT을 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 102px;&quot; rowspan=&quot;6&quot;&gt;Join 방식&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;/*+ USE_NL(&amp;lt;Table&amp;gt;)&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;*/&lt;/span&gt; &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;NESTED LOOP Join을 지시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; &lt;span style=&quot;text-align: start;&quot;&gt;/*+ NO_USE_NL(&amp;lt;Table&amp;gt;)&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;text-align: start;&quot;&gt;*/&lt;/span&gt; &lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;NESTED LOOP Join이 아닌 방식을 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+ USE_NL_WITH_INDEX(&amp;lt;Table&amp;gt;&amp;lt;Index&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;NESTED LOOP Join을 하면서 인덱스 사용 지시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+USE_MERGE(&amp;lt;Table&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;SORT MERGE Join을 지시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+USE_HASH(&amp;lt;Table&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;HASH Join을 지시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+NO_USE_HASH(&amp;lt;Table&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;HASH Join이 아닌 방식을 지시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 234px;&quot; rowspan=&quot;7&quot;&gt;Sub-Query 처리 방식&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+PUSH_SUBQ */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;메인쿼리부터 순서대로 진행되는 것이 아니라 서브쿼리가 먼저 처리되게 지시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+NO_UNNEST */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;서브쿼리를 Filter방식으로 처리되게 지시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 80px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 80px;&quot;&gt;/*+UNNEST */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 80px;&quot;&gt;Filter방식이 아닌 조인 방식으로 처리하게 지시&lt;br /&gt;- 아래 4개 힌트는 unnest와 함께 사용하는 힌트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 40px;&quot;&gt;/*+NL_SJ */ (w/ UNNEST)&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 40px;&quot;&gt;EXIST, IN에서 NESTED LOOP Join SEMI 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 40px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 40px;&quot;&gt;/*+NL_AJ */ (w/ UNNEST)&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 40px;&quot;&gt;EXIST, IN에서 NESTED LOOP Join ANTI 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;/*+HASH_SJ */ (w/ UNNEST)&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 20px;&quot;&gt;EXIST, IN에서 HASH Join SEMI 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 20px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 20px;&quot;&gt;/*+HASH_AJ */ (w/ UNNEST)&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 20px;&quot;&gt;EXIST, IN에서 HASH Join ANTI 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 85px;&quot; rowspan=&quot;5&quot;&gt;병렬 처리&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+PARALLEL(&amp;lt;Table&amp;gt;&amp;lt;병렬수&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;병렬수 만큼 병렬처리 수행 지시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+NOPARALLEL(&amp;lt;Table&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;병렬처리 하지 않고 테이블 액세스 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+PQ_DISTRIBUTE(&amp;lt;Table&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;병렬처리 할당을 위한 힌트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+PARALLEL_INDEX(&amp;lt;Index&amp;gt;&amp;lt;병렬수&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;병렬수 만큼 인덱스 병렬처리 지시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 17px;&quot;&gt;
&lt;td style=&quot;width: 33.3333%; height: 17px;&quot;&gt;/*+ NOPARALLEL_INDEX(&amp;lt;Index&amp;gt;) */&lt;/td&gt;
&lt;td style=&quot;width: 34.1473%; height: 17px;&quot;&gt;병렬처리 하지 않고 인덱스 수행&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;정리&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오라클 힌트를 사용하면 특정 상황에서 쿼리 성능을 크게 개선할 수 있지만, 항상 옵티마이저의 기본 동작을 신뢰하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;힌트는 필요한 경우에만 신중하게 사용해야 함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;+ 힌트 말고 일반적인 SQL 튜닝 기법&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 바인드 변수를 사용한다.(상수 값이 변경되어도 이전 질의를 사용함으로 최적화 실행 단계를 줄이기 때문)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 가급적 WHERE 절의 조건에 인텍스 칼럼을 모두 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 인덱스 칼럼에 사용하는 연산자는 가급적 =을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 인덱스 칼럼은 변형을 사용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5. OR보다는 AND를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;6. HAVING 보다는 가급적 WHERE 절에서 데이터를 필터링한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;7. DISTINCT는 가급적 사용하지 않는다.&lt;/p&gt;</description>
      <category>DB 공부</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/55</guid>
      <comments>https://gyk7.tistory.com/55#entry55comment</comments>
      <pubDate>Mon, 26 Aug 2024 12:06:55 +0900</pubDate>
    </item>
    <item>
      <title>5과목 정보시스템 구축 관리</title>
      <link>https://gyk7.tistory.com/53</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;1. 소프트웨어 생명주기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;폭포수 모형&lt;/span&gt;&amp;nbsp;(Water fall)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&lt;span&gt;- &lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;고전적&lt;/span&gt; 생명 주기 모형&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 선형&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;순차적&lt;/span&gt; 모형&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;- 한 번 지나간 과정을 다시 보기 어려움.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;나선형 모형&lt;/span&gt;(Spiral)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;리스크 최소화&lt;span style=&quot;color: #000000;&quot;&gt;(위험 관리 중심)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 나선형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;[계획수립-위험분석-개발 및 검증-고객 평가]&lt;/span&gt; 과정을 &lt;span style=&quot;color: #ee2323;&quot;&gt;여러번 반복&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 어차피 계속 반복하기 때문에 지나간 과정 다시 보기 좋음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;폭포수 모형 vs 나선형 모형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 폭포수 모형 : 고전적, 전통적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 나선형 모형 : 과정반복, 리스크 최소화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;방화벽 종류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- IDS : 침입 탐지 시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- VPN : 가상 사설 통신망(네트워크 암호화)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+ ZIGBEE : 저전력 라디오 이용한 개인 통신망&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;2. 비용 산정 모델&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LoC(Lines of Code) : 원시적 라인수의 낙관치, 중간치, 비관치를 측정해 예측치를 구하고 이를 이용해 비용 산정.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Man Month = 코드라인수 / 프로그래머 월간 생산량&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 총 30,000 라인이 예상되고 프로그래머가 2명있고 한 명 당 1500을 쓴다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; 30000 / (1500 * 2) = 10 총 10개월 예상&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;3. COCOMO 모델&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 복잡도나 원시 프로그램 규모에 따라 3가지로 구별&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;5만 라인 이하&lt;/span&gt; : &lt;span style=&quot;color: #ee2323;&quot;&gt;Organic&lt;/span&gt;, 조직형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;30만 라인 이하 : &lt;span style=&quot;color: #ee2323;&quot;&gt;Semi - Detached&lt;/span&gt;, 반 분리형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;30만 라인 이상 : &lt;span style=&quot;color: #ee2323;&quot;&gt;Embedded&lt;/span&gt;, 임베디드형&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;※ &lt;span style=&quot;color: #ee2323;&quot;&gt;Organic, Semi-Detached, Embedded&lt;/span&gt; 등 이름과 몇 만 라인이 구분점인지 알아두자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;4. CMM(Capability Maturity Model) 모델&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소프트웨어 개발 조직의 업무 능력 및 조직의 성숙도를 평가하는 모델&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기 단계 : 그냥 시작하는 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복 단계 : 프로세스대로 반복 가능한 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정의 단계 : 절차가 정립된 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;관리 단계 : 평가할 수 있는 단계, 잘못된 점 분석 가능.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적화 단계 : 방법이 가장 적절하다고 생각할 수 있는 단계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;※ CMM은 계획단계는 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;Putnam 모형&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;- Rayleigh-Norden 곡선&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&amp;nbsp;FP 기법&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;- 기능 점수 모형&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt; 알브레히트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;- 요인별 가중치 합산&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;5. 프레임워크&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;소프트웨어 개발에 공통적으로 사용되는 구성 요소와 아키텍처를 일반화하여&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;손쉽게 구현할 수 있도록 도움을 주는 반제품 형태의 소프트웨어 시스템&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 품질 보증&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 개발 용이성&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 변경 용이성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;※ 라이브러리와 달리 사용자 코드가 직접 호출하지 않는다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323; text-align: start;&quot;&gt;6. RIP vs OSPF&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;RIP&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;거리벡터&lt;/span&gt; 라우팅 &lt;span style=&quot;color: #ee2323;&quot;&gt;프로토콜&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;- 벨만포드&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;알고리즘&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;- 최대 15홉&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;소규모망 적합&lt;/span&gt;, 속도가 느리며 주기적 업데이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- GP 내부 게이트웨이 프로토콜&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;OSPF&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;링크상태&lt;/span&gt; 라우팅 &lt;span style=&quot;color: #ee2323;&quot;&gt;프로토콜&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&lt;span style=&quot;color: #ee2323;&quot;&gt; 다익스트라&lt;/span&gt; 알고리즘&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;홉수 제한 X&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;대규모 적합&lt;/span&gt;, 속도 빠르고 변화가 있을 때만 업데이트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;7. 암호화 알고리즘&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;단방향 암호화 :&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;HASH - 개인키, 공개키 X (MD4, MD5, SHA - 1)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;양방향 암호화 - 개인키 - 블록(대칭) 암호화 - &lt;span style=&quot;color: #006dd7;&quot;&gt;DES, SEED, AES, ARIA&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;양방향 암호화 - 개인키 - 스트림(대칭) 암호화 - &lt;span style=&quot;color: #006dd7;&quot;&gt;LFSR, RC4&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;양방향 암호화 - &lt;span style=&quot;color: #006dd7;&quot;&gt;공개키&lt;/span&gt;(비대칭) -&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;RSA(소수활용). 암호화는 공개키로, 복호화는 비밀키로&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;공개키는 암호화, 복호화에 사용되는 키 서로 다름.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;암호화 : 평문 &amp;rarr; 암호문 과정&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;복호화 : 암호화 된 것을 푸는 과정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;※ 단방향, 양방향 구분&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;※ 블록 암호화는 'E'가 들어가는 게 대부분&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;8. 정보 보안 3대 요소&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;기밀성 : &lt;span style=&quot;color: #000000;&quot;&gt;허가 받은 사람만 &lt;span style=&quot;color: #ee2323;&quot;&gt;열람&lt;/span&gt; 가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;무결성&lt;/span&gt; : &lt;span style=&quot;color: #000000;&quot;&gt;허가 받은 사람만 &lt;span style=&quot;color: #006dd7;&quot;&gt;수정&lt;/span&gt; 가능&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;가용성 : 필요할 때 사용 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;9. 공격기법&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;서비스공격(뭔가 많이 보내서 마비시키는 느낌)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Dos : 대량 데이터를 서버에 집중 전송&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- DDOs : 한 서버에 분산 서비스 공격&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;Ping of Death : 패킷 크기를 허용 범위 이상으로 전송해 네트워크 마비 공격&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- SYN Flooding : TCP 연결 요청만 계속 보내 서버 자원 소진&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Teardrop : 패킷 분할 순서 정보를 변경해 재조립 시 오류나게&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- LAND Attack : 송신 IP와 수신 IP 모두 대상의 IP로 하여 자기 자신이 무한히 응답하게&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;Smurfing&lt;/span&gt; : IP나 ICMP의 특성을 악용. 엄청난 양의 데이터를 한 사이트에 집중적으로 보냄으로써 네트워크 불능 상태로 만듦.&amp;nbsp;&lt;span style=&quot;color: #ee2323;&quot;&gt;브로드캐스트 이용하여 공격대상의 네트워크의 임의의 시스템에 패킷 보내게 만드는 것&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;네트워크 침해 공격(뭔가 조작해서 정보를 빼내는 느낌)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 스미싱 : 문자 메시지에 링크 등 이용해 개인 신용 정보를 빼냄.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #006dd7;&quot;&gt;SQL Injection : SQL문을 주입해 데이터베이스가 비정상적으로 동작하도록&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #006dd7;&quot;&gt;XSS(크로스 사이트 스크립팅) : 웹사이트에 스크립트를 삽입해 공격&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;정보보안 침해공격(바이러스로 마비시키는 느낌)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 좀비 PC : 악성 코드로 감염시킴.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Worm : 네트워크를 통해 자신을 계속 복사, 시스템 부하를 높여 다운시킴.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Zero Day Attack : 발견된 보안 취약점이 널리 공표되기 전 해당 취약점으로 공격&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Key Logger Attack : 사용자 키보드 움직임을 탐지해 패스워드를 빼냄.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- &lt;span style=&quot;color: #ee2323;&quot;&gt;Ransomware : 컴퓨터 문서를 암호화하고 돈을 요구&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;+ 시스템 침입탐지 및 무결성 도구&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;s&gt;cron&lt;/s&gt; - &lt;span style=&quot;color: #000000;&quot;&gt;작업 예약 스케줄러(초)/분/일/시간/월/요일/(년도)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;Tripwire -&amp;nbsp;&lt;span style=&quot;color: #000000;&quot;&gt;크래커가 침입하여 백도어 만들어 놓거나, 설정파일 변경했을 때 분석하는 도구&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;10. FAT vs NTFS&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;FAT&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- DoS 때부터 사용되던 윈도우 파일 시스템.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 저용량에 적합, 호환성 좋음, 파일 최대 크기 4GB&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NTFS&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FAT 시스템 대체를 위한 파일 시스템&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;- 보안이 FAT보다 뛰어남&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 대용량 저장 가능, 안정성 뛰어남&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;11. 로그파일&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;wtmp : 성공한 로그인, 로그아웃 정보를 담고 있는 로그 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;utmp : 현재 로그인 사용자 상태 정보를 담고 있는 로그 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;btmp : 실패한 로그인 정보를 담고 있는 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;last log : 마지막 성공 로그인 정보를 담고 있는 파일&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;12. 접근 통제 정책&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MAC(Mandatory Access Control) : 강제 접근 통제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주체와 객체 등급을 비교해 권한 부여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 접근 통제 권한을 시스템이 지정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DAC(Discretionary Access Control) : 임의 접근 통제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 신원에 따라 권한 부여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;RBAC&lt;/span&gt;(Role Based Access Control) : &lt;span style=&quot;color: #ee2323;&quot;&gt;역할 기반 접근 통제&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자의 역할에 따라 권한 부여&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;13. 테일러링&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로젝트 상황 및 특성에 맞게 정의된 방법론의 절차, 사용 기법들을 보완하는 작업&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;내부적 요건 : 목표 환경, 요구사항, 프로젝트 규모, 보유 기술 등&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;외부적 요건 : 법적 제약 사항, 국제 표준 품질 기준&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;14. 병행 제어 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;로 낙타다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 로킹(Locking) : 같은 자원을 액세스하는 다중 트랜잭션 환경에서 DB의 일관성과 무결성을 유지하기 위해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션의 순차적 진행을 보장하는 직렬화 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 낙관적 검증(Optimistic Validation) : 트랜잭션이 어떠한 검증도 수행하지 않고 일단 트랜잭션을 수행하고,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;트랜잭션 종료 시 검증을 수행하여 데이터베이스에 반영하는 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 타임 스탬프 순서(Time Stamp Ordering) : 트랜잭션과 트랜잭션이 읽거나 갱신한 데이터에 대해 트랜잭션이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행을 시작하기 전에 타임 스탬프를 부여하여 부여된 시간에 따라 트랜잭션 작업을 수행하는 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다중버전 동시성 제어(MVCC; Multi Version Concurrency Control) : 트랜잭션의 타임 스탬프와 접근하려는 데이터의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;타임 스탬프를 비교하여 직렬가능성이 보장되는 적절한 버전을 선택하여 접근하도록 하는 기법&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15. 병행 제어 미보장 시 문제점&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;갱현모연&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 갱신 손실 : 먼저 실행된 트랜잭션의 결과를 나중에 실행된 트랜잭션이 덮어쓸 때 발생하는 오류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현황 파악 오류 : 트랜잭션의 중간 결과를 다른 트랜잭션이 참조하여 발생하는 오류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모순성 : 두 트랜잭션이 동시에 실행되어 데이터 일관성이 결여되는 오류&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 연쇄 복귀 : 복수의 트랜잭션이 데이터 공유시 특정 트랜잭션이 처리를 취소한 경우에 트랜잭션의 처리한 곳의 부분을 처리하지 못한 경우&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;cat : 파일출력, 두 개 이상의 파일 연결&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;type : type&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;mkdir : 디렉토리 생성&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;f-tp : 응용계층 프로토콜&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;nmap : 열린 포트 정보 스캐닝 &amp;rarr; 보안 취약점 찾는 도구&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;uname : 시스템 정보 출력&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>정보처리기사 실기 준비</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/53</guid>
      <comments>https://gyk7.tistory.com/53#entry53comment</comments>
      <pubDate>Fri, 16 Aug 2024 22:22:51 +0900</pubDate>
    </item>
    <item>
      <title>데크(Deque)</title>
      <link>https://gyk7.tistory.com/52</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데크(Deque) : Double-ended-queue의 줄임말&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택은 나중에 들어온 것이 먼저 나가는 LIFO, 큐는 먼저 들어온 것이 먼저 나가는 FIFO의 형태.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데크는 &lt;span style=&quot;color: #ee2323;&quot;&gt;양쪽 모두에서 삽입, 삭제 연산&lt;/span&gt;을 할 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 특징&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 양쪽 끝에서 빠른 연산 : deque는 양쪽 끝에서 O(1) 시간 복잡도로 삽입 및 삭제가 가능함. 반면, 리스트는 왼쪽 끝에서의 삽입 및 삭제가 O(n) 시간이 걸릴 수 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 선형 자료구조 : 데이터를 순차적으로 저장함.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 데크 구현하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맨 앞에서 삽입과 삭제 연산이 일어나야 하고, 맨 뒤에서도 삽입과 삭제 연산이 일어나야 하므로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스택, 큐는 삽입과 삭제 연산을 한 번씩 구현하지만,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데크에서는 &lt;span style=&quot;color: #ee2323;&quot;&gt;삽입과 삭제 연산을 각각 두 번&lt;/span&gt; 구현해야 함.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;deque의 주요 메서드&lt;/b&gt;:&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;append(x): x를 오른쪽 끝에 추가함.&lt;/li&gt;
&lt;li&gt;appendleft(x): x를 왼쪽 끝에 추가함.&lt;/li&gt;
&lt;li&gt;pop(): 오른쪽 끝의 요소를 제거하고 반환함.&lt;/li&gt;
&lt;li&gt;popleft(): 왼쪽 끝의 요소를 제거하고 반환함.&lt;/li&gt;
&lt;li&gt;extend(iterable): 반복 가능한 객체의 모든 요소를 오른쪽 끝에 추가함.&lt;/li&gt;
&lt;li&gt;extendleft(iterable): 반복 가능한 객체의 모든 요소를 왼쪽 끝에 추가함. (반대로 추가됨)&lt;/li&gt;
&lt;li&gt;rotate(n=1): deque를 n만큼 회전시킴. 양수 n은 오른쪽, 음수 n은 왼쪽으로 회전함.&lt;/li&gt;
&lt;li&gt;reverse(): deque의 요소들을 뒤집음.&lt;/li&gt;
&lt;li&gt;clear(): deque의 모든 요소를 제거함.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp; from&lt;/span&gt; collections &lt;span&gt;import&lt;/span&gt; deque &lt;/b&gt;작성 후 구현&lt;/p&gt;</description>
      <category>알고리즘 공부</category>
      <category>deque</category>
      <category>데크</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/52</guid>
      <comments>https://gyk7.tistory.com/52#entry52comment</comments>
      <pubDate>Wed, 14 Aug 2024 16:04:00 +0900</pubDate>
    </item>
    <item>
      <title>N과 M (2)</title>
      <link>https://gyk7.tistory.com/51</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제&lt;/h2&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;1부터 N까지&amp;nbsp;자연수 중에서 중복 없이 M개를 고른 수열&lt;/li&gt;
&lt;li style=&quot;color: #555555;&quot;&gt;고른 수열은 오름차순이어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;입력&lt;/h2&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;div id=&quot;problem_input&quot;&gt;
&lt;p style=&quot;color: #555555;&quot; data-ke-size=&quot;size16&quot;&gt;첫째 줄에 자연수 N과 M이 주어진다. (1 &amp;le; M &amp;le; N &amp;le; 8)&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;h2 style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;출력&lt;/h2&gt;
&lt;div style=&quot;background-color: #ffffff; color: #333333; text-align: start;&quot;&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;한 줄에 하나씩 문제의 조건을 만족하는 수열을 출력한다. 중복되는 수열을 여러 번 출력하면 안되며, 각 수열은 공백으로 구분해서 출력해야 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;수열은 사전 순으로 증가하는 순서로 출력해야 한다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;751&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uFZj0/btsI3Z40jzY/jsvszAZ8lVKwKcvBSodFDK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uFZj0/btsI3Z40jzY/jsvszAZ8lVKwKcvBSodFDK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uFZj0/btsI3Z40jzY/jsvszAZ8lVKwKcvBSodFDK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuFZj0%2FbtsI3Z40jzY%2FjsvszAZ8lVKwKcvBSodFDK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1443&quot; height=&quot;751&quot; data-origin-width=&quot;1443&quot; data-origin-height=&quot;751&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/div&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[풀이]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N과 M (1) 에서는 순열이었고, 이 문제는 조합이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그래서 (2)에서는 N과 M (1) 코드에서 &lt;b&gt;오름차순 후 같은 것을 제거하는 과정&lt;/b&gt;을 거쳐야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) N과 M (1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력이 아래와 같을 때&lt;/p&gt;
&lt;pre id=&quot;sample-input-2&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;4 2&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;출력으로 이렇게 나오게 된다.&lt;/p&gt;
&lt;pre id=&quot;sample-output-2&quot; class=&quot;basic&quot; style=&quot;background-color: #f7f7f9; color: #333333; text-align: start;&quot;&gt;&lt;code&gt;1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 오름차순으로&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 2&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3 4&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 바꾼 후&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 것을 제거해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 N과 M (1) 코드인&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;())&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;nums&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)]&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;back_tracking&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;) :&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;not&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;]:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.append(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;True&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;back_tracking&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;length&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;arr&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.pop()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;False&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;back_tracking&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;([],&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에서 &lt;b&gt;result_li&lt;/b&gt; 리스트를 생성하여 result를&lt;b&gt; 오름차순&lt;/b&gt;하여 추가했다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;K&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; :&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;sorted&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt; &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;result_li =&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;[[1, 2], [1, 3], [1, 4], [1, 2], [2, 3], [2, 4], [1, 3], [2, 3], [3, 4], [1, 4], [2, 4], [3, 4]]&lt;/b&gt;는 이런 상태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 set( ) 함수로 중복을 제거하고 다시 리스트화하기 위해&lt;b&gt; set와 tuple&lt;/b&gt; 을 사용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;리스트의 요소가 리스트일 경우, 직접적으로 'set'을 사용할 수 없어서 리스트를 tuple로 변환한 후 중복을 제거할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;tuple&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)))&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 되면 4 2를 입력했을 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[(2, 4), (1, 2), (3, 4), (1, 4), (2, 3), (1, 3)] 이렇게 출력이 나오기 때문에&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;result_li를 다시 오름차순하여 [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과를 출력하도록 했다.&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;sort&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; :&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)))&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;b&gt;map(str, j)&lt;/b&gt;는 각 튜플 j의 요소(ex. (1, 2))를 문자열로 변환하여 [&quot;1&quot;, &quot;2&quot;]로 만든다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 후 &quot; &quot;.join(...)은 이 리스트를 &quot;1 2&quot;처럼 공백으로 연결된 문자열로 만들어준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;[최종 코드]&lt;/p&gt;
&lt;div style=&quot;background-color: #1f1f1f; color: #cccccc;&quot;&gt;
&lt;div&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;input&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;().&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;())&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; [&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;*&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; []&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; []&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;def&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;backtracking&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;K&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;) :&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;K&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;M&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; :&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;sorted&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;))&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;return&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #4fc1ff;&quot;&gt;N&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;):&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;if&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;==&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; :&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.append(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;True&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;backtracking&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;K&lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.pop()&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;visited&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;i&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;] &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;False&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;backtracking&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;([], &lt;/span&gt;&lt;span style=&quot;color: #b5cea8;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #d4d4d4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;list&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;set&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;tuple&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)))&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;sort&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;for&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #c586c0;&quot;&gt;in&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;result_li&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt; :&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;&amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;join&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;map&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #4ec9b0;&quot;&gt;str&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;j&lt;/span&gt;&lt;span style=&quot;color: #cccccc;&quot;&gt;)))&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category>알고리즘 공부</category>
      <author>gyk7</author>
      <guid isPermaLink="true">https://gyk7.tistory.com/51</guid>
      <comments>https://gyk7.tistory.com/51#entry51comment</comments>
      <pubDate>Wed, 14 Aug 2024 15:27:09 +0900</pubDate>
    </item>
  </channel>
</rss>