<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>SELOG</title>
        <link>https://velog.io/</link>
        <description>금융 IT 전문가가 될거야</description>
        <lastBuildDate>Fri, 15 Mar 2024 08:01:38 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>SELOG</title>
            <url>https://velog.velcdn.com/images/seong_li/profile/7a98a648-201d-4ef6-a4a8-8dd9616e850e/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. SELOG. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/seong_li" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[Java Lv2] 전화번호 목록]]></title>
            <link>https://velog.io/@seong_li/Java-Lv2-%EC%A0%84%ED%99%94%EB%B2%88%ED%98%B8-%EB%AA%A9%EB%A1%9D</link>
            <guid>https://velog.io/@seong_li/Java-Lv2-%EC%A0%84%ED%99%94%EB%B2%88%ED%98%B8-%EB%AA%A9%EB%A1%9D</guid>
            <pubDate>Fri, 15 Mar 2024 08:01:38 GMT</pubDate>
            <description><![CDATA[<h1 id="level-2-전화번호-목록---42577">[level 2] 전화번호 목록 - 42577</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/42577">문제 링크</a> </p>
<h3 id="성능-요약">성능 요약</h3>
<p>메모리: 96.1 MB, 시간: 295.63 ms</p>
<h3 id="구분">구분</h3>
<p>코딩테스트 연습 &gt; 해시</p>
<h3 id="채점결과">채점결과</h3>
<p>정확성: 83.3<br/>효율성: 16.7<br/>합계: 100.0 / 100.0</p>
<h3 id="제출-일자">제출 일자</h3>
<p>2024년 03월 15일 16:57:07</p>
<h3 id="문제-설명">문제 설명</h3>
<p>전화번호부에 적힌 전화번호 중, 한 번호가 다른 번호의 접두어인 경우가 있는지 확인하려 합니다.<br>
전화번호가 다음과 같을 경우, 구조대 전화번호는 영석이의 전화번호의 접두사입니다.</p>

<ul>
<li>구조대 : 119</li>
<li>박준영 : 97 674 223</li>
<li>지영석 : 11 9552 4421</li>
</ul>

<p>전화번호부에 적힌 전화번호를 담은 배열 phone_book 이 solution 함수의 매개변수로 주어질 때, 어떤 번호가 다른 번호의 접두어인 경우가 있으면 false를 그렇지 않으면 true를 return 하도록 solution 함수를 작성해주세요.</p>

<h5>제한 사항</h5>

<ul>
<li>phone_book의 길이는 1 이상 1,000,000 이하입니다.

<ul>
<li>각 전화번호의 길이는 1 이상 20 이하입니다.</li>
<li>같은 전화번호가 중복해서 들어있지 않습니다.</li>
</ul></li>
</ul>

<h5>입출력 예제</h5>
<table class="table">
        <thead><tr>
<th>phone_book</th>
<th>return</th>
</tr>
</thead>
        <tbody><tr>
<td>["119", "97674223", "1195524421"]</td>
<td>false</td>
</tr>
<tr>
<td>["123","456","789"]</td>
<td>true</td>
</tr>
<tr>
<td>["12","123","1235","567","88"]</td>
<td>false</td>
</tr>
</tbody>
      </table>
<h5>입출력 예 설명</h5>

<p>입출력 예 #1<br>
앞에서 설명한 예와 같습니다.</p>

<p>입출력 예 #2<br>
한 번호가 다른 번호의 접두사인 경우가 없으므로, 답은 true입니다.</p>

<p>입출력 예 #3<br>
첫 번째 전화번호, “12”가 두 번째 전화번호 “123”의 접두사입니다. 따라서 답은 false입니다.</p>

<hr>

<p><strong>알림</strong></p>

<p>2021년 3월 4일, 테스트 케이스가 변경되었습니다. 이로 인해 이전에 통과하던 코드가 더 이상 통과하지 않을 수 있습니다.</p>


<blockquote>
<p>출처: 프로그래머스 코딩 테스트 연습, <a href="https://school.programmers.co.kr/learn/challenges">https://school.programmers.co.kr/learn/challenges</a></p>
</blockquote>
<hr>

<h3 id="mycode_1--해시맵">MyCode_1 : 해시맵</h3>
<pre><code>// 해시맵  풀이
// import java.util.*;
// class Solution {
//     public boolean solution(String[] phone_book) {
//         Arrays.sort(phone_book);
//         HashMap&lt;String, Integer&gt; map = new HashMap&lt;&gt;();

//         for(int i = 0 ; i &lt; phone_book.length ; i++){
//             map.put(phone_book[i], i);
//         }

//         for(int i = 0 ; i &lt; phone_book.length ; i++){
//             String temp = phone_book[i];
//             for(int j = 0 ; j &lt; temp.length() ; j++){
//                 if(map.containsKey(temp.substring(0, j))) return false; // 0부터 j 전까지
//             }
//         }

//         return true;
//     }
// }</code></pre><h3 id="mycode_2--배열-탐색">MyCode_2 : 배열 탐색</h3>
<pre><code>// 배열 풀이
import java.util.*;
class Solution {
    public boolean solution(String[] phone_book) {
        Arrays.sort(phone_book);

        // 시간 초과!
        // for(int i = 0 ; i &lt; phone_book.length ; i++){
        //     String temp = phone_book[i];
        //     for(int j = i+1 ; j &lt; phone_book.length ; j++){
        //         if(phone_book[j].startsWith(temp)) return false;
        //     }
        // }

        for(int i = 0 ; i &lt; phone_book.length-1 ; i++){
            if(phone_book[i+1].startsWith(phone_book[i])) return false;
        }
        return true;
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL Lv4] FrontEnd 개발자 찾기]]></title>
            <link>https://velog.io/@seong_li/SQL-Lv4-FrontEnd-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B0%BE</link>
            <guid>https://velog.io/@seong_li/SQL-Lv4-FrontEnd-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EC%B0%BE</guid>
            <pubDate>Fri, 15 Mar 2024 04:54:54 GMT</pubDate>
            <description><![CDATA[<h1 id="level-4-frontend-개발자-찾기---276035">[level 4] FrontEnd 개발자 찾기 - 276035</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/276035">문제 링크</a> </p>
<h3 id="성능-요약">성능 요약</h3>
<p>메모리: undefined, 시간: </p>
<h3 id="구분">구분</h3>
<p>코딩테스트 연습 &gt; JOIN</p>
<h3 id="채점결과">채점결과</h3>
<p>합계: 100.0 / 100.0</p>
<h3 id="제출-일자">제출 일자</h3>
<p>2024년 03월 15일 13:50:11</p>
<h3 id="문제-설명">문제 설명</h3>
<p><code>SKILLCODES</code> 테이블은 개발자들이 사용하는 프로그래밍 언어에 대한 정보를 담은 테이블입니다. <code>SKILLCODES</code> 테이블의 구조는 다음과 같으며,  <code>NAME</code>, <code>CATEGORY</code>, <code>CODE</code>는 각각 스킬의 이름, 스킬의 범주, 스킬의 코드를 의미합니다. 스킬의 코드는 2진수로 표현했을 때 각 bit로 구분될 수 있도록 2의 제곱수로 구성되어 있습니다.</p>
<table class="table">
        <thead><tr>
<th>NAME</th>
<th>TYPE</th>
<th>UNIQUE</th>
<th>NULLABLE</th>
</tr>
</thead>
        <tbody><tr>
<td>NAME</td>
<td>VARCHAR(N)</td>
<td>Y</td>
<td>N</td>
</tr>
<tr>
<td>CATEGORY</td>
<td>VARCHAR(N)</td>
<td>N</td>
<td>N</td>
</tr>
<tr>
<td>CODE</td>
<td>INTEGER</td>
<td>Y</td>
<td>N</td>
</tr>
</tbody>
      </table>
<p><code>DEVELOPERS</code> 테이블은 개발자들의 프로그래밍 스킬 정보를 담은 테이블입니다. <code>DEVELOPERS</code> 테이블의 구조는 다음과 같으며, <code>ID</code>, <code>FIRST_NAME</code>, <code>LAST_NAME</code>, <code>EMAIL</code>, <code>SKILL_CODE</code>는 각각 개발자의 ID, 이름, 성, 이메일, 스킬 코드를 의미합니다. <code>SKILL_CODE</code> 컬럼은 INTEGER 타입이고, 2진수로 표현했을 때 각 bit는 <code>SKILLCODES</code> 테이블의 코드를 의미합니다.</p>
<table class="table">
        <thead><tr>
<th>NAME</th>
<th>TYPE</th>
<th>UNIQUE</th>
<th>NULLABLE</th>
</tr>
</thead>
        <tbody><tr>
<td>ID</td>
<td>VARCHAR(N)</td>
<td>Y</td>
<td>N</td>
</tr>
<tr>
<td>FIRST_NAME</td>
<td>VARCHAR(N)</td>
<td>N</td>
<td>Y</td>
</tr>
<tr>
<td>LAST_NAME</td>
<td>VARCHAR(N)</td>
<td>N</td>
<td>Y</td>
</tr>
<tr>
<td>EMAIL</td>
<td>VARCHAR(N)</td>
<td>Y</td>
<td>N</td>
</tr>
<tr>
<td>SKILL_CODE</td>
<td>INTEGER</td>
<td>N</td>
<td>N</td>
</tr>
</tbody>
      </table>
<p>예를 들어 어떤 개발자의 <code>SKILL_CODE</code>가 400 (=b'110010000')이라면, 이는 <code>SKILLCODES</code> 테이블에서 CODE가 256 (=b'100000000'), 128 (=b'10000000'), 16 (=b'10000') 에 해당하는 스킬을 가졌다는 것을 의미합니다.</p>

<hr>

<h5>문제</h5>

<p><code>DEVELOPERS</code> 테이블에서 Front End 스킬을 가진 개발자의 정보를 조회하려 합니다. 조건에 맞는 개발자의 ID, 이메일, 이름, 성을 조회하는 SQL 문을 작성해 주세요.</p>

<p>결과는 ID를 기준으로 오름차순 정렬해 주세요.</p>

<hr>

<h5>예시</h5>

<p>예를 들어 <code>SKILLCODES</code> 테이블이 다음과 같고,</p>
<table class="table">
        <thead><tr>
<th>NAME</th>
<th>CATEGORY</th>
<th>CODE</th>
</tr>
</thead>
        <tbody><tr>
<td>C++</td>
<td>Back End</td>
<td>4</td>
</tr>
<tr>
<td>JavaScript</td>
<td>Front End</td>
<td>16</td>
</tr>
<tr>
<td>Java</td>
<td>Back End</td>
<td>128</td>
</tr>
<tr>
<td>Python</td>
<td>Back End</td>
<td>256</td>
</tr>
<tr>
<td>C#</td>
<td>Back End</td>
<td>1024</td>
</tr>
<tr>
<td>React</td>
<td>Front End</td>
<td>2048</td>
</tr>
<tr>
<td>Vue</td>
<td>Front End</td>
<td>8192</td>
</tr>
<tr>
<td>Node.js</td>
<td>Back End</td>
<td>16384</td>
</tr>
</tbody>
      </table>
<p><code>DEVELOPERS</code> 테이블이 다음과 같다면</p>
<table class="table">
        <thead><tr>
<th>ID</th>
<th>FIRST_NAME</th>
<th>LAST_NAME</th>
<th>EMAIL</th>
<th>SKILL_CODE</th>
</tr>
</thead>
        <tbody><tr>
<td>D165</td>
<td>Jerami</td>
<td>Edwards</td>
<td><code>jerami_edwards@grepp.co</code></td>
<td>400</td>
</tr>
<tr>
<td>D161</td>
<td>Carsen</td>
<td>Garza</td>
<td><code>carsen_garza@grepp.co</code></td>
<td>2048</td>
</tr>
<tr>
<td>D164</td>
<td>Kelly</td>
<td>Grant</td>
<td><code>kelly_grant@grepp.co</code></td>
<td>1024</td>
</tr>
<tr>
<td>D163</td>
<td>Luka</td>
<td>Cory</td>
<td><code>luka_cory@grepp.co</code></td>
<td>16384</td>
</tr>
<tr>
<td>D162</td>
<td>Cade</td>
<td>Cunningham</td>
<td><code>cade_cunningham@grepp.co</code></td>
<td>8452</td>
</tr>
</tbody>
      </table>
<p>다음과 같이 <code>DEVELOPERS</code> 테이블에 포함된 개발자 중 Front End 스킬을 가진을 가진 개발자의 정보가 결과에 나와야 합니다.</p>
<table class="table">
        <thead><tr>
<th>ID</th>
<th>EMAIL</th>
<th>FIRST_NAME</th>
<th>LAST_NAME</th>
</tr>
</thead>
        <tbody><tr>
<td>D161</td>
<td><code>carsen_garza@grepp.co</code></td>
<td>Carsen</td>
<td>Garza</td>
</tr>
<tr>
<td>D162</td>
<td><code>cade_cunningham@grepp.co</code></td>
<td>Cade</td>
<td>Cunningham</td>
</tr>
<tr>
<td>D165</td>
<td><code>jerami_edwards@grepp.co</code></td>
<td>Jerami</td>
<td>Edwards</td>
</tr>
</tbody>
      </table>

<blockquote>
<p>출처: 프로그래머스 코딩 테스트 연습, <a href="https://school.programmers.co.kr/learn/challenges">https://school.programmers.co.kr/learn/challenges</a></p>
</blockquote>
<hr>

<h3 id="my-code">My Code</h3>
<pre><code>SELECT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS AS D
WHERE D.SKILL_CODE &amp; (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;JavaScript&#39;) &gt; 0
    OR D.SKILL_CODE &amp; (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;React&#39;) &gt; 0
    OR D.SKILL_CODE &amp; (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;Vue&#39;) &gt; 0
ORDER BY D.ID ASC;</code></pre><h3 id="upgrade-code">Upgrade Code</h3>
<pre><code>SELECT D.ID, D.EMAIL, D.FIRST_NAME, D.LAST_NAME
FROM DEVELOPERS AS D
WHERE D.SKILL_CODE &amp; (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = &#39;Front End&#39;) &gt; 0
ORDER BY D.ID ASC;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Java Lv3] 야근 지수]]></title>
            <link>https://velog.io/@seong_li/Java-Lv3-%EC%95%BC%EA%B7%BC-%EC%A7%80%EC%88%98</link>
            <guid>https://velog.io/@seong_li/Java-Lv3-%EC%95%BC%EA%B7%BC-%EC%A7%80%EC%88%98</guid>
            <pubDate>Thu, 07 Mar 2024 08:31:30 GMT</pubDate>
            <description><![CDATA[<h1 id="level-3-야근-지수---12927">[level 3] 야근 지수 - 12927</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/12927?language=java">문제 링크</a></p>
<h3 id="채점결과">채점결과</h3>
<p>정확성: 86.7<br/>효율성: 13.3<br/>합계: 100.0 / 100.0</p>
<h3 id="제출-일자">제출 일자</h3>
<p>2024년 03월 07일 17:22:00</p>
<h3 id="문제-설명">문제 설명</h3>
<p>회사원 Demi는 가끔은 야근을 하는데요, 야근을 하면 야근 피로도가 쌓입니다. 야근 피로도는 야근을 시작한 시점에서 남은 일의 작업량을 제곱하여 더한 값입니다. Demi는 N시간 동안 야근 피로도를 최소화하도록 일할 겁니다.Demi가 1시간 동안 작업량 1만큼을 처리할 수 있다고 할 때,  퇴근까지 남은 N 시간과 각 일에 대한 작업량 works에 대해 야근 피로도를 최소화한 값을 리턴하는 함수 solution을 완성해주세요.</p>

<h5>제한 사항</h5>

<ul>
<li><code>works</code>는 길이 1 이상, 20,000 이하인 배열입니다.</li>
<li><code>works</code>의 원소는 50000 이하인 자연수입니다.</li>
<li><code>n</code>은 1,000,000 이하인 자연수입니다.</li>
</ul>

<h5>입출력 예</h5>
<table class="table">
        <thead><tr>
<th>works</th>
<th>n</th>
<th>result</th>
</tr>
</thead>
        <tbody><tr>
<td>[4, 3, 3]</td>
<td>4</td>
<td>12</td>
</tr>
<tr>
<td>[2, 1, 2]</td>
<td>1</td>
<td>6</td>
</tr>
<tr>
<td>[1,1]</td>
<td>3</td>
<td>0</td>
</tr>
</tbody>
      </table>
<h5>입출력 예 설명</h5>

<p>입출력 예 #1<br>
n=4 일 때, 남은 일의 작업량이 [4, 3, 3] 이라면 야근 지수를 최소화하기 위해 4시간동안 일을 한 결과는 [2, 2, 2]입니다. 이 때 야근 지수는 2<sup>2</sup> + 2<sup>2</sup> + 2<sup>2</sup> = 12 입니다.</p>

<p>입출력 예 #2<br>
n=1일 때, 남은 일의 작업량이 [2,1,2]라면 야근 지수를 최소화하기 위해 1시간동안 일을 한 결과는 [1,1,2]입니다. 야근지수는 1<sup>2</sup> + 1<sup>2</sup> + 2<sup>2</sup> = 6입니다.</p>

<p>입출력 예 #3</p>

<p>남은 작업량이 없으므로 피로도는 0입니다.</p>


<blockquote>
<p>출처: 프로그래머스 코딩 테스트 연습, <a href="https://school.programmers.co.kr/learn/challenges">https://school.programmers.co.kr/learn/challenges</a></p>
</blockquote>
<hr>

<h3 id="sick-code">Sick Code</h3>
<pre><code>import java.util.*;
class Solution {
    public long solution(int n, int[] works) {
        Arrays.sort(works);

        int point  = works.length - 1;
        while(true){
            if(works[point] == 0){
                point = works.length - 1;
                if(works[point] == 0) return 0;
            }

            works[point]--;
            point--;
            if(point &lt; 0){
                point = works.length - 1;
            }

            n--;
            if(n == 0) break;

        }
        System.out.println(Arrays.toString(works));

        int ans = 0;
        for(int i = 0 ; i &lt; works.length ; i++){
            int unit = works[i] * works[i];
            ans += unit;
        }

        return ans;
    }
}

&gt;
채점 결과
정확성: 26.7
효율성: 0.0
합계: 26.7 / 100.0

&gt;&gt;&gt; 아아아아ㅏ아 이거는 전체를 한번 훑는거자네!!!</code></pre><h3 id="sick-code-2">Sick Code 2</h3>
<pre><code>import java.util.*;
class Solution {
    public long solution(int n, int[] works) {
        PriorityQueue&lt;Integer&gt; pq = new PriorityQueue&lt;&gt;(Collections.reverseOrder());
        for(int i = 0 ; i &lt; works.length ; i++){
            pq.add(works[i]);
        }

        // n번 돌려
        for(int i = 0 ; i &lt; n ; i ++){
            int temp = pq.poll();
            if(temp == 0) return 0;
            pq.add(temp-1);
        }

        int ans = 0;
        while(!pq.isEmpty()){
            int temp = pq.poll();
            ans += Math.pow(temp, 2);
        }

        return ans;
    }
}

&gt;
채점 결과
정확성: 86.7
효율성: 0.0
합계: 86.7 / 100.0

&gt;&gt;&gt; 효율성 잡자.</code></pre><h3 id="pass-code">Pass Code</h3>
<pre><code>import java.util.*;
class Solution {
    public long solution(int n, int[] works) {
        PriorityQueue&lt;Integer&gt; pq = new PriorityQueue&lt;&gt;(Collections.reverseOrder());
        for(int i = 0 ; i &lt; works.length ; i++){
            pq.add(works[i]);
        }

        // n번 돌려
        for(int i = 0 ; i &lt; n ; i ++){
            int temp = pq.poll();
            if(temp == 0) return 0;
            pq.add(temp-1);
        }

        long ans = 0;
       while (!pq.isEmpty()) {
            ans += Math.pow(pq.poll(), 2);
        }
        return ans;

    }
}</code></pre><h4 id="point">Point</h4>
<ul>
<li>long 출력 <blockquote>
<ul>
<li>제한 사항
works는 길이 1 이상, 20,000 이하인 배열입니다.
works의 원소는 50000 이하인 자연수입니다.
n은 1,000,000 이하인 자연수입니다.<br></li>
<li>실제 문제에서는 작업량이 50,000까지 가능하고, 작업량을 줄이는 과정에서 여러 차례 제곱하여 더하는 과정이 반복된다. 다음과 같은 상황에서 int의 최대 범위를 쉽게 초과할 수 있다 : 50000^2 * 1 = 2,500,000,000</li>
</ul>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL Kit] GROUP BY]]></title>
            <link>https://velog.io/@seong_li/SQL-Kit-GROUP-BY</link>
            <guid>https://velog.io/@seong_li/SQL-Kit-GROUP-BY</guid>
            <pubDate>Thu, 07 Mar 2024 07:19:47 GMT</pubDate>
            <description><![CDATA[<h3 id="lv3--즐겨찾기가-가장-많은-식당-정보-출력하기"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/131123">Lv3 : 즐겨찾기가 가장 많은 식당 정보 출력하기</a></h3>
<h4 id="my-code">My Code</h4>
<pre><code>-- 음식종류별로 즐겨찾기수가 가장 많은 식당
-- 음식 종류, ID, 식당 이름, 즐겨찾기수 조회
-- 음식 종류 기준 DESC

# SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) AS FAVORITES
# FROM REST_INFO
# GROUP BY FOOD_TYPE 
# ORDER BY FOOD_TYPE DESC
# ;
# 틀린 이유 =&gt; FOOD_TYPE으로 그룹화할 경우, 각 FOOD_TYPE 그룹 내에 여러 개의 REST_ID와 REST_NAME이 존재할 수 있다.

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (
    SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
    FROM REST_INFO
    GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC
;</code></pre><hr>

<h3 id="lv3--자동차-대여-기록에서-대여중--대여-가능-여부-구분하기"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/157340">Lv3 : 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기</a></h3>
<h4 id="my-code-1">My Code</h4>
<pre><code>-- 2022년 10월 16일에 
-- 대여 중인 자동차인 경우 &#39;대여중&#39; 이라고 표시 / 대여 중이지 않은 자동차인 경우 &#39;대여 가능&#39;을 표시하는 컬럼 AVAILABILITY 추가
-- 자동차 ID와 AVAILABILITY 리스트 출력
-- 2022년 10월 16일인 경우에도 &#39;대여중&#39;으로 표시
-- 자동차 ID 기준 DESC
SELECT CAR_ID, IF(CAR_ID IN (
            SELECT CAR_ID 
            FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
            WHERE START_DATE &lt;= &#39;2022-10-16&#39; AND &#39;2022-10-16&#39; &lt;= END_DATE
        ), &#39;대여중&#39;, &#39;대여 가능&#39;) AS AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
ORDER BY CAR_ID DESC
;</code></pre><h4 id="extra-code">Extra Code</h4>
<pre><code>SELECT CAR_ID, ( CASE
                WHEN CAR_ID IN (
                SELECT CAR_ID 
                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
                WHERE &#39;2022-10-16&#39; BETWEEN START_DATE AND END_DATE
                ) THEN &#39;대여중&#39; 
                    ELSE &#39;대여 가능&#39;
                    END
                    ) AS AVAILABILITY</code></pre><hr>

<h3 id="lv3--조건에-맞는-사용자와-총-거래금액-조회하기"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/164668">Lv3 : 조건에 맞는 사용자와 총 거래금액 조회하기</a></h3>
<h4 id="my-code-2">My Code</h4>
<pre><code>-- 완료된 중고 거래의 총금액이 70만 원 이상인 사람
-- 회원 ID, 닉네임, 총거래금액 조회
-- 총거래금액 기준 ASC
SELECT U.USER_ID, U.NICKNAME, SUM(B.PRICE) AS TOTAL_SALES
FROM USED_GOODS_USER AS U JOIN USED_GOODS_BOARD AS B
    ON U.USER_ID = B.WRITER_ID
# WHERE B.PRICE &gt;= 700000 AND B.STATUS = &#39;DONE&#39;
WHERE B.STATUS = &#39;DONE&#39;
GROUP BY B.WRITER_ID
HAVING TOTAL_SALES &gt;= 700000
ORDER BY TOTAL_SALES ASC
;</code></pre><hr>

<h3 id="lv4--저자-별-카테고리-별-매출액-집계하기"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/144856">Lv4 : 저자 별 카테고리 별 매출액 집계하기</a></h3>
<h4 id="my-code-3">My Code</h4>
<pre><code>-- 2022년 1월의 도서 판매 데이터를 기준
-- 저자 별, 카테고리 별 매출액(TOTAL_SALES = 판매량 * 판매가) 
-- 저자 ID(AUTHOR_ID), 저자명(AUTHOR_NAME), 카테고리(CATEGORY), 매출액(SALES) 출력
-- 저자 ID 기준 ASC, 카테고리 기준 DESC
SELECT B.AUTHOR_ID, A.AUTHOR_NAME, B.CATEGORY, SUM(B.PRICE * S.SALES) AS TOTAL_SALES
FROM BOOK AS B
    JOIN AUTHOR AS A ON B.AUTHOR_ID = A.AUTHOR_ID
    JOIN BOOK_SALES AS S ON B.BOOK_ID = S.BOOK_ID
WHERE S.SALES_DATE LIKE &#39;2022-01-%&#39;
GROUP BY B.AUTHOR_ID, B.CATEGORY
ORDER BY B.AUTHOR_ID ASC, B.CATEGORY DESC
;</code></pre><hr>

<h3 id="lv2--자동차-종류-별-특정-옵션이-포함된-자동차-수-구하기"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/151137">Lv2 : 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기</a></h3>
<h4 id="my-code-4">My Code</h4>
<pre><code>-- &#39;통풍시트&#39;, &#39;열선시트&#39;, &#39;가죽시트&#39; 중 하나 이상의 옵션이 포함
-- 자동차 종류 별로 몇 대인지 출력
-- 자동차 수에 대한 컬럼명은 CARS
-- 자동차 종류 기준 ASC
SELECT CAR_TYPE, COUNT(*) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE &#39;%통풍시트%&#39;
    OR OPTIONS LIKE &#39;%열선시트%&#39;
    OR OPTIONS LIKE &#39;%가죽시트%&#39;
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC
;</code></pre><hr>

<h4 id="만약에-두-개-이상의-옵션이-포함된-자동차였다면">만약에,, 두 개 이상의 옵션이 포함된 자동차였다면?</h4>
<pre><code>SELECT CAR_TYPE, COUNT(*) AS CARS
FROM (
    SELECT CAR_TYPE,
           (CASE WHEN OPTIONS LIKE &#39;%통풍시트%&#39; THEN 1 ELSE 0 END
          + CASE WHEN OPTIONS LIKE &#39;%열선시트%&#39; THEN 1 ELSE 0 END
          + CASE WHEN OPTIONS LIKE &#39;%가죽시트%&#39; THEN 1 ELSE 0 END) AS OPTION_COUNT
    FROM CAR_RENTAL_COMPANY_CAR
) AS OPTIONED_CARS
WHERE OPTION_COUNT &gt;= 2
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE ASC;</code></pre><hr>

<h3 id="lv3--대여-횟수가-많은-자동차들의-월별-대여-횟수-구하기"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/151139">Lv3 : 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기</a></h3>
<h4 id="my-code-5">My Code</h4>
<pre><code>-- 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들
-- 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 
-- 월 기준 ASC =&gt; 자동차 ID 기준 DESC
-- 특정 월의 총 대여 횟수가 0인 경우 결과에서 제외
SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN &#39;2022-08-01&#39; AND &#39;2022-10-31&#39;
    AND 
    CAR_ID IN (
        SELECT CAR_ID
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE START_DATE BETWEEN &#39;2022-08-01&#39; AND &#39;2022-10-31&#39;
        GROUP BY CAR_ID
        HAVING COUNT(*) &gt;= 5
        )
GROUP BY MONTH, CAR_ID
HAVING RECORDS &gt; 0
ORDER BY MONTH ASC, CAR_ID DESC
;</code></pre><hr>

<h3 id="lv2--진료과별-총-예약-횟수-출력하기"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/132202">Lv2 : 진료과별 총 예약 횟수 출력하기</a></h3>
<h4 id="my-code-6">My Code</h4>
<pre><code>-- 2022년 5월에 예약한 환자 수
-- 진료과코드 별로 조회
-- 컬럼명은 &#39;진료과 코드&#39;, &#39;5월예약건수&#39;로 지정
-- 진료과별 예약한 환자 수를 기준으로 ASC =&gt; 진료과 코드를 기준으로 ASC
SELECT MCDP_CD AS &#39;진료과 코드&#39;, COUNT(*) AS &#39;5월예약건수&#39;
FROM APPOINTMENT 
WHERE APNT_YMD LIKE &#39;2022-05-%&#39;
GROUP BY MCDP_CD
ORDER BY `5월예약건수` ASC, `진료과 코드` ASC
;</code></pre><h4 id="point">Point</h4>
<ul>
<li>ORDER BY <code>5월예약건수</code> ASC, <code>진료과 코드</code> ASC <blockquote>
<p>백틱(`)을 써야한다!!!
아니면 그대로 쓰는것도 방법 : ORDER BY COUNT(*) ASC, MCDP_CD ASC </p>
</blockquote>
</li>
</ul>
<hr>

<h3 id="lv3--카테고리-별-도서-판매량-집계하기"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/144855">Lv3 : 카테고리 별 도서 판매량 집계하기</a></h3>
<h4 id="my-code-7">My Code</h4>
<pre><code>-- 2022년 1월의 카테고리 별 도서 판매량을 합산하고
-- 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력
-- 카테고리명을 기준으로 오름차순
SELECT CATEGORY, SUM(S.SALES) AS TOTAL_SALES
FROM BOOK AS B JOIN (
    SELECT *
    FROM BOOK_SALES
    WHERE SALES_DATE LIKE &#39;2022-01-%&#39;
    ) AS S
    ON B.BOOK_ID = S.BOOK_ID
GROUP BY CATEGORY
ORDER BY CATEGORY ASC
;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[하루 10/5 먹자] 디지털/일반]]></title>
            <link>https://velog.io/@seong_li/%ED%95%98%EB%A3%A8-105-%EB%A8%B9%EC%9E%90-%EB%94%94%EC%A7%80%ED%84%B8%EC%9D%BC%EB%B0%98-o1zk94hj</link>
            <guid>https://velog.io/@seong_li/%ED%95%98%EB%A3%A8-105-%EB%A8%B9%EC%9E%90-%EB%94%94%EC%A7%80%ED%84%B8%EC%9D%BC%EB%B0%98-o1zk94hj</guid>
            <pubDate>Thu, 07 Mar 2024 06:23:28 GMT</pubDate>
            <description><![CDATA[<h2 id="디지털-상식-10">디지털 상식 10</h2>
<blockquote>
</blockquote>
<h3 id="1-__은-키보드나-마우스-등-전통적-텍스트-외에-음성-시선-표정-등-여러-입력방식을-융합해-인간과-컴퓨터가-의사소통하는-기술을-말한다">1. (<strong><strong>__</strong></strong>)은 키보드나 마우스 등 전통적 텍스트 외에 음성, 시선, 표정 등 여러 입력방식을 융합해 인간과 컴퓨터가 의사소통하는 기술을 말한다.</h3>
<h3 id="2-__은-공기저항이-거의-없는-아진공0001001기압-튜브-내에서-자기력으로-차량을-추진부상하여-시속-1000km-이상으로-주행하는-교통시스템을-말한다">2. (<strong><strong>__</strong></strong>)은 공기저항이 거의 없는 아진공(0.001~0.01기압) 튜브 내에서 자기력으로 차량을 추진.부상하여 시속 1,000km 이상으로 주행하는 교통시스템을 말한다.</h3>
<h3 id="3-__은-기존에-사용하던-플랫폼에서-벗어나-독립적으로-만들어진-네트워크를-말한다-각-회사마다-목표로-한-블록체인-서비스에-알맞는-플랫폼을-구현하기-위해-기존의-플랫폼에서-나와-독자적인-생태계를-구성하게-된-것이다">3. (<strong><strong>__</strong></strong>)은 기존에 사용하던 플랫폼에서 벗어나 독립적으로 만들어진 네트워크를 말한다. 각 회사마다 목표로 한 블록체인 서비스에 알맞는 플랫폼을 구현하기 위해 기존의 플랫폼에서 나와 독자적인 생태계를 구성하게 된 것이다.</h3>
<h3 id="4-__은-열쇠구멍으로-훔쳐-본다라는-뜻으로-미국의-대표적인-정찰위성이다">4. (<strong><strong>__</strong></strong>)은 &#39;열쇠구멍으로 훔쳐 본다&#39;라는 뜻으로 미국의 대표적인 정찰위성이다.</h3>
<h3 id="5-__은-한글과컴퓨터한컴의-우주사업-자회사인-한컴인스페이스가-개발한-한국-최초-지구관측용-민간위성이다">5. (<strong><strong>__</strong></strong>)은 한글과컴퓨터(한컴)의 우주사업 자회사인 한컴인스페이스가 개발한 한국 최초 지구관측용 민간위성이다.</h3>
<h3 id="6-__은-sns-블로그-등에-남아-있는-사진-일기-댓글-등-개인이-온라인상에-남긴-디지털-흔적을-말한다">6. (<strong><strong>__</strong></strong>)은 SNS, 블로그 등에 남아 있는 사진, 일기, 댓글 등 개인이 온라인상에 남긴 디지털 흔적을 말한다.</h3>
<h3 id="7-__은-정부의-한국판-뉴딜-정책-중-하나로-현재-세계-최고-수준인-전자정부-인프라나-서비스-등의-ict를-기반으로-디지털-초격차를-확대하는-것이다">7. (<strong><strong>__</strong></strong>)은 정부의 한국판 뉴딜 정책 중 하나로, 현재 세계 최고 수준인 전자정부 인프라나 서비스 등의 ICT를 기반으로 디지털 초격차를 확대하는 것이다.</h3>
<h3 id="8-__은-탈중앙화된-금융-시스템을-일컫는-말로-정부나-기업-등-중앙기관의-통제-없이-인터넷-연결만-가능하면-블록체인-기술을-통해-다양한-금융-서비스를-제공하는-것을-의미한다">8. (<strong><strong>__</strong></strong>)은 탈중앙화된 금융 시스템을 일컫는 말로, 정부나 기업 등 중앙기관의 통제 없이 인터넷 연결만 가능하면 블록체인 기술을 통해 다양한 금융 서비스를 제공하는 것을 의미한다.</h3>
<h3 id="9-__은-생물의-세포에-들어-있는-단백질이나-효소를-사용한-바이오칩을-컴퓨터-내부-반도체-소자와-교체하여-조립한다-인간의-뇌와-유사한-기능을-하도록-설계되어-최종적으로-인간의-두뇌-기능을-구현하기-위한-목적을-갖는다">9. (<strong><strong>__</strong></strong>)은 생물의 세포에 들어 있는 단백질이나 효소를 사용한 바이오칩을 컴퓨터 내부 반도체 소자와 교체하여 조립한다. 인간의 뇌와 유사한 기능을 하도록 설계되어 최종적으로 인간의 두뇌 기능을 구현하기 위한 목적을 갖는다.</h3>
<h3 id="10-__은-정보를-수집한-후-저장만-하고-분석에-활용하고-있지-않은-다량의-데이터로-처리되지-않은-채-미래에-사용할-가능성이-있다는-이유로-방치되고-있는것을-뜻한다">10. (<strong><strong>__</strong></strong>)은 정보를 수집한 후, 저장만 하고 분석에 활용하고 있지 않은 다량의 데이터로, 처리되지 않은 채 미래에 사용할 가능성이 있다는 이유로 방치되고 있는것을 뜻한다.</h3>
<hr>

<h2 id="일반-상식-5">일반 상식 5</h2>
<blockquote>
</blockquote>
<h3 id="1-__은-위험을-관리하는-책임투자-전략의-일환으로-일정한-esg나-국제규범-등을-평가-기준으로-정하고-이-기준에-부합하지-않는-기업-또는-산업군에-투자를-하지-않는-전략을-뜻한다">1. (<strong><strong>__</strong></strong>)은 위험을 관리하는 책임투자 전략의 일환으로, 일정한 ESG나 국제규범 등을 평가 기준으로 정하고, 이 기준에 부합하지 않는 기업 또는 산업군에 투자를 하지 않는 전략을 뜻한다.</h3>
<h3 id="2-__은-서비스재화의-생산에-투입되는-자본노동등의-생산요소가-거래되는-시장이다-가계공급자는-기업수요자에-생산요소자본노동를-제공한-대가로-이자임금을-지급받는다">2. (<strong><strong>__</strong></strong>)은 서비스.재화의 생산에 투입되는 자본.노동등의 생산요소가 거래되는 시장이다. 가계(공급자)는 기업(수요자)에 생산요소(자본.노동)를 제공한 대가로 이자.임금을 지급받는다.</h3>
<h3 id="3-__은-기업이-재화서비스-생산량을-늘림에-따라-추가적으로-소요되는-평균-생산비가-점차-증가하는-일반적인-경우와-달리-일부-재화서비스의-경우에-생산량이-늘어날수록-평균-생산비가-감소하는-현상을-말한다">3. (<strong><strong>__</strong></strong>)은 기업이 재화.서비스 생산량을 늘림에 따라 추가적으로 소요되는 평균 생산비가 점차 증가하는 일반적인 경우와 달리 일부 재화.서비스의 경우에 생산량이 늘어날수록 평균 생산비가 감소하는 현상을 말한다.</h3>
<h3 id="4-__은-중앙은행의-통화정책이-실물경제에-파급효과를-끼치는-전달경로를-설명하는-이론으로-통화정책이-국내외-금리-격차에-따른-환율-변동으로-총수요에-영향을-끼치는-것을-뜻한다">4. (<strong><strong>__</strong></strong>)은 중앙은행의 통화정책이 실물경제에 파급효과를 끼치는 전달경로를 설명하는 이론으로, 통화정책이 국내외 금리 격차에 따른 환율 변동으로 총수요에 영향을 끼치는 것을 뜻한다.</h3>
<h3 id="5-__은-기업의-재무-상태-경영-성과-채무의-상환-능력과-상환-의지-등-기업의-채무-이행을-위해-요구되는-요인들을-종합적으로-분석해-신용-상황을-평가하는-것이다">5. (<strong><strong>__</strong></strong>)은 기업의 재무 상태, 경영 성과, 채무의 상환 능력과 상환 의지 등 기업의 채무 이행을 위해 요구되는 요인들을 종합적으로 분석해 신용 상황을 평가하는 것이다.</h3>
<hr>
<hr>

<h3 id="디지털-상식-답">디지털 상식 답</h3>
<blockquote>
</blockquote>
<ol>
<li>멀티모달 인터페이스(Multi-Modal Interface)</li>
<li>하이퍼튜브(Hyper Tube)</li>
<li>메인넷(Mainnet)</li>
<li>키홀(Key Hole)</li>
<li>세종1호</li>
<li>디지털유산</li>
<li>디지털 뉴딜(Digital New Deal)</li>
<li>디파이(De-Fi)</li>
<li>바이오컴퓨터(BioComputer)</li>
<li>다크 데이터(Dark Data)</li>
</ol>
<hr>

<h3 id="일반-상식-답">일반 상식 답</h3>
<blockquote>
</blockquote>
<ol>
<li>네거티브 스크리닝(Negative Screening)</li>
<li>생산요소시장</li>
<li>규모의 경제(Economies of Scale)</li>
<li>환율경로</li>
<li>기업신용평가</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[하루 10/5 먹자] 디지털/일반]]></title>
            <link>https://velog.io/@seong_li/%ED%95%98%EB%A3%A8-105-%EB%A8%B9%EC%9E%90-%EB%94%94%EC%A7%80%ED%84%B8%EC%9D%BC%EB%B0%98-jdpusrqo</link>
            <guid>https://velog.io/@seong_li/%ED%95%98%EB%A3%A8-105-%EB%A8%B9%EC%9E%90-%EB%94%94%EC%A7%80%ED%84%B8%EC%9D%BC%EB%B0%98-jdpusrqo</guid>
            <pubDate>Tue, 05 Mar 2024 03:43:12 GMT</pubDate>
            <description><![CDATA[<h2 id="디지털-상식-10">디지털 상식 10</h2>
<blockquote>
</blockquote>
<h3 id="1-__은-분산-하이퍼미디어-환경에서-빠르고-간편하게-데이터를-전송하는-프로토콜이다-월드와이드웹www상에서-클라이언트와-서버-사이에-정보를-주고받는-요청-응답-프로토콜로-인터넷-데이터-통신-규약이다">1. (<strong><strong>__</strong></strong>)은 분산 하이퍼미디어 환경에서 빠르고 간편하게 데이터를 전송하는 프로토콜이다. 월드와이드웹(WWW)상에서 클라이언트와 서버 사이에 정보를 주고받는 요청-응답 프로토콜로, 인터넷 데이터 통신 규약이다.</h3>
<h3 id="2-__은-온라인에서-아바타를-이용해-사회적경제적문화적-활동을-하는-등-가상세계와-현실세계의-경계가-허물어져-혼재하게-되는-것을-이르는-말이다">2. (<strong><strong>__</strong></strong>)은 온라인에서 아바타를 이용해 사회적.경제적.문화적 활동을 하는 등 가상세계와 현실세계의 경계가 허물어져 혼재하게 되는 것을 이르는 말이다.</h3>
<h3 id="3-__은-블록체인의-토큰을-다른-토큰으로-대체하는-것이-불가능한-암호-화폐이다-즉-블록체인-기술로-저장된-일종의-디지털-등기권리증이다">3. (<strong><strong>__</strong></strong>)은 블록체인의 토큰을 다른 토큰으로 대체하는 것이 불가능한 암호 화폐이다. 즉, 블록체인 기술로 저장된 일종의 &#39;디지털 등기권리증&#39;이다.</h3>
<h3 id="4-__은-온실가스-배출량과-흡수량이-동일하여-온실가스의-순net-배출량이-영zero이-되는-상태를-말한다">4. (<strong><strong>__</strong></strong>)은 온실가스 배출량과 흡수량이 동일하여 온실가스의 순(Net) 배출량이 영(Zero)이 되는 상태를 말한다.</h3>
<h3 id="5-__은-운전-중-발생할-수-있는-상황을-차량이-스스로-인지하고-판단하여-기계-장치를-전자적으로-제어하는-시스템을-말한다">5. (<strong><strong>__</strong></strong>)은 운전 중 발생할 수 있는 상황을 차량이 스스로 인지하고 판단하여 기계 장치를 전자적으로 제어하는 시스템을 말한다.</h3>
<h3 id="6-__은-인공지능과-블록체인을-기반으로-맞춤형-정보를-제공하고-데이터-소유를-개인화하는-3세대-인터넷이다-웹-이용자들의-데이터-개인정보-등이-플랫폼에-종속되는-것이-아닌-개인이-소유하여-데이터에-대한-주권이-사용자에게-주어지는-형태의-웹을-말한다">6. (<strong><strong>__</strong></strong>)은 인공지능과 블록체인을 기반으로 맞춤형 정보를 제공하고 데이터 소유를 개인화하는 3세대 인터넷이다. 웹 이용자들의 데이터, 개인정보 등이 플랫폼에 종속되는 것이 아닌 개인이 소유하여 데이터에 대한 주권이 사용자에게 주어지는 형태의 웹을 말한다.</h3>
<h3 id="7-__은-미국의-항공기-전문업체-보잉사가-개발하고-있는-우주인-수송용-캡슐이다">7. (<strong><strong>__</strong></strong>)은 미국의 항공기 전문업체 보잉사가 개발하고 있는 우주인 수송용 캡슐이다.</h3>
<h3 id="8-__은-신뢰가-곧-보안-취약점이라는-원칙을-내세워-내부에서-접속한-사용자에-대해서도-검증을-거치는-것을-기본으로-한다-전체-시스템에서-안전한-영역이나-사용자는-전무하다는-것을-기본전제로-한-뒤-내부자-여부와-관계없이-인증절차와-신원확인-등을-거쳐-철저하게-검증하는-한편-접속권한을-부여한-뒤에도-최소한의-신뢰만-부여해-접근을-허용한다">8. (<strong><strong>__</strong></strong>)은 &#39;신뢰가 곧 보안 취약점&#39;이라는 원칙을 내세워 내부에서 접속한 사용자에 대해서도 검증을 거치는 것을 기본으로 한다. 전체 시스템에서 안전한 영역이나 사용자는 전무하다는 것을 기본전제로 한 뒤 내부자 여부와 관계없이 인증절차와 신원확인 등을 거쳐 철저하게 검증하는 한편 접속권한을 부여한 뒤에도 최소한의 신뢰만 부여해 접근을 허용한다.</h3>
<h3 id="9-__은-차량-내부에-있는-각종-전기전자-장치에-전원을-공급하는-장치이다-자동차-내부에-장착되는-전자장치-등의-부품에-전원을-공급하고-전기신호를-전달하는-배선뭉치로-인체의-신경망에-비유된다">9. (<strong><strong>__</strong></strong>)은 차량 내부에 있는 각종 전기전자 장치에 전원을 공급하는 장치이다. 자동차 내부에 장착되는 전자장치 등의 부품에 전원을 공급하고 전기신호를 전달하는 배선뭉치로 &#39;인체의 신경망&#39;에 비유된다.</h3>
<h3 id="9-__은-인공지능ai을-통해-콜봇이나-챗봇이-고객의-질문에-답변하는-지능형-고객센터를-말한다">9. (<strong><strong>__</strong></strong>)은 인공지능(AI)을 통해 콜봇이나 챗봇이 고객의 질문에 답변하는 지능형 고객센터를 말한다.</h3>
<hr>

<h2 id="일반-상식-5">일반 상식 5</h2>
<blockquote>
</blockquote>
<h3 id="1-__은-화물-운송-중-발생할-수-있는-손실이나-손상에-대해-보호를-제공하는-보험이다-바다-공기-육지를-통한-화물의-이동-동안-발생할-수-있는-다양한-위험들로부터-화물을-보호하기-위해-설계되었다">1. (<strong><strong>__</strong></strong>)은 화물 운송 중 발생할 수 있는 손실이나 손상에 대해 보호를 제공하는 보험이다. 바다, 공기, 육지를 통한 화물의 이동 동안 발생할 수 있는 다양한 위험들로부터 화물을 보호하기 위해 설계되었다.</h3>
<h3 id="2-a은-보험회사의-이익에-관계없이-고정된-보험료와-혜택을-제공한다-이-유형의-보험에서는-보험회사의-초과-이익이-보험-가입자에게-배당금-형태로-돌아가지-않는다-b은-보험회사의-이익에-따라-보험-가입자에게-배당금을-지급할-수-있는-보험이다-이-배당금은-보험료-감소-현금-지급-또는-보험-혜택-증가-등-다양한-형태로-사용될-수-있다">2. (<strong><strong>A</strong></strong>)은 보험회사의 이익에 관계없이 고정된 보험료와 혜택을 제공한다. 이 유형의 보험에서는 보험회사의 초과 이익이 보험 가입자에게 배당금 형태로 돌아가지 않는다. (<strong><strong>B</strong></strong>)은 보험회사의 이익에 따라 보험 가입자에게 배당금을 지급할 수 있는 보험이다. 이 배당금은 보험료 감소, 현금 지급, 또는 보험 혜택 증가 등 다양한 형태로 사용될 수 있다.</h3>
<h3 id="3-__은-흔히-펀드fund라고도-불리며-여러-투자자들로부터-자금을-모아-공동의-투자-목표를-위해-이를-운용하는-투자-상품이다-이러한-기구는-주식-채권-부동산-등-다양한-자산에-투자할-수-있으며-투자-위험을-분산시키고-전문적인-관리를-통해-수익을-극대화하려는-목적을-가지고-있다">3. (<strong><strong>__</strong></strong>)은 흔히 펀드(Fund)라고도 불리며, 여러 투자자들로부터 자금을 모아 공동의 투자 목표를 위해 이를 운용하는 투자 상품이다. 이러한 기구는 주식, 채권, 부동산 등 다양한 자산에 투자할 수 있으며, 투자 위험을 분산시키고 전문적인 관리를 통해 수익을 극대화하려는 목적을 가지고 있다.</h3>
<h3 id="4-__은-다른-회사의-주식을-소유하여-그-회사들을-통제하는-기업이다-지주회사-자체는-직접적인-제품이나-서비스를-생산하지-않고-소유한-회사들의-경영에-영향을-미치거나-투자를-관리하는-역할을-한다-이를-통해-사업-다각화-위험-분산-세금-혜택-등의-이점을-얻을-수-있다">4. (<strong><strong>__</strong></strong>)은 다른 회사의 주식을 소유하여 그 회사들을 통제하는 기업이다. 지주회사 자체는 직접적인 제품이나 서비스를 생산하지 않고, 소유한 회사들의 경영에 영향을 미치거나, 투자를 관리하는 역할을 한다. 이를 통해 사업 다각화, 위험 분산, 세금 혜택 등의 이점을 얻을 수 있다.</h3>
<h3 id="5-__은-기업이-생성한-경제적-가치를-측정하는-지표이다-기업의-순운영자본이용후수익nopat에서-총자본비용을-차감한-값으로-계산되며-기업이-투자자본으로-얼마나-효율적으로-이익을-창출하고-있는지를-나타낸다-eva가-긍정적이면-기업이-자본비용을-초과하여-가치를-창출한-것으로-부가-가치를-생성한-것으로-해석된다">5. (<strong><strong>__</strong></strong>)은 기업이 생성한 경제적 가치를 측정하는 지표이다. 기업의 순운영자본이용후수익(NOPAT)에서 총자본비용을 차감한 값으로 계산되며, 기업이 투자자본으로 얼마나 효율적으로 이익을 창출하고 있는지를 나타낸다. EVA가 긍정적이면 기업이 자본비용을 초과하여 가치를 창출한 것으로, 부가 가치를 생성한 것으로 해석된다.</h3>
<hr>
<hr>

<h3 id="디지털-상식-답">디지털 상식 답</h3>
<blockquote>
</blockquote>
<ol>
<li>HTTP(Hyper Text Transfer Protocol)</li>
<li>메타버스</li>
<li>NFT(Non-Fungible Token)</li>
<li>넷제로(Net Zero)</li>
<li>운전자 지원 시스템</li>
<li>웹 3.0</li>
<li>스타라이너(Starliner)</li>
<li>제로 트러스트(Zero Trust)</li>
<li>와이어링 하니스(Wiring Harness)</li>
<li>AI 콘택스센트(AICC)</li>
</ol>
<hr>

<h3 id="일반-상식-답">일반 상식 답</h3>
<blockquote>
</blockquote>
<ol>
<li>적하보험</li>
<li>A : 무배당보험, B : 유배당보험</li>
<li>집합투자기구</li>
<li>지주회사(Holding Company)</li>
<li>EVA(Economic Value Added)</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java Lv3] 정수 삼각형]]></title>
            <link>https://velog.io/@seong_li/Java-Lv3-%EC%A0%95%EC%88%98-%EC%82%BC%EA%B0%81%ED%98%95</link>
            <guid>https://velog.io/@seong_li/Java-Lv3-%EC%A0%95%EC%88%98-%EC%82%BC%EA%B0%81%ED%98%95</guid>
            <pubDate>Mon, 04 Mar 2024 06:03:02 GMT</pubDate>
            <description><![CDATA[<h1 id="level-3-정수-삼각형---43105">[level 3] 정수 삼각형 - 43105</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/43105?language=java">문제 링크</a></p>
<h3 id="구분">구분</h3>
<p>코딩테스트 연습 &gt; 동적계획법（Dynamic Programming）</p>
<h3 id="채점결과">채점결과</h3>
<p>정확성: 64.3<br/>효율성: 35.7<br/>합계: 100.0 / 100.0</p>
<h3 id="제출-일자">제출 일자</h3>
<p>2024년 03월 04일 14:54:25</p>
<h3 id="문제-설명">문제 설명</h3>
<p><img src="https://grepp-programmers.s3.amazonaws.com/files/production/97ec02cc39/296a0863-a418-431d-9e8c-e57f7a9722ac.png" title="" alt="스크린샷 2018-09-14 오후 5.44.19.png"></p>

<p>위와 같은 삼각형의 꼭대기에서 바닥까지 이어지는 경로 중, 거쳐간 숫자의 합이 가장 큰 경우를 찾아보려고 합니다. 아래 칸으로 이동할 때는 대각선 방향으로 한 칸 오른쪽 또는 왼쪽으로만 이동 가능합니다. 예를 들어 3에서는 그 아래칸의 8 또는 1로만 이동이 가능합니다.</p>

<p>삼각형의 정보가 담긴 배열 triangle이 매개변수로 주어질 때, 거쳐간 숫자의 최댓값을 return 하도록 solution 함수를 완성하세요.</p>

<h5>제한사항</h5>

<ul>
<li>삼각형의 높이는 1 이상 500 이하입니다.</li>
<li>삼각형을 이루고 있는 숫자는 0 이상 9,999 이하의 정수입니다.</li>
</ul>

<h5>입출력 예</h5>
<table class="table">
        <thead><tr>
<th>triangle</th>
<th>result</th>
</tr>
</thead>
        <tbody><tr>
<td>[[7], [3, 8], [8, 1, 0], [2, 7, 4, 4], [4, 5, 2, 6, 5]]</td>
<td>30</td>
</tr>
</tbody>
      </table>

<blockquote>
<p>출처: 프로그래머스 코딩 테스트 연습, <a href="https://school.programmers.co.kr/learn/challenges">https://school.programmers.co.kr/learn/challenges</a></p>
</blockquote>
<hr>

<h3 id="my-code">My Code</h3>
<pre><code>class Solution {
    public int solution(int[][] triangle) {

        for(int i = 1 ; i &lt; triangle.length ; i++){
            for(int j = 0 ; j &lt; triangle[i].length ; j++){
                if(j == 0){
                    triangle[i][j] += triangle[i-1][j]; 
                }else if(j == triangle[i].length-1){
                    triangle[i][j] += triangle[i-1][j-1]; 
                }else{
                    triangle[i][j] += Math.max(triangle[i-1][j], triangle[i-1][j-1]);
                }
            }
        }

        int ans = Integer.MIN_VALUE;
        for(int i = 0 ; i &lt; triangle[triangle.length-1].length ; i++){
            if(ans &lt; triangle[triangle.length-1][i]){
                ans = triangle[triangle.length-1][i];
            }
        }
        return ans;
    }
}</code></pre><ul>
<li>디피디피딥</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[하루 10/5 먹자] 디지털/일반 ]]></title>
            <link>https://velog.io/@seong_li/%ED%95%98%EB%A3%A8-105-%EB%A8%B9%EC%9E%90-%EB%94%94%EC%A7%80%ED%84%B8%EC%9D%BC%EB%B0%98</link>
            <guid>https://velog.io/@seong_li/%ED%95%98%EB%A3%A8-105-%EB%A8%B9%EC%9E%90-%EB%94%94%EC%A7%80%ED%84%B8%EC%9D%BC%EB%B0%98</guid>
            <pubDate>Mon, 04 Mar 2024 02:17:08 GMT</pubDate>
            <description><![CDATA[<h2 id="디지털-상식-10">디지털 상식 10</h2>
<blockquote>
</blockquote>
<h3 id="1-__은-인공지능-사물인터넷iot-빅데이터-등의-기술이-융합되어-경제와-사회-전반에-걸쳐-혁신적-변화를-일으키는-혁명을-말한다">1. (<strong><strong>__</strong></strong>)은 인공지능, 사물인터넷(IoT), 빅데이터 등의 기술이 융합되어 경제와 사회 전반에 걸쳐 혁신적 변화를 일으키는 혁명을 말한다.</h3>
<h3 id="2-__는-전통적-데이터-처리-소프트웨어로-다루기-어려울-정도로-크거나-복잡한-데이터-집합을-의미한다">2. (<strong><strong>__</strong></strong>)는 전통적 데이터 처리 소프트웨어로 다루기 어려울 정도로 크거나 복잡한 데이터 집합을 의미한다.</h3>
<h3 id="3-__은-기계가-인간과-유사한-지능을-갖추어-학습-추론-인식-계획-등의-인간적인-능력을-컴퓨터-프로그램을-통해-실현할-수-있게-하는-기술이다">3. (<strong><strong>__</strong></strong>)은 기계가 인간과 유사한 지능을 갖추어 학습, 추론, 인식, 계획 등의 인간적인 능력을 컴퓨터 프로그램을 통해 실현할 수 있게 하는 기술이다.</h3>
<h3 id="4-__은-사용자에게-실제와-같은-환경을-컴퓨터-생성-이미지로-제공하여-실제와-유사한-경험을-할-수-있게-하는-기술이다">4. (<strong><strong>__</strong></strong>)은 사용자에게 실제와 같은 환경을 컴퓨터 생성 이미지로 제공하여 실제와 유사한 경험을 할 수 있게 하는 기술이다.</h3>
<h3 id="5-__은-실제-환경에-가상의-정보를-오버레이하여-사용자가-현실세계와-가상의-객체를-동시에-인식할-수-있게-하는-기술이다">5. (<strong><strong>__</strong></strong>)은 실제 환경에 가상의 정보를 오버레이하여 사용자가 현실세계와 가상의 객체를 동시에 인식할 수 있게 하는 기술이다.</h3>
<h3 id="6-__은-실제-세계와-가상-세계를-혼합하여-새로운-환경과-시각적-환경을-생성-실시간으로-상호작용-할-수-있는-기술을-말한다">6. (<strong><strong>__</strong></strong>)은 실제 세계와 가상 세계를 혼합하여 새로운 환경과 시각적 환경을 생성, 실시간으로 상호작용 할 수 있는 기술을 말한다.</h3>
<h3 id="7-__은-가상현실-증강현실-혼합현실-등-모든-형태의-가상과-현실이-혼합된-환경을-포괄하는-용어이다">7. (<strong><strong>__</strong></strong>)은 가상현실, 증강현실, 혼합현실 등 모든 형태의 가상과 현실이 혼합된 환경을 포괄하는 용어이다.</h3>
<h3 id="8-__는-실제-환경과-가상-환경-사이의-구분을-흐리게-만들어-사용자가-어떤-환경이-실제이고-어떤-환경이-가상인지-구분하기-어렵게-만드는-기술이나-경험을-말한다">8. (<strong><strong>__</strong></strong>)는 실제 환경과 가상 환경 사이의 구분을 흐리게 만들어 사용자가 어떤 환경이 실제이고 어떤 환경이 가상인지 구분하기 어렵게 만드는 기술이나 경험을 말한다.</h3>
<h3 id="9-네트워크-보안에서-__-공격은-눈속임spoof에서-파생된-it-용어로-공격자가-다른-사람이나-장치로-가장하여-정보를-훔치거나-시스템에-무단-접근하는-기법을-말한다">9. 네트워크 보안에서 (<strong><strong>__</strong></strong>) 공격은 눈속임(spoof)에서 파생된 IT 용어로, 공격자가 다른 사람이나 장치로 가장하여 정보를 훔치거나 시스템에 무단 접근하는 기법을 말한다.</h3>
<h3 id="10-__은-코를-킁킁거리다-냄새를-맡다-뜻으로-네트워크-통신망에서-오가는-패킷packet을-가로채-사용자의-계정과-암호-등을-알아내는-해킹-수법이다-즉-네트워크-트래픽을-도청하는-행위다">10. (<strong><strong>__</strong></strong>)은 코를 킁킁거리다&#39;, &#39;냄새를 맡다&#39; 뜻으로, 네트워크 통신망에서 오가는 패킷(Packet)을 가로채 사용자의 계정과 암호 등을 알아내는 해킹 수법이다. 즉, 네트워크 트래픽을 도청하는 행위다.</h3>
<hr>

<h2 id="일반-상식-5">일반 상식 5</h2>
<blockquote>
</blockquote>
<h3 id="1-__은-보험자는-보험가입자가-납입하는-보험료의-총액과-보험가입자에게-지급하는-보험금액의-총액이-균형을-이루게-해야-한다는-원칙이다">1. (<strong><strong>__</strong></strong>)은 보험자는 보험가입자가 납입하는 보험료의 총액과 보험가입자에게 지급하는 보험금액의 총액이 균형을 이루게 해야 한다는 원칙이다.</h3>
<h3 id="2-__은-금융-기술-회사나-다른-비금융-기업이-은행의-인프라를-사용하여-자체-브랜드의-금융-서비스를-제공할-수-있게-하는-비즈니스-모델을-말한다">2. (<strong><strong>__</strong></strong>)은 금융 기술 회사나 다른 비금융 기업이 은행의 인프라를 사용하여 자체 브랜드의 금융 서비스를 제공할 수 있게 하는 비즈니스 모델을 말한다.</h3>
<h3 id="3-__은-은행-등의-금융기관이-일정-기간을-정해-고객이나-환거래은행에게-공여할-수-있는-신용공여credit-facility의-종류와-최고-한도를-뜻한다-사전에-승인된-대출-한도-내에서-고객이-필요할-때마다-자금을-빌릴-수-있는-형태의-신용을-말한다">3. (<strong><strong>__</strong></strong>)은 은행 등의 금융기관이 일정 기간을 정해 고객이나 환거래은행에게 공여할 수 있는 신용공여(Credit Facility)의 종류와 최고 한도를 뜻한다. 사전에 승인된 대출 한도 내에서 고객이 필요할 때마다 자금을 빌릴 수 있는 형태의 신용을 말한다.</h3>
<h3 id="4-__은-유사시를-대비해-금융기관-간에-일정-금액의-수수료를-부담하고-외화를-우선적으로-공급받을-수-있는-권리를-약정하는-것을-가리킨다-비상시에-외화-확보-수단으로-활용된다">4. (<strong><strong>__</strong></strong>)은 유사시를 대비해 금융기관 간에 일정 금액의 수수료를 부담하고 외화를 우선적으로 공급받을 수 있는 권리를 약정하는 것을 가리킨다. 비상시에 외화 확보 수단으로 활용된다.</h3>
<h3 id="5-__은-시장-가격의-변동성을-이용하여-단기적으로-가격-차이에서-발생할-수-있는-이익을-얻기-위해-진행하는-투자-방식을-말한다">5. (<strong><strong>__</strong></strong>)은 시장 가격의 변동성을 이용하여 단기적으로 가격 차이에서 발생할 수 있는 이익을 얻기 위해 진행하는 투자 방식을 말한다.</h3>
<hr>
<hr>

<h3 id="디지털-상식-답">디지털 상식 답</h3>
<blockquote>
</blockquote>
<ol>
<li>4차 산업혁명</li>
<li>빅데이터(Big Data)</li>
<li>인공지능(Artificial Intelligence)</li>
<li>가상현실(Virtual Reality)</li>
<li>증강현실(Augmented Reality)</li>
<li>혼합현실(Mixed Reality)</li>
<li>확장현실(Extended Reality)</li>
<li>대체현실(Substitutional Reality)</li>
<li>스푸핑(spoofing)</li>
<li>스니핑(Sniffing)</li>
</ol>
<hr>

<h3 id="일반-상식-답">일반 상식 답</h3>
<blockquote>
</blockquote>
<ol>
<li>수지상등의 원칙</li>
<li>서비스형 뱅킹 (Banking as a Service)</li>
<li>크레디트 라인(Credit Line)</li>
<li>커미티드 라인(Committed Line)</li>
<li>갭(Gap)투자</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Java Lv3] 이중우선순위큐]]></title>
            <link>https://velog.io/@seong_li/Java-Lv3-%EC%9D%B4%EC%A4%91%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84%ED%81%90</link>
            <guid>https://velog.io/@seong_li/Java-Lv3-%EC%9D%B4%EC%A4%91%EC%9A%B0%EC%84%A0%EC%88%9C%EC%9C%84%ED%81%90</guid>
            <pubDate>Mon, 26 Feb 2024 08:10:40 GMT</pubDate>
            <description><![CDATA[<h1 id="level-3-이중우선순위큐---42628">[level 3] 이중우선순위큐 - 42628</h1>
<h3 id="문제-링크"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/42628?language=java">문제 링크</a></h3>
<h3 id="문제-설명">문제 설명</h3>
<p>이중 우선순위 큐는 다음 연산을 할 수 있는 자료구조를 말합니다.</p>
<table class="table">
        <thead><tr>
<th>명령어</th>
<th>수신 탑(높이)</th>
</tr>
</thead>
        <tbody><tr>
<td>I 숫자</td>
<td>큐에 주어진 숫자를 삽입합니다.</td>
</tr>
<tr>
<td>D 1</td>
<td>큐에서 최댓값을 삭제합니다.</td>
</tr>
<tr>
<td>D -1</td>
<td>큐에서 최솟값을 삭제합니다.</td>
</tr>
</tbody>
      </table>
<p>이중 우선순위 큐가 할 연산 operations가 매개변수로 주어질 때, 모든 연산을 처리한 후 큐가 비어있으면 [0,0] 비어있지 않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를 구현해주세요.</p>

<h5>제한사항</h5>

<ul>
<li>operations는 길이가 1 이상 1,000,000 이하인 문자열 배열입니다.</li>
<li>operations의 원소는 큐가 수행할 연산을 나타냅니다.

<ul>
<li>원소는 “명령어 데이터” 형식으로 주어집니다.- 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.</li>
</ul></li>
<li>빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.</li>
</ul>

<h5>입출력 예</h5>
<table class="table">
        <thead><tr>
<th>operations</th>
<th>return</th>
</tr>
</thead>
        <tbody><tr>
<td>["I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"]</td>
<td>[0,0]</td>
</tr>
<tr>
<td>["I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"]</td>
<td>[333, -45]</td>
</tr>
</tbody>
      </table>
<h5>입출력 예 설명</h5>

<p>입출력 예 #1</p>

<ul>
<li>16과 -5643을 삽입합니다.</li>
<li>최솟값을 삭제합니다. -5643이 삭제되고 16이 남아있습니다.</li>
<li>최댓값을 삭제합니다. 16이 삭제되고 이중 우선순위 큐는 비어있습니다.</li>
<li>우선순위 큐가 비어있으므로 최댓값 삭제 연산이 무시됩니다.</li>
<li>123을 삽입합니다.</li>
<li>최솟값을 삭제합니다. 123이 삭제되고 이중 우선순위 큐는 비어있습니다.</li>
</ul>

<p>따라서 [0, 0]을 반환합니다.</p>

<p>입출력 예 #2</p>

<ul>
<li>-45와 653을 삽입후 최댓값(653)을 삭제합니다. -45가 남아있습니다.</li>
<li>-642, 45, 97을 삽입 후 최댓값(97), 최솟값(-642)을 삭제합니다. -45와 45가 남아있습니다.</li>
<li>333을 삽입합니다.</li>
</ul>

<p>이중 우선순위 큐에 -45, 45, 333이 남아있으므로, [333, -45]를 반환합니다.</p>


<blockquote>
<p>출처: 프로그래머스 코딩 테스트 연습, <a href="https://school.programmers.co.kr/learn/challenges">https://school.programmers.co.kr/learn/challenges</a></p>
</blockquote>
<hr>

<h3 id="mycode">MyCode</h3>
<pre><code>import java.util.*;
class Solution {
    public int[] solution(String[] operations) {
        PriorityQueue&lt;Integer&gt; min_pq = new PriorityQueue&lt;&gt;();
        PriorityQueue&lt;Integer&gt; max_pq = new PriorityQueue&lt;&gt;(Collections.reverseOrder());

        for(int i = 0 ; i &lt; operations.length ; i++){
            String[] temp_arr = operations[i].split(&quot; &quot;);
            String Order = temp_arr[0];
            int value = Integer.parseInt(temp_arr[1]);
            if(Order.equals(&quot;I&quot;)){ // 삽입
                min_pq.add(value);
                max_pq.add(value);
            } else if (min_pq.isEmpty()) continue;
            else{
                if(value == 1){ // 최댓값 제거
                    int max = max_pq.poll();
                    min_pq.remove(max);
                }else{ // 최솟값 제거
                    int min = min_pq.poll();
                    max_pq.remove(min);
                }
            }
        }

        if(min_pq.isEmpty()){
            return new int[] {0, 0};
        }else{
            int max = max_pq.peek();
            int min = min_pq.peek();
            return new int[] {max, min};
        }

    }
}</code></pre><h3 id="point">Point</h3>
<ul>
<li><p>pq는 최솟값은 구할 수 있지만, 최댓값을 구하는데 한계가 있다!</p>
</li>
<li><p>pq.remove는 제거하고자 하는 객체(요소) 자체를 인자로 넣어야 한다. index 아님주의</p>
</li>
<li><p>Java에서 <strong>Queue 인터페이스의 구현체로 LinkedList를 사용할 때</strong>, que.remove(0)을 호출하면 실제로는 LinkedList의 remove(int index) 메소드가 호출된다. 
이 경우, <strong>0은 인덱스를 의미하며</strong>, LinkedList에서는 이를 통해 특정 인덱스에 위치한 요소를 제거할 수 있다.</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL Kit] SUM, MAX, MIN]]></title>
            <link>https://velog.io/@seong_li/SQL-Kit-SUM-MAX-MIN</link>
            <guid>https://velog.io/@seong_li/SQL-Kit-SUM-MAX-MIN</guid>
            <pubDate>Mon, 26 Feb 2024 07:17:22 GMT</pubDate>
            <description><![CDATA[<h3 id="lv1--가장-비싼-상품-구하기-httpsschoolprogrammerscokrlearncourses30lessons131697">[Lv1 : 가장 비싼 상품 구하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/131697">https://school.programmers.co.kr/learn/courses/30/lessons/131697</a>)</h3>
<h4 id="my-code">My Code</h4>
<pre><code>-- 판매 중인 상품 중 가장 높은 판매가
-- 컬럼명은 MAX_PRICE
SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT
;</code></pre><hr>

<h3 id="lv2--가격이-제일-비싼-식품의-정보-출력하기-httpsschoolprogrammerscokrlearncourses30lessons131115">[Lv2 : 가격이 제일 비싼 식품의 정보 출력하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/131115">https://school.programmers.co.kr/learn/courses/30/lessons/131115</a>)</h3>
<h4 id="my-code-1">My Code</h4>
<pre><code>-- 가격이 제일 비싼 식품
-- 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격 조회
SELECT PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE
FROM FOOD_PRODUCT 
ORDER BY PRICE DESC LIMIT 1
;</code></pre><hr>

<h3 id="lv2--동물-수-구하기-httpsschoolprogrammerscokrlearncourses30lessons59406">[Lv2 : 동물 수 구하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/59406">https://school.programmers.co.kr/learn/courses/30/lessons/59406</a>)</h3>
<h4 id="my-code-2">My Code</h4>
<pre><code>-- 동물 보호소에 동물이 몇 마리 들어왔는지 조회
SELECT COUNT(ANIMAL_ID) AS count
FROM ANIMAL_INS
;</code></pre><hr>

<h3 id="lv2--중복-제거하기-httpsschoolprogrammerscokrlearncourses30lessons59408">[Lv2 : 중복 제거하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/59408">https://school.programmers.co.kr/learn/courses/30/lessons/59408</a>)</h3>
<h4 id="my-code-3">My Code</h4>
<pre><code>-- 동물의 이름은 몇 개인지 조회
-- 이름이 NULL인 경우는 집계하지 않는다
-- 중복되는 이름은 하나로 처리
SELECT COUNT(DISTINCT(NAME)) AS count
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
;</code></pre><hr>

<h3 id="lv2--조건에-맞는-아이템들의-가격의-총합-구하기-httpsschoolprogrammerscokrlearncourses30lessons273709">[Lv2 : 조건에 맞는 아이템들의 가격의 총합 구하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/273709">https://school.programmers.co.kr/learn/courses/30/lessons/273709</a>)</h3>
<h4 id="my-code-4">My Code</h4>
<pre><code>-- 희귀도가 &#39;LEGEND&#39;인 아이템들의 가격의 총합
-- 컬럼명 &#39;TOTAL_PRICE&#39;
SELECT SUM(PRICE) AS TOTAL_PRICE
FROM ITEM_INFO
WHERE RARITY = &#39;LEGEND&#39;
;</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[SQL Kit] SELECT]]></title>
            <link>https://velog.io/@seong_li/SQL-Kit-SELECT</link>
            <guid>https://velog.io/@seong_li/SQL-Kit-SELECT</guid>
            <pubDate>Mon, 26 Feb 2024 06:42:03 GMT</pubDate>
            <description><![CDATA[<h3 id="lv2--3월에-태어난-여성-회원-목록-출력"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/131120">Lv2 : 3월에 태어난 여성 회원 목록 출력</a></h3>
<h4 id="my-code">My Code</h4>
<pre><code>-- 생일이 3월 / 여성 회원 
-- ID, 이름, 성별, 생년월일을 조회
-- 전화번호 NULL 제외
-- ID 기준 ASC

SELECT MEMBER_ID, MEMBER_NAME, GENDER, DATE_FORMAT(DATE_OF_BIRTH, &#39;%Y-%m-%d&#39;) AS DATE_OF_BIRTH
FROM MEMBER_PROFILE
WHERE DATE_OF_BIRTH LIKE &#39;%-03-%&#39; 
    AND GENDER = &#39;W&#39;
    AND TLNO IS NOT NULL
ORDER BY MEMBER_ID ASC
;</code></pre><hr>

<h3 id="lv1--흉부외과-또는-일반외과-의사-목록-출력"><a href="https://school.programmers.co.kr/learn/courses/30/lessons/132203">Lv1 : 흉부외과 또는 일반외과 의사 목록 출력</a></h3>
<h4 id="my-code-1">My Code</h4>
<pre><code>-- 진료과가 흉부외과(CS)이거나 일반외과(GS)인 의사
-- 의사의 이름, 의사ID, 진료과, 고용일자 조회
-- 고용일자 기준 DESC =&gt; 이름 기준 ASC
SELECT DR_NAME, DR_ID, MCDP_CD, DATE_FORMAT(HIRE_YMD, &#39;%Y-%m-%d&#39;) as HIRE_YMD
FROM DOCTOR
WHERE MCDP_CD IN (&#39;CS&#39;, &#39;GS&#39;)
ORDER BY HIRE_YMD DESC, DR_NAME ASC
;</code></pre><hr>

<h3 id="lv1--12세-이하인-여자-환자-목록-출력하기-httpsschoolprogrammerscokrlearncourses30lessons132201">[Lv1 : 12세 이하인 여자 환자 목록 출력하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/132201">https://school.programmers.co.kr/learn/courses/30/lessons/132201</a>)</h3>
<h4 id="my-code-2">My Code</h4>
<pre><code>-- 12세 이하 / 여자환자
-- 환자이름, 환자번호, 성별코드, 나이, 전화번호 조회
-- 전화번호가 없는 경우, &#39;NONE&#39;으로 출력
-- 나이 기준 DESC =&gt; 환자이름 기준 ASC
SELECT PT_NAME, PT_NO, GEND_CD, AGE, IF(TLNO IS NULL, &#39;NONE&#39;, TLNO) AS TLNO
FROM PATIENT
WHERE AGE &lt;= &#39;12&#39;
    AND GEND_CD = &#39;W&#39;
ORDER BY AGE DESC, PT_NAME ASC
;</code></pre><hr>

<h3 id="lv1--과일로-만든-아이스크림-고르기-httpsschoolprogrammerscokrlearncourses30lessons133025">[Lv1 : 과일로 만든 아이스크림 고르기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/133025">https://school.programmers.co.kr/learn/courses/30/lessons/133025</a>)</h3>
<h4 id="my-code-3">My Code</h4>
<pre><code>-- 총주문량이 3,000보다 높다 / 주 성분이 과일
-- 총주문량이 큰 순서대로 조회 (DESC)
SELECT H.FLAVOR
FROM FIRST_HALF AS H JOIN ICECREAM_INFO  AS I
    ON H.FLAVOR = I.FLAVOR
WHERE H.TOTAL_ORDER &gt; 3000
    AND I.INGREDIENT_TYPE = &#39;fruit_based&#39;
ORDER BY TOTAL_ORDER DESC
;</code></pre><hr>


<h3 id="lv1--평균-일일-대여-요금-구하기-httpsschoolprogrammerscokrlearncourses30lessons151136">[Lv1 : 평균 일일 대여 요금 구하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/151136">https://school.programmers.co.kr/learn/courses/30/lessons/151136</a>)</h3>
<h4 id="my-code-4">My Code</h4>
<pre><code>-- 자동차 종류가 &#39;SUV&#39;
-- 평균 일일 대여 요금 출력
-- 소수 첫 번째 자리에서 반올림 / 컬럼명은 &#39;AVERAGE_FEE&#39;
SELECT ROUND(AVG(DAILY_FEE),0) AS AVERAGE_FEE
FROM CAR_RENTAL_COMPANY_CAR
WHERE CAR_TYPE = &#39;SUV&#39;
;</code></pre><hr>

<h3 id="lv1--조건에-부합하는-중고거래-댓글-조회하기-httpsschoolprogrammerscokrlearncourses30lessons164673">[Lv1 : 조건에 부합하는 중고거래 댓글 조회하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/164673">https://school.programmers.co.kr/learn/courses/30/lessons/164673</a>)</h3>
<h4 id="my-code-5">My Code</h4>
<pre><code>-- 2022년 10월에 작성
-- 게시글 제목, 게시글 ID, 댓글 ID, 댓글 작성자 ID, 댓글 내용, 댓글 작성일 조회
-- 댓글 작성일 기준 ASC =&gt; 게시글 제목 기준 ASC
SELECT B.TITLE, B.BOARD_ID, R.REPLY_ID, R.WRITER_ID, R.CONTENTS, DATE_FORMAT(R.CREATED_DATE, &#39;%Y-%m-%d&#39;) AS CREATED_DATE
FROM USED_GOODS_BOARD AS B JOIN USED_GOODS_REPLY AS R
    ON B.BOARD_ID = R.BOARD_ID
WHERE B.CREATED_DATE LIKE &quot;2022-10-%&quot;
ORDER BY R.CREATED_DATE ASC, B.TITLE ASC
;</code></pre><hr>

<h3 id="lv4--서울에-위치한-식당-목록-출력하기-httpsschoolprogrammerscokrlearncourses30lessons131118">[Lv4 : 서울에 위치한 식당 목록 출력하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/131118">https://school.programmers.co.kr/learn/courses/30/lessons/131118</a>)</h3>
<h4 id="my-code-6">My Code</h4>
<pre><code>-- 서울에 위치한 식당
-- 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수 조회
-- 평균점수는 소수점 세 번째 자리에서 반올림
-- 평균점수 기준 DESC =&gt; 즐겨찾기수 기준 DESC
SELECT I.REST_ID, I.REST_NAME, I.FOOD_TYPE, I.FAVORITES, I.ADDRESS, ROUND(AVG(R.REVIEW_SCORE), 2) AS SCORE
FROM REST_INFO AS I JOIN REST_REVIEW AS R
    ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE &#39;서울%&#39;
GROUP BY I.REST_NAME
ORDER BY SCORE DESC, FAVORITES DESC
;</code></pre><hr>

<h3 id="lv2--재구매가-일어난-상품과-회원-리스트-구하기-httpsschoolprogrammerscokrlearncourses30lessons131536">[Lv2 : 재구매가 일어난 상품과 회원 리스트 구하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/131536">https://school.programmers.co.kr/learn/courses/30/lessons/131536</a>)</h3>
<h4 id="my-code-7">My Code</h4>
<pre><code>-- 동일한 회원이 동일한 상품을 재구매한 데이터를 구하여,
-- 재구매한 회원 ID, 재구매한 상품 ID 출력
-- 회원 ID 기준 ASC =&gt; 상품 ID 기준 DESC
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) &gt;= 2
ORDER BY USER_ID ASC, PRODUCT_ID DESC
;</code></pre><hr>

<h3 id="lv4--오프라인온라인-판매-데이터-통합하기-httpsschoolprogrammerscokrlearncourses30lessons131537">[Lv4 : 오프라인/온라인 판매 데이터 통합하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/131537">https://school.programmers.co.kr/learn/courses/30/lessons/131537</a>)</h3>
<h4 id="my-code-8">My Code</h4>
<pre><code>-- 2022년 3월
-- 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량 출력
-- OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL
-- 판매일 기준 ASC =&gt; 상품 ID 기준 ASC =&gt; 유저 ID ASC

-- 두 테이블을 합쳐야 돼! JOIN이 아니다!
SELECT DATE_FORMAT(SALES_DATE, &#39;%Y-%m-%d&#39;) as SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT
FROM ONLINE_SALE
WHERE SALES_DATE LIKE &#39;2022-03-%&#39;

UNION ALL

SELECT DATE_FORMAT(SALES_DATE, &#39;%Y-%m-%d&#39;) as SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT
FROM OFFLINE_SALE
WHERE SALES_DATE LIKE &#39;2022-03-%&#39;

ORDER BY SALES_DATE ASC, PRODUCT_ID ASC, USER_ID ASC
;</code></pre><h4 id="union">UNION</h4>
<ul>
<li>두 개 이상의 SELECT 문 결과를 합쳐서 하나의 결과로 반환한다.</li>
<li>중복된 결과를 제거한다.</li>
<li>결과를 반환하기 전에 데이터를 정렬하여 중복을 제거하는 과정이 필요하기 때문에, UNION ALL보다 처리 속도가 느릴 수 있다.<h4 id="union-all">UNION ALL</h4>
</li>
<li>두 개 이상의 SELECT 문 결과를 그대로 합쳐서 반환한다.</li>
<li>중복된 결과도 모두 포함한다.</li>
<li>중복 제거 과정이 없기 때문에 UNION보다 처리 속도가 빠르다.</li>
</ul>
<hr>

<h3 id="lv1--상위-n개-레코드-httpsschoolprogrammerscokrlearncourses30lessons59405">[Lv1 : 상위 n개 레코드] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/59405">https://school.programmers.co.kr/learn/courses/30/lessons/59405</a>)</h3>
<h4 id="my-code-9">My Code</h4>
<pre><code>-- 동물 보호소에 가장 먼저 들어온 동물
-- 동물 이름 조회
SELECT NAME FROM ANIMAL_INS ORDER BY DATETIME LIMIT 1;</code></pre><hr>

<h3 id="lv2--업그레이드-된-아이템-구하기-httpsschoolprogrammerscokrlearncourses30lessons273711">[Lv2 : 업그레이드 된 아이템 구하기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/273711">https://school.programmers.co.kr/learn/courses/30/lessons/273711</a>)</h3>
<h4 id="my-code-10">My Code</h4>
<pre><code>-- 아이템의 희귀도가 &#39;RARE&#39;인 아이템의 모든 다음 업그레이드 아이템
-- 아이템 ID(ITEM_ID), 아이템 명(ITEM_NAME), 아이템의 희귀도(RARITY) 출력
-- 아이템 ID 기준 DSEC

SELECT ITEM_ID, ITEM_NAME, RARITY
FROM ITEM_INFO
WHERE ITEM_ID IN (
    SELECT ITEM_ID
    FROM ITEM_TREE 
    WHERE PARENT_ITEM_ID IN (
        SELECT ITEM_ID
        FROM ITEM_INFO
        WHERE RARITY = &#39;RARE&#39;
    )
)
ORDER BY ITEM_ID DESC
;</code></pre><hr>

<h3 id="lv2--조건에-맞는-개발자-찾기-httpsschoolprogrammerscokrlearncourses30lessons276034-☆">[Lv2 : 조건에 맞는 개발자 찾기] (<a href="https://school.programmers.co.kr/learn/courses/30/lessons/276034">https://school.programmers.co.kr/learn/courses/30/lessons/276034</a>) ☆</h3>
<h4 id="my-code-11">My Code</h4>
<pre><code>-- Python이나 C# 스킬을 가진 개발자의 정보를 조회
-- 개발자 ID, 이메일, 이름, 성 조회
-- 개발자 ID 기준 ASC

SELECT ID, EMAIL, FIRST_NAME, LAST_NAME
FROM DEVELOPERS
WHERE SKILL_CODE &amp; (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;Python&#39;) != 0
   OR SKILL_CODE &amp; (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;C#&#39;) != 0
ORDER BY ID ASC
;

# SET @Python = (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;Python&#39;);
# SET @C = (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;C#&#39;);
-- 실패 (1064, &quot;You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near &#39;SET @C_S = (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;C#&#39;);\n\nSELECT ID, EMAIL, F&#39; at line 6&quot;)</code></pre><h4 id="hot-point">Hot Point</h4>
<ul>
<li>★ SKILL_CODE와 특정 스킬의 CODE를 비트 AND 연산한 결과가 0이 아니라면, 해당 스킬 코드가 SKILL_CODE에 포함되어 있다는 것을 의미한다.</li>
<li>SET 문을 사용하여 변수를 할당하고 바로 SELECT 쿼리를 실행하려 할 때 발생하는 구문 오류</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algo-Challenge]]]></title>
            <link>https://velog.io/@seong_li/Algo-Challenge-20240219</link>
            <guid>https://velog.io/@seong_li/Algo-Challenge-20240219</guid>
            <pubDate>Mon, 19 Feb 2024 04:05:29 GMT</pubDate>
            <description><![CDATA[<h1 id="level-3-여행경로---43164">[level 3] 여행경로 - 43164</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/43164">문제 링크</a> </p>
<h3 id="문제-설명">문제 설명</h3>
<p>주어진 항공권을 모두 이용하여 여행경로를 짜려고 합니다. 항상 "ICN" 공항에서 출발합니다.</p>

<p>항공권 정보가 담긴 2차원 배열 tickets가 매개변수로 주어질 때, 방문하는 공항 경로를 배열에 담아 return 하도록 solution 함수를 작성해주세요.</p>

<h5>제한사항</h5>

<ul>
<li>모든 공항은 알파벳 대문자 3글자로 이루어집니다.</li>
<li>주어진 공항 수는 3개 이상 10,000개 이하입니다.</li>
<li>tickets의 각 행 [a, b]는 a 공항에서 b 공항으로 가는 항공권이 있다는 의미입니다.</li>
<li>주어진 항공권은 모두 사용해야 합니다.</li>
<li>만일 가능한 경로가 2개 이상일 경우 알파벳 순서가 앞서는 경로를 return 합니다.</li>
<li>모든 도시를 방문할 수 없는 경우는 주어지지 않습니다.</li>
</ul>

<h5>입출력 예</h5>
<table class="table">
        <thead><tr>
<th>tickets</th>
<th>return</th>
</tr>
</thead>
        <tbody><tr>
<td>[["ICN", "JFK"], ["HND", "IAD"], ["JFK", "HND"]]</td>
<td>["ICN", "JFK", "HND", "IAD"]</td>
</tr>
<tr>
<td>[["ICN", "SFO"], ["ICN", "ATL"], ["SFO", "ATL"], ["ATL", "ICN"], ["ATL","SFO"]]</td>
<td>["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"]</td>
</tr>
</tbody>
      </table>
<h5>입출력 예 설명</h5>

<p>예제 #1</p>

<p>["ICN", "JFK", "HND", "IAD"] 순으로 방문할 수 있습니다.</p>

<p>예제 #2</p>

<p>["ICN", "SFO", "ATL", "ICN", "ATL", "SFO"] 순으로 방문할 수도 있지만 ["ICN", "ATL", "ICN", "SFO", "ATL", "SFO"] 가 알파벳 순으로 앞섭니다.</p>

<hr><hr>

<h2 id="point">Point</h2>
<ul>
<li>순서가 담기는 경우가 여러개 =&gt; List배열에 담아서 비교</li>
<li>dfs 돌릴때, &quot;Link + &quot; &quot; + tickets[i][1]&quot; 로 문자열 늘려가는 기술 익히기</li>
</ul>
<h2 id="code">Code</h2>
<pre><code>import java.util.*;
class Solution {
    public static boolean[] visited; 
    public static String answer;
    public static LinkedList&lt;String&gt; list = new LinkedList&lt;&gt;();;
    public String[] solution(String[][] tickets) {
        visited = new boolean[tickets.length];

        int count = 0;
        String Start = &quot;ICN&quot;;
        String Link = &quot;ICN&quot;;
        dfs(tickets, count, Start, Link);
        Collections.sort(list);

        return list.get(0).split(&quot; &quot;);
    } // solution

    public static void dfs(String[][] tickets, int count, String start, String Link){
        if(count == tickets.length) {
            list.add(Link);
            return;
        }

        for(int i = 0 ; i &lt; tickets.length ; i++){
            if(!visited[i] &amp;&amp; start.equals(tickets[i][0])){
                visited[i] = true;
                dfs(tickets, count+1, tickets[i][1], Link + &quot; &quot; + tickets[i][1]);
                visited[i] = false;
            }
        }
    } // dfs
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Algo-Challenge]]]></title>
            <link>https://velog.io/@seong_li/Algo-Challenge-20240216</link>
            <guid>https://velog.io/@seong_li/Algo-Challenge-20240216</guid>
            <pubDate>Fri, 16 Feb 2024 02:57:08 GMT</pubDate>
            <description><![CDATA[<h1 id="level-4-그룹별-조건에-맞는-식당-목록-출력하기---131124">[level 4] 그룹별 조건에 맞는 식당 목록 출력하기 - 131124</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/131124">문제 링크</a></p>
<h3 id="문제-설명">문제 설명</h3>
<p>다음은 고객의 정보를 담은 <code>MEMBER_PROFILE</code>테이블과 식당의 리뷰 정보를 담은  <code>REST_REVIEW</code> 테이블입니다. <code>MEMBER_PROFILE</code> 테이블은 다음과 같으며 <code>MEMBER_ID</code>, <code>MEMBER_NAME</code>, <code>TLNO</code>, <code>GENDER</code>, <code>DATE_OF_BIRTH</code>는 회원 ID, 회원 이름, 회원 연락처, 성별, 생년월일을 의미합니다.</p>
<table class="table">
        <thead><tr>
<th>Column name</th>
<th>Type</th>
<th>Nullable</th>
</tr>
</thead>
        <tbody><tr>
<td>MEMBER_ID</td>
<td>VARCHAR(100)</td>
<td>FALSE</td>
</tr>
<tr>
<td>MEMBER_NAME</td>
<td>VARCHAR(50)</td>
<td>FALSE</td>
</tr>
<tr>
<td>TLNO</td>
<td>VARCHAR(50)</td>
<td>TRUE</td>
</tr>
<tr>
<td>GENDER</td>
<td>VARCHAR(1)</td>
<td>TRUE</td>
</tr>
<tr>
<td>DATE_OF_BIRTH</td>
<td>DATE</td>
<td>TRUE</td>
</tr>
</tbody>
      </table>
<p><code>REST_REVIEW</code> 테이블은 다음과 같으며 <code>REVIEW_ID</code>, <code>REST_ID</code>, <code>MEMBER_ID</code>, <code>REVIEW_SCORE</code>, <code>REVIEW_TEXT</code>,<code>REVIEW_DATE</code>는 각각 리뷰 ID, 식당 ID, 회원 ID, 점수, 리뷰 텍스트, 리뷰 작성일을 의미합니다.</p>
<table class="table">
        <thead><tr>
<th>Column name</th>
<th>Type</th>
<th>Nullable</th>
</tr>
</thead>
        <tbody><tr>
<td>REVIEW_ID</td>
<td>VARCHAR(10)</td>
<td>FALSE</td>
</tr>
<tr>
<td>REST_ID</td>
<td>VARCHAR(10)</td>
<td>TRUE</td>
</tr>
<tr>
<td>MEMBER_ID</td>
<td>VARCHAR(100)</td>
<td>TRUE</td>
</tr>
<tr>
<td>REVIEW_SCORE</td>
<td>NUMBER</td>
<td>TRUE</td>
</tr>
<tr>
<td>REVIEW_TEXT</td>
<td>VARCHAR(1000)</td>
<td>TRUE</td>
</tr>
<tr>
<td>REVIEW_DATE</td>
<td>DATE</td>
<td>TRUE</td>
</tr>
</tbody>
      </table>
<hr>

<h5>문제</h5>

<p><code>MEMBER_PROFILE</code>와 <code>REST_REVIEW</code> 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.</p>

<hr>

<h5>예시</h5>

<p><code>MEMBER_PROFILE</code> 테이블이 다음과 같고</p>
<table class="table">
        <thead><tr>
<th>MEMBER_ID</th>
<th>MEMBER_NAME</th>
<th>TLNO</th>
<th>GENDER</th>
<th>DATE_OF_BIRTH</th>
</tr>
</thead>
        <tbody><tr>
<td><code>jiho92@naver.com</code></td>
<td>이지호</td>
<td>01076432111</td>
<td>W</td>
<td>1992-02-12</td>
</tr>
<tr>
<td><code>jiyoon22@hotmail.com</code></td>
<td>김지윤</td>
<td>01032324117</td>
<td>W</td>
<td>1992-02-22</td>
</tr>
<tr>
<td><code>jihoon93@hanmail.net</code></td>
<td>김지훈</td>
<td>01023258688</td>
<td>M</td>
<td>1993-02-23</td>
</tr>
<tr>
<td><code>seoyeons@naver.com</code></td>
<td>박서연</td>
<td>01076482209</td>
<td>W</td>
<td>1993-03-16</td>
</tr>
<tr>
<td><code>yelin1130@gmail.com</code></td>
<td>조예린</td>
<td>01017626711</td>
<td>W</td>
<td>1990-11-30</td>
</tr>
</tbody>
      </table>
<p><code>REST_REVIEW</code> 테이블이 다음과 같을 때</p>
<table class="table">
        <thead><tr>
<th>REVIEW_ID</th>
<th>REST_ID</th>
<th>MEMBER_ID</th>
<th>REVIEW_SCORE</th>
<th>REVIEW_TEXT</th>
<th>REVIEW_DATE</th>
</tr>
</thead>
        <tbody><tr>
<td>R000000065</td>
<td>00028</td>
<td><code>soobin97@naver.com</code></td>
<td>5</td>
<td>부찌 국물에서 샤브샤브 맛이나고 깔끔</td>
<td>2022-04-12</td>
</tr>
<tr>
<td>R000000066</td>
<td>00039</td>
<td><code>yelin1130@gmail.com</code></td>
<td>5</td>
<td>김치찌개 최곱니다.</td>
<td>2022-02-12</td>
</tr>
<tr>
<td>R000000067</td>
<td>00028</td>
<td><code>yelin1130@gmail.com</code></td>
<td>5</td>
<td>햄이 많아서 좋아요</td>
<td>2022-02-22</td>
</tr>
<tr>
<td>R000000068</td>
<td>00035</td>
<td><code>ksyi0316@gmail.com</code></td>
<td>5</td>
<td>숙성회가 끝내줍니다.</td>
<td>2022-02-15</td>
</tr>
<tr>
<td>R000000069</td>
<td>00035</td>
<td><code>yoonsy95@naver.com</code></td>
<td>4</td>
<td>비린내가 전혀없어요.</td>
<td>2022-04-16</td>
</tr>
</tbody>
      </table>
<p>SQL을 실행하면 다음과 같이 출력되어야 합니다.</p>
<table class="table">
        <thead><tr>
<th>MEMBER_NAME</th>
<th>REVIEW_TEXT</th>
<th>REVIEW_DATE</th>
</tr>
</thead>
        <tbody><tr>
<td>조예린</td>
<td>김치찌개 최곱니다.</td>
<td>2022-02-12</td>
</tr>
<tr>
<td>조예린</td>
<td>햄이 많아서 좋아요</td>
<td>2022-02-22</td>
</tr>
</tbody>
      </table>
<hr>

<h5>주의사항</h5>

<p><code>REVIEW_DATE</code>의 데이트 포맷이 예시와 동일해야 정답처리 됩니다.</p>

<hr><hr>

<h3 id="point">Point</h3>
<ul>
<li>모은행 코딩테스트에서 구해진 값을 활용하는 문제가 있었는데!
이걸 알았으면 바로 해결 했을거같다..!</li>
</ul>
<h3 id="my-code">My Code</h3>
<pre><code>-- 리뷰를 가장 많이 작성한 회원
-- 의 리뷰들을 조회
-- 회원 이름, 리뷰 텍스트, 리뷰 작성일
-- 리뷰 작성일 ASC, 리뷰 텍스트 ASC

-- 값 저장 3가지 방법 !!!
# SELECT MEMBER_ID INTO @TEMP_SAVE
# FROM REST_REVIEW
# GROUP BY MEMBER_ID
# ORDER BY COUNT(*) DESC 
# LIMIT 1;

# SELECT @TEMP_SAVE := MEMBER_ID
# FROM REST_REVIEW
# GROUP BY MEMBER_ID
# ORDER BY COUNT(*) DESC
# LIMIT 1;

SET @TEMP_SAVE = (
  SELECT MEMBER_ID
  FROM REST_REVIEW
  GROUP BY MEMBER_ID
  ORDER BY COUNT(*) DESC
  LIMIT 1
);

SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, &quot;%Y-%m-%d&quot;) AS REVIEW_DATE
FROM MEMBER_PROFILE AS P JOIN REST_REVIEW AS R
ON P.MEMBER_ID = R.MEMBER_ID
WHERE P.MEMBER_ID = @TEMP_SAVE
ORDER BY REVIEW_DATE ASC, REVIEW_TEXT ASC
;
</code></pre><hr>

<h2 id="oh">Oh</h2>
<pre><code>CREATE TABLE TEST (
    TEST_INDEX INT AUTO_INCREMENT PRIMARY KEY,
    TEMP_SAVE VARCHAR(100) 
);

INSERT INTO TEST (TEMP_SAVE)
SELECT MEMBER_ID
FROM REST_REVIEW
GROUP BY MEMBER_ID
ORDER BY COUNT(*) DESC
LIMIT 1;

SELECT MEMBER_NAME, REVIEW_TEXT, DATE_FORMAT(REVIEW_DATE, &quot;%Y-%m-%d&quot;) AS REVIEW_DATE
FROM MEMBER_PROFILE AS P 
JOIN REST_REVIEW AS R ON P.MEMBER_ID = R.MEMBER_ID
JOIN TEST AS T ON P.MEMBER_ID = T.TEMP_SAVE
WHERE P.MEMBER_ID = T.TEMP_SAVE
ORDER BY REVIEW_DATE ASC, REVIEW_TEXT ASC
;</code></pre><ul>
<li>SQL 실행 중 오류가 발생하였습니다.</li>
<li>CREATE command denied to user &#39;USERDE4C9C55318D022B08A7E6F5C0&#39;@&#39;172.31.4.160&#39; for table &#39;test&#39;<blockquote>
<p>테이블을 만드는 권한은 프로그래머스에서 주어지지 않나봄 오우오</p>
</blockquote>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algo-Challenge]]]></title>
            <link>https://velog.io/@seong_li/Algo-Challenge-20240208</link>
            <guid>https://velog.io/@seong_li/Algo-Challenge-20240208</guid>
            <pubDate>Thu, 08 Feb 2024 05:59:51 GMT</pubDate>
            <description><![CDATA[<p>지원서 쓰랴,, 토익 하랴,, 정신없지만,, 해내자</p>
<hr>

<h1 id="level-2-괄호-회전하기---76502">[level 2] 괄호 회전하기 - 76502</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/76502">문제 링크</a> </p>
<h3 id="문제-설명">문제 설명</h3>
<p>다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.</p>

<ul>
<li><code>()</code>, <code>[]</code>, <code>{}</code> 는 모두 올바른 괄호 문자열입니다.</li>
<li>만약 <code>A</code>가 올바른 괄호 문자열이라면, <code>(A)</code>, <code>[A]</code>, <code>{A}</code> 도 올바른 괄호 문자열입니다. 예를 들어, <code>[]</code> 가 올바른 괄호 문자열이므로, <code>([])</code> 도 올바른 괄호 문자열입니다.</li>
<li>만약 <code>A</code>, <code>B</code>가 올바른 괄호 문자열이라면, <code>AB</code> 도 올바른 괄호 문자열입니다. 예를 들어, <code>{}</code> 와 <code>([])</code> 가 올바른 괄호 문자열이므로, <code>{}([])</code> 도 올바른 괄호 문자열입니다.</li>
</ul>

<p>대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 <code>s</code>가 매개변수로 주어집니다. 이 <code>s</code>를 왼쪽으로 x (<em>0 ≤ x &lt; (<code>s</code>의 길이)</em>) 칸만큼 회전시켰을 때 <code>s</code>가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.</p>

<hr>

<h5>제한사항</h5>

<ul>
<li>s의 길이는 1 이상 1,000 이하입니다.</li>
</ul>

<hr>

<h5>입출력 예</h5>
<table class="table">
        <thead><tr>
<th>s</th>
<th>result</th>
</tr>
</thead>
        <tbody><tr>
<td><code>"[](){}"</code></td>
<td>3</td>
</tr>
<tr>
<td><code>"}]()[{"</code></td>
<td>2</td>
</tr>
<tr>
<td><code>"[)(]"</code></td>
<td>0</td>
</tr>
<tr>
<td><code>"}}}"</code></td>
<td>0</td>
</tr>
</tbody>
      </table>
<hr>

<h5>입출력 예 설명</h5>

<p><strong>입출력 예 #1</strong></p>

<ul>
<li>다음 표는 <code>"[](){}"</code> 를 회전시킨 모습을 나타낸 것입니다.</li>
</ul>
<table class="table">
        <thead><tr>
<th>x</th>
<th>s를 왼쪽으로 x칸만큼 회전</th>
<th>올바른 괄호 문자열?</th>
</tr>
</thead>
        <tbody><tr>
<td>0</td>
<td><code>"[](){}"</code></td>
<td>O</td>
</tr>
<tr>
<td>1</td>
<td><code>"](){}["</code></td>
<td>X</td>
</tr>
<tr>
<td>2</td>
<td><code>"(){}[]"</code></td>
<td>O</td>
</tr>
<tr>
<td>3</td>
<td><code>"){}[]("</code></td>
<td>X</td>
</tr>
<tr>
<td>4</td>
<td><code>"{}[]()"</code></td>
<td>O</td>
</tr>
<tr>
<td>5</td>
<td><code>"}[](){"</code></td>
<td>X</td>
</tr>
</tbody>
      </table>
<ul>
<li>올바른 괄호 문자열이 되는 x가 3개이므로, 3을 return 해야 합니다.</li>
</ul>

<p><strong>입출력 예 #2</strong></p>

<ul>
<li>다음 표는 <code>"}]()[{"</code> 를 회전시킨 모습을 나타낸 것입니다.</li>
</ul>
<table class="table">
        <thead><tr>
<th>x</th>
<th>s를 왼쪽으로 x칸만큼 회전</th>
<th>올바른 괄호 문자열?</th>
</tr>
</thead>
        <tbody><tr>
<td>0</td>
<td><code>"}]()[{"</code></td>
<td>X</td>
</tr>
<tr>
<td>1</td>
<td><code>"]()[{}"</code></td>
<td>X</td>
</tr>
<tr>
<td>2</td>
<td><code>"()[{}]"</code></td>
<td>O</td>
</tr>
<tr>
<td>3</td>
<td><code>")[{}]("</code></td>
<td>X</td>
</tr>
<tr>
<td>4</td>
<td><code>"[{}]()"</code></td>
<td>O</td>
</tr>
<tr>
<td>5</td>
<td><code>"{}]()["</code></td>
<td>X</td>
</tr>
</tbody>
      </table>
<ul>
<li>올바른 괄호 문자열이 되는 x가 2개이므로, 2를 return 해야 합니다.</li>
</ul>

<p><strong>입출력 예 #3</strong></p>

<ul>
<li>s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.</li>
</ul>

<p><strong>입출력 예 #4</strong></p>

<ul>
<li>s를 어떻게 회전하더라도 올바른 괄호 문자열을 만들 수 없으므로, 0을 return 해야 합니다.</li>
</ul>

<hr>

<h1 id="my-code">My Code</h1>
<pre><code>import java.util.*;
class Solution {
    public int solution(String s) {

        int ans = 0;

        for(int i = 0 ; i &lt; s.length() ; i++){
            String temp = &quot;&quot;;
            for(int j = i ; j &lt; s.length() ; j++){
                temp += s.charAt(j);
            }
            for(int j = 0 ; j &lt; i ; j++){
                temp += s.charAt(j);
            }

            Stack&lt;Character&gt; stack = new Stack&lt;&gt;();
            for(int k = 0 ; k &lt; temp.length() ; k++){
                char unit = temp.charAt(k);

                if(!stack.isEmpty()) {
                    char temp_unit = stack.peek();

                    if(unit == reverse_check(temp_unit)){
                        stack.pop();
                    }else{
                        stack.add(unit);
                    }
                }else{
                    stack.add(unit);
                }
            }
            if(stack.isEmpty()) ans++;
        }

        return ans;

    }

    public static Character reverse_check(char temp){
        if(temp == &#39;[&#39;) return &#39;]&#39;;
        if(temp == &#39;(&#39;) return &#39;)&#39;;
        if(temp == &#39;{&#39;) return &#39;}&#39;;
        return &#39;@&#39;;
    }
}</code></pre><h1 id="other-clean-code">Other Clean Code</h1>
<pre><code>import java.util.*;

class Solution {
    public int solution(String s) {
        int answer = 0;
        int strLen = s.length();

        for(int i = 0; i &lt; strLen; i++)
            answer += cal(s, i, strLen);

        return answer;
    }

    public int cal(String s, int strtIdx, int strLen){
        int ret = 0;
        Stack&lt;Character&gt; st = new Stack&lt;&gt;();

        for(int i = strtIdx; i &lt; strtIdx + strLen; i++){
            int idx = i % strLen;
            char c = s.charAt(idx);

            if(c == &#39;(&#39; || c == &#39;{&#39; || c == &#39;[&#39;)
                st.push(c);
            else if(c == &#39;)&#39; || c == &#39;}&#39; || c == &#39;]&#39;){
                if(st.empty())
                    return 0;
                else if((st.peek() != &#39;(&#39; &amp;&amp; c == &#39;)&#39;) || (st.peek() != &#39;{&#39; &amp;&amp; c == &#39;}&#39;) || (st.peek() != &#39;[&#39; &amp;&amp; c == &#39;]&#39;))
                    return 0;
                else
                    st.pop();
            }
        }

        if(!st.empty())
            return 0;

        return 1;
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[Algo-Challenge]]]></title>
            <link>https://velog.io/@seong_li/Algo-Challenge-20240206</link>
            <guid>https://velog.io/@seong_li/Algo-Challenge-20240206</guid>
            <pubDate>Tue, 06 Feb 2024 02:41:48 GMT</pubDate>
            <description><![CDATA[<h1 id="sql--level-4-자동차-대여-기록-별-대여-금액-구하기---151141">[SQL : level 4] 자동차 대여 기록 별 대여 금액 구하기 - 151141</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/151141">문제 링크</a></p>
<h3 id="my-code">My Code</h3>
<pre><code>-- 자동차 종류가 &#39;트럭&#39;인 자동차의 대여 기록에 대해
-- 기록 별로 대여 금액(컬럼명: FEE)을 구하여 
-- 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문
-- 대여 금액 DESC -&gt; 대여 기록 ID DESC


# COALESCE(P.DISCOUNT_RATE, 0)은 P.DISCOUNT_RATE가 NULL이 아니면 P.DISCOUNT_RATE를, NULL이면 0을 반환
SELECT H.HISTORY_ID, 
    ROUND((DATEDIFF(H.END_DATE, H.START_DATE) + 1) * C.DAILY_FEE *  (1 - COALESCE(P.DISCOUNT_RATE, 0) * 0.01)) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS C 
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H ON C.CAR_ID = H.CAR_ID
# 할인이 없는 NULL인 경우때문에 LEFT JOIN
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P ON C.CAR_TYPE = P.CAR_TYPE
    AND (
        CASE 
            WHEN DATEDIFF(H.END_DATE,H.START_DATE)+1 &gt;= 90 THEN &#39;90일 이상&#39;
            WHEN DATEDIFF(H.END_DATE,H.START_DATE)+1 &gt;= 30 THEN &#39;30일 이상&#39;
            WHEN DATEDIFF(H.END_DATE,H.START_DATE)+1 &gt;= 7 THEN &#39;7일 이상&#39;
            ELSE NULL
        END
    ) = P.DURATION_TYPE
WHERE C.CAR_TYPE = &#39;트럭&#39;      
ORDER BY FEE DESC, HISTORY_ID DESC
;</code></pre><hr><hr>

<h1 id="java--level-3-단어-변환---43163">[JAVA : level 3] 단어 변환 - 43163</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/43163">문제 링크</a></p>
<h3 id="my-code-1">My Code</h3>
<pre><code>class Solution {
    public static int ans, count;
    public static boolean[] visited;
    public int solution(String begin, String target, String[] words) {
        ans = Integer.MAX_VALUE;

        for(int i = 0 ; i &lt; words.length ; i++){
            String temp = words[i];
            visited = new boolean[words.length];
            if(compare(begin, temp)){
                count++;
                visited[i] = true;
                dfs(1, temp, target, words);
            }
        }

        return ans == Integer.MAX_VALUE ? 0 : ans;

    } // solution

    public static void dfs(int count, String begin, String target, String[] words){
        if(begin.equals(target)){
            ans = Math.min(ans, count);
            return;
        }

        for(int i = 0 ; i &lt; words.length ; i++){
            if(!visited[i] &amp;&amp; compare(begin, words[i])){
                visited[i] = true;
                dfs(count+1, words[i], target, words);
                visited[i] = false;
            }
        }

    } // dfs


    // 한 개만 다르면 true
    public static boolean compare(String first, String second){
        int k = 0;
        for(int i = 0 ; i &lt; first.length() ; i++){
            if(first.charAt(i) == second.charAt(i)) k++;
        }
        if( k == first.length() -1) return true;
        else return false;
    } // compare
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-Challenge : 객체지향언어]]]></title>
            <link>https://velog.io/@seong_li/CS-Challenge-20240202</link>
            <guid>https://velog.io/@seong_li/CS-Challenge-20240202</guid>
            <pubDate>Fri, 02 Feb 2024 04:44:27 GMT</pubDate>
            <description><![CDATA[<p>:) Java의 가장 큰 특징인 &quot;객체지향언어&quot;에 대해 설명할게욥</p>
<blockquote>
<ul>
<li>객체지향언어(Object-Oriented Language, OOL)는 프로그래밍의 한 패러다임으로, 데이터와 함수를 객체로 캡슐화하여 소프트웨어의 설계와 구현을 단순화하는 것을 목표로 한다. </li>
<li>객체지향 프로그래밍(Object-Oriented Programming, OOP)은 프로그램을 객체의 집합으로 모델링하여, 프로그램의 구조와 동작을 이해하고 관리하기 쉽게 만든다.</li>
</ul>
</blockquote>
<p><img src="https://velog.velcdn.com/images/seong_li/post/5c4d07be-f246-4515-9c3a-510e9cefd419/image.png" alt=""></p>
<h1 id="객체지향언어">객체지향언어</h1>
<ul>
<li>객체지향언어는 객체의 개념을 기반으로 하는 프로그래밍 언어이다.<blockquote>
<p>객체는 데이터(속성)와 그 데이터를 처리하는 함수(메소드)를 하나의 단위로 묶은 것이다.</p>
<ul>
<li>클래스라는 구조를 통해 객체의 틀을 정의하고, 이 클래스를 기반으로 객체(인스턴스)를 생성하여 프로그램을 구성한다.</li>
</ul>
</blockquote>
</li>
</ul>
<h2 id="특징">특징</h2>
<h3 id="캡슐화encapsulation">캡슐화(Encapsulation)</h3>
<ul>
<li><p>캡슐화는 객체의 데이터(속성)와 이 데이터를 조작하는 메소드(함수)를 결합하여 하나의 단위, 즉 &#39;클래스&#39;로 묶는 것이다.</p>
</li>
<li><p>이 과정에서 중요한 것은, 객체의 세부 구현을 외부에서 직접 접근할 수 없도록 숨기고(은닉), 필요한 정보나 기능만을 외부에 공개하는 것것(인터페이스 제공). </p>
<blockquote>
<p>ex) 자동차 객체를 생각해보면, 엔진의 세부 사항을 직접 조작하기보다는, 가속하거나 멈추는 행위를 메소드로 제공하여 안전하게 차를 운전할 수 있게 한다다.</p>
</blockquote>
</li>
</ul>
<h3 id="상속inheritance">상속(Inheritance)</h3>
<ul>
<li><p>상속은 기존 클래스(부모 클래스)의 속성과 메소드를 새로운 클래스(자식 클래스)가 물려받아 사용할 수 있게 하는 메커니즘이다.</p>
</li>
<li><p>이를 통해 코드의 재사용성을 높이고, 유지보수의 편리성을 제공한다. </p>
<blockquote>
<p>ex) &#39;동물&#39; 클래스에는 &#39;먹기&#39;와 &#39;움직이기&#39; 같은 기본적인 메소드가 정의되어 있고, &#39;고양이&#39; 클래스는 &#39;동물&#39; 클래스로부터 이 메소드들을 상속받아 추가적인 기능(예: &#39;야옹 울기&#39;)을 구현할 수 있다.</p>
</blockquote>
</li>
</ul>
<h3 id="다형성polymorphism">다형성(Polymorphism)</h3>
<ul>
<li>다형성은 같은 이름의 메소드가 서로 다른 클래스에서 다른 작업을 수행할 수 있도록 하는 기능이다. </li>
<li>다형성을 통해 프로그램의 유연성을 증가시킬 수 있다.<blockquote>
<p>ex) &#39;그리기&#39; 메소드가 &#39;원&#39;, &#39;사각형&#39;, &#39;삼각형&#39; 클래스에 각각 구현되어 있을 때, &#39;그리기&#39; 메소드를 호출하면 각 객체의 형태에 맞는 그림을 그리게 된다. 이는 같은 인터페이스를 통해 다양한 방식의 실행을 가능하게 한다. <br>
ex)  &quot;소리내기&quot;라는 동일한 메소드를 가진 여러 동물 객체(개, 고양이, 새)가 있을 때, 각 동물은 &quot;멍멍&quot;, &quot;야옹&quot;, &quot;짹짹&quot;처럼 자신만의 고유한 소리를 낼 수 있다. 이렇게 하나의 메소드가 여러 형태로 구현되는 것이다.</p>
</blockquote>
</li>
</ul>
<h3 id="추상화abstraction">추상화(Abstraction)</h3>
<ul>
<li>추상화는 복잡한 실제 세계의 상황을 단순화하여 모델링하는 과정에서, 필요한 핵심적인 특성만을 추출하여 프로그램에 반영하는 것이다. </li>
<li>이를 통해 불필요한 세부 사항을 제거하여 복잡도를 관리할 수 있다. <blockquote>
<p>ex) &#39;은행 계좌&#39; 객체를 설계할 때, 계좌의 &#39;잔액 조회&#39;, &#39;입금&#39;, &#39;출금&#39; 같은 핵심 기능만을 포함시키고, 계좌의 내부 구조나 처리 방법은 숨긴다.</p>
</blockquote>
</li>
</ul>
<h2 id="장점">장점</h2>
<h3 id="재사용성">재사용성</h3>
<ul>
<li>객체와 클래스를 재사용함으로써 개발 시간을 단축하고 효율성을 높일 수 있다. 코드의 중복을 줄이고, 이미 검증된 객체를 사용하여 신뢰성을 향상시킬 수 있다.</li>
</ul>
<h3 id="유지보수성">유지보수성</h3>
<ul>
<li>코드의 수정이 필요할 때, 해당 객체만을 수정하면 되므로 다른 부분에 미치는 영향을 최소화할 수 있다.</li>
</ul>
<h3 id="확장성">확장성</h3>
<ul>
<li>새로운 기능이 필요할 때, 기존의 코드를 쉽게 확장할 수 있다. 상속과 다형성을 활용하여 기존의 기능을 유지하면서 새로운 기능을 추가할 수 있다.</li>
</ul>
<h3 id="모듈성">모듈성</h3>
<ul>
<li>프로그램을 독립적인 객체로 나누어 개발할 수 있어, 개발 과정에서 복잡도를 관리하기 쉽다. 팀 내에서 작업을 분할하고, 병렬 개발을 용이하게 한다.</li>
</ul>
<h2 id="단점">단점</h2>
<h3 id="실행-속도">실행 속도</h3>
<ul>
<li>객체지향 프로그램은 때때로 절차 지향 프로그램에 비해 실행 속도가 느릴 수 있다. 객체 간의 상호작용과 다형성 처리가 추가적인 처리 시간을 요구할 수 있다.<blockquote>
<p>객체지향 프로그래밍은 데이터와 기능을 객체로 묶어 관리하는 반면, 절차 지향 프로그래밍은 프로그램을 함수의 집합으로 보고 순차적으로 실행하는 접근 방식</p>
</blockquote>
</li>
</ul>
<h3 id="메모리-사용">메모리 사용</h3>
<ul>
<li>객체지향 프로그래밍은 객체를 많이 사용하기 때문에, 절차 지향 프로그래밍에 비해 더 많은 메모리를 사용할 수 있다. 각 객체의 속성과 메소드 정보를 저장해야 하기 때문.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algo-Challenge]]]></title>
            <link>https://velog.io/@seong_li/Algo-Challenge-20240202</link>
            <guid>https://velog.io/@seong_li/Algo-Challenge-20240202</guid>
            <pubDate>Fri, 02 Feb 2024 02:56:54 GMT</pubDate>
            <description><![CDATA[<h1 id="sql--level-4-우유와-요거트가-담긴-장바구니---62284">[SQL : level 4] 우유와 요거트가 담긴 장바구니 - 62284</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/62284">문제 링크</a> </p>
<h3 id="문제-설명">문제 설명</h3>
<p><code>CART_PRODUCTS</code> 테이블은 장바구니에 담긴 상품 정보를 담은 테이블입니다. <code>CART_PRODUCTS</code> 테이블의 구조는 다음과 같으며, <code>ID</code>, <code>CART_ID</code>, <code>NAME</code>, <code>PRICE</code>는 각각 테이블의 아이디, 장바구니의 아이디, 상품 종류, 가격을 나타냅니다.</p>
<table class="table">
        <thead><tr>
<th>NAME</th>
<th>TYPE</th>
</tr>
</thead>
        <tbody><tr>
<td>ID</td>
<td>INT</td>
</tr>
<tr>
<td>CART_ID</td>
<td>INT</td>
</tr>
<tr>
<td>NAME</td>
<td>VARCHAR</td>
</tr>
<tr>
<td>PRICE</td>
<td>INT</td>
</tr>
</tbody>
      </table>
<p>데이터 분석 팀에서는 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니가 있는지 알아보려 합니다. 우유와 요거트를 동시에 구입한 장바구니의 아이디를 조회하는 SQL 문을 작성해주세요. 이때 결과는 장바구니의 아이디 순으로 나와야 합니다.</p>

<h5>예시</h5>

<p>예를 들어 <code>CART_PRODUCTS</code> 테이블이 다음과 같다면</p>

<p><code>CART_PRODUCTS</code> 테이블</p>
<table class="table">
        <thead><tr>
<th>ID</th>
<th>CART_ID</th>
<th>NAME</th>
<th>PRICE</th>
</tr>
</thead>
        <tbody><tr>
<td>1630</td>
<td>83</td>
<td>Cereal</td>
<td>3980</td>
</tr>
<tr>
<td>1631</td>
<td>83</td>
<td>Multipurpose Supply</td>
<td>3900</td>
</tr>
<tr>
<td>5491</td>
<td>286</td>
<td>Yogurt</td>
<td>2980</td>
</tr>
<tr>
<td>5504</td>
<td>286</td>
<td>Milk</td>
<td>1880</td>
</tr>
<tr>
<td>8435</td>
<td>448</td>
<td>Milk</td>
<td>1880</td>
</tr>
<tr>
<td>8437</td>
<td>448</td>
<td>Yogurt</td>
<td>2980</td>
</tr>
<tr>
<td>8438</td>
<td>448</td>
<td>Tea</td>
<td>11000</td>
</tr>
<tr>
<td>20236</td>
<td>1034</td>
<td>Yogurt</td>
<td>2980</td>
</tr>
<tr>
<td>20237</td>
<td>1034</td>
<td>Butter</td>
<td>4890</td>
</tr>
</tbody>
      </table>
<ul>
<li>83번 장바구니에는 Milk와 Yogurt가 모두 없습니다.</li>
<li>286번 장바구니에는 Milk와 Yogurt가 모두 있습니다.</li>
<li>448번 장바구니에는 Milk와 Yogurt가 모두 있습니다.</li>
<li>1034번 장바구니에는 Milk는 없고 Yogurt만 있습니다.</li>
</ul>

<p>따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.</p>
<table class="table">
        <thead><tr>
<th>CART_ID</th>
</tr>
</thead>
        <tbody><tr>
<td>286</td>
</tr>
<tr>
<td>448</td>
</tr>
</tbody>
      </table>

<hr>

<h3 id="my-code">My Code</h3>
<pre><code>-- 우유(Milk)와 요거트(Yogurt)를 동시에 구입한 장바구니 아이디를 조회
-- 아이디를 ASC 순서

SELECT DISTINCT(CART_ID) AS CART_ID
FROM CART_PRODUCTS
WHERE CART_ID IN (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = &quot;Milk&quot;
    ) 
    AND CART_ID IN (
    SELECT CART_ID
    FROM CART_PRODUCTS
    WHERE NAME = &quot;Yogurt&quot;
    )
ORDER BY CART_ID ASC
;</code></pre><h3 id="other-code">Other Code</h3>
<pre><code>SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN (&#39;Milk&#39;, &#39;Yogurt&#39;)
GROUP BY CART_ID
HAVING COUNT(DISTINCT(NAME)) &gt;= 2
ORDER BY CART_ID ASC
;</code></pre><hr><hr>

<h1 id="java--level-2-무인도-여행---154540">[JAVA : level 2] 무인도 여행 - 154540</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/154540?language=java">문제 링크</a></p>
<h3 id="문제-설명-1">문제 설명</h3>
<p>메리는 여름을 맞아 무인도로 여행을 가기 위해 지도를 보고 있습니다. 지도에는 바다와 무인도들에 대한 정보가 표시돼 있습니다. 지도는 1 x 1크기의 사각형들로 이루어진 직사각형 격자 형태이며, 격자의 각 칸에는 'X' 또는 1에서 9 사이의 자연수가 적혀있습니다. 지도의 'X'는 바다를 나타내며, 숫자는 무인도를 나타냅니다. 이때, 상, 하, 좌, 우로 연결되는 땅들은 하나의 무인도를 이룹니다. 지도의 각 칸에 적힌 숫자는 식량을 나타내는데, 상, 하, 좌, 우로 연결되는 칸에 적힌 숫자를 모두 합한 값은 해당 무인도에서 최대 며칠동안 머물 수 있는지를 나타냅니다. 어떤 섬으로 놀러 갈지 못 정한 메리는 우선 각 섬에서 최대 며칠씩 머물 수 있는지 알아본 후 놀러갈 섬을 결정하려 합니다.</p>

<p>지도를 나타내는 문자열 배열 <code>maps</code>가 매개변수로 주어질 때, 각 섬에서 최대 며칠씩 머무를 수 있는지 배열에 오름차순으로 담아 return 하는 solution 함수를 완성해주세요. 만약 지낼 수 있는 무인도가 없다면 -1을 배열에 담아 return 해주세요.</p>

<hr>

<h5>제한사항</h5>

<ul>
<li>3 ≤ <code>maps</code>의 길이 ≤ 100

<ul>
<li>3 ≤ <code>maps[i]</code>의 길이 ≤ 100</li>
<li><code>maps[i]</code>는 'X' 또는 1 과 9 사이의 자연수로 이루어진 문자열입니다.</li>
<li>지도는 직사각형 형태입니다.</li>
</ul></li>
</ul>

<hr>

<h5>입출력 예</h5>
<table class="table">
        <thead><tr>
<th>maps</th>
<th>result</th>
</tr>
</thead>
        <tbody><tr>
<td>["X591X","X1X5X","X231X", "1XXX1"]</td>
<td>[1, 1, 27]</td>
</tr>
<tr>
<td>["XXX","XXX","XXX"]</td>
<td>[-1]</td>
</tr>
</tbody>
      </table>
<hr>

<h5>입출력 예 설명</h5>

<p>입출력 예 #1</p>

<p>위 문자열은 다음과 같은 지도를 나타냅니다.</p>

<p><img src="https://user-images.githubusercontent.com/62426665/206862823-4633fbf1-c075-4d35-b577-26f504dcd332.png" title="" alt="image1"></p>

<p>연결된 땅들의 값을 합치면 다음과 같으며</p>

<p><img src="https://user-images.githubusercontent.com/62426665/209070615-ae568f20-cf06-4f88-8d4f-8e9861af2d36.png" title="" alt="image2"></p>

<p>이를 오름차순으로 정렬하면 [1, 1, 27]이 됩니다.</p>

<p>입출력 예 #2</p>

<p>위 문자열은 다음과 같은 지도를 나타냅니다.</p>

<p><img src="https://user-images.githubusercontent.com/62426665/206863265-0a371c69-d4b5-411a-972f-bdc36b90c917.png" title="" alt="image3"></p>

<p>섬이 존재하지 않기 때문에 -1을 배열에 담아 반환합니다.</p>


<h3 id="my-code-1">My Code</h3>
<pre><code>import java.util.*;
class Solution {
    public static int row_len ;
    public static int col_len ;
    public static String[][] new_map;
    public static boolean[][] visited;
    public static int[] dr = {-1, 1, 0, 0};
    public static int[] dc = {0, 0, -1, 1};
    public static LinkedList&lt;Integer&gt; list = new LinkedList&lt;&gt;();

    public int[] solution(String[] maps) {
        row_len = maps.length;
        col_len = maps[0].length();

        new_map = new String[row_len][col_len];
        visited = new boolean[row_len][col_len];

        for(int i = 0 ; i &lt; maps.length ; i++){

            String[] temp = maps[i].split(&quot;&quot;);
            for(int j = 0 ; j &lt; temp.length ; j++){
                new_map[i][j] = temp[j];
            }
        }

        for(int i = 0 ; i &lt; row_len ; i++){
            for(int j = 0 ; j &lt; col_len ; j++){
                if(new_map[i][j].equals(&quot;X&quot;) || visited[i][j]) continue;
                int sum = bfs(i, j);
                list.add(sum);
            }
        }

        int size = list.size();
        if(size == 0) return new int[]{-1};
        int[] result = new int[size];
        for(int i = 0 ; i &lt; size ; i++){
            result[i] = list.poll();
        }
        Arrays.sort(result);
        return result;



    } // solution 끝

    public static int bfs(int row, int col){
        Queue&lt;Integer&gt; q_row = new LinkedList&lt;&gt;();
        Queue&lt;Integer&gt; q_col = new LinkedList&lt;&gt;();

        q_row.add(row);
        q_col.add(col);
        int sum = Integer.parseInt(new_map[row][col]);
        visited[row][col] = true;

        while(!q_row.isEmpty()){
            int temp_row = q_row.poll();
            int temp_col = q_col.poll();

            for(int dir = 0 ; dir &lt; 4 ; dir++){
                int nr = temp_row + dr[dir];
                int nc = temp_col + dc[dir];
                // 예외 처리
                if(nr &lt; 0 || nc &lt; 0 || nr &gt;= row_len || nc &gt;= col_len ) continue;
                if(new_map[nr][nc].equals(&quot;X&quot;) || visited[nr][nc]) continue;

                visited[nr][nc] = true;
                sum += Integer.parseInt(new_map[nr][nc]);

                q_row.add(nr);
                q_col.add(nc);
            }
        }

        return sum;

    }

}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-Challenge : 세션/쿠키/캐시]]]></title>
            <link>https://velog.io/@seong_li/CS-Challenge-20240201</link>
            <guid>https://velog.io/@seong_li/CS-Challenge-20240201</guid>
            <pubDate>Thu, 01 Feb 2024 04:09:00 GMT</pubDate>
            <description><![CDATA[<p>:) [ 세션 ]과 [ 쿠키 ]와 [ 캐시 ]에 대해 설명할게욥</p>
<blockquote>
<ul>
<li>세션과 쿠키가 사용자의 정보나 상태를 저장하는 데 초점을 맞춘 반면, 캐시는 주로 성능 향상을 목적으로 데이터를 저장한다.</li>
<li>목적의 차이: 쿠키와 세션은 주로 사용자 인증, 사용자 설정 저장, 사용자 상태 관리 등에 사용되며, 캐시는 성능 향상과 빠른 데이터 접근을 위해 사용된다.</li>
</ul>
</blockquote>
<p><img src="https://velog.velcdn.com/images/seong_li/post/25fea415-6a5b-4c72-945b-027f782e3996/image.png" alt=""></p>
<h1 id="세션session-vs-쿠키cookie-캐시cache">세션(Session) vs 쿠키(Cookie), 캐시(Cache)</h1>
<p><img src="https://velog.velcdn.com/images/seong_li/post/a18d26de-2e9b-4a62-8e1a-e62e994e4bd0/image.png" alt=""></p>
<h2 id="쿠키cookie">쿠키(Cookie)</h2>
<h3 id="정의">정의</h3>
<ul>
<li>웹사이트가 사용자의 브라우저에 저장하는 작은 데이터 조각으로, 사용자가 웹사이트에 재방문하였을 때 이전 상태를 기억하게 해준다.</li>
</ul>
<h3 id="특징">특징</h3>
<ul>
<li><p>저장 위치: 쿠키는 사용자의 디바이스에 있는 클라이언트(브라우저)에 저장된다.</p>
</li>
<li><p>용도: 주로 사용자의 로그인 정보, 사이트 선호도, 장바구니의 내용 등과 같이 개인화된 사용자 경험을 제공하기 위해 사용된다.</p>
</li>
<li><p>만료 기간 설정: 쿠키에는 만료 날짜가 설정될 수 있으며, 이를 통해 쿠키가 언제 삭제될지 결정된다. </p>
<blockquote>
<ul>
<li>자동 만료: 일반적으로 세션은 사용자가 브라우저를 닫거나 서버에서 설정한 일정 시간 동안 활동이 없을 경우 자동으로 만료된다. 이 시간 제한은 서버에서 설정하며 &quot;세션 타임아웃&quot;이라고 한다.</li>
<li>서버 측 설정: 세션 만료는 서버 측에서 관리되므로, 웹 애플리케이션의 필요에 따라 세션 타임아웃을 조정할 수 있다.</li>
</ul>
</blockquote>
</li>
<li><p>크기 제한: 쿠키는 크기에 제한이 있다. 대부분의 브라우저에서는 쿠키당 4KB의 크기 제한을 두고 있다.</p>
</li>
</ul>
<h3 id="장점">장점</h3>
<ul>
<li><p>서버 부담 감소: 사용자 정보를 클라이언트 측에서 관리함으로써 서버의 부하를 줄일 수 있다.</p>
</li>
<li><p>향상된 사용자 경험: 사용자의 선호도와 설정을 기억함으로써 <strong>맞춤형 사용자 경험</strong>을 제공할 수 있다. 예를 들어, 웹사이트 언어 설정, 로그인 상태 유지 등이 이에 해당한다.</p>
</li>
</ul>
<h3 id="단점">단점</h3>
<ul>
<li><p>보안 취약성: 쿠키는 보안에 취약할 수 있다. 특히, 쿠키에 민감한 정보를 저장하는 경우, 암호화하지 않으면 제3자에 의해 정보가 쉽게 접근될 수 있다.</p>
</li>
<li><p>브라우저 호환성과 설정 문제: 일부 사용자는 쿠키를 비활성화할 수 있다. 이 경우, 쿠키를 필요로 하는 웹사이트의 기능이 제대로 작동하지 않을 수 있다.</p>
</li>
</ul>
<h2 id="세션session">세션(Session)</h2>
<h3 id="정의-1">정의</h3>
<ul>
<li><p>서버 기반의 사용자 상태 저장: 세션은 서버에서 사용자의 상태를 저장하는 방법이다. 사용자가 웹사이트에 로그인하거나 특정 작업을 수행할 때, 서버는 이 정보를 세션에 저장하여 사용자가 웹사이트를 탐색하는 동안 이를 유지한다.</p>
</li>
<li><p>유일한 세션 ID: 각 사용자는 고유한 세션 ID를 가진다. 이 ID는 사용자가 서버와 상호 작용할 때마다 사용되어 사용자를 식별한다.</p>
</li>
</ul>
<h3 id="특징-1">특징</h3>
<ul>
<li><p>저장 위치: 세션 정보는 서버에 저장된다. 이는 쿠키와 달리 클라이언트 측이 아닌 서버 측에서 관리된다는 것을 의미한다.</p>
</li>
<li><p>보안성: 세션은 쿠키에 비해 더 안전하다. 세션 데이터는 서버에 저장되기 때문에 클라이언트 측의 조작이나 접근으로부터 보호된다.</p>
</li>
<li><p>만료 시점: 일반적으로 세션은 사용자가 브라우저를 닫거나 일정 시간 동안 활동이 없을 때 만료된다. 서버 측에서 세션의 만료 시간을 설정할 수도 있다.</p>
<blockquote>
<p>만료 기간 설정 : 쿠키는 생성 시 &quot;만료 날짜&quot;를 설정할 수 있다. 이 날짜가 지나면 쿠키가 자동으로 만료된다.
설정하지 않은 경우 브라우저 세션 쿠키가 되며, 브라우저가 닫힐 때 만료된다.
브라우저 세션 쿠키와 영구 쿠키:</p>
<ul>
<li>브라우저 세션 쿠키: 명시적인 만료 날짜가 없는 쿠키로, 브라우저가 닫힐 때 만료된다.</li>
<li>영구 쿠키: 만료 날짜가 설정된 쿠키로, 설정된 날짜까지 브라우저에 저장된다.</li>
</ul>
</blockquote>
</li>
<li><p>데이터 저장 용량: 세션은 쿠키보다 더 많은 양의 데이터를 저장할 수 있다. 이는 서버의 메모리에 의존적이다.</p>
</li>
</ul>
<h3 id="장점-1">장점</h3>
<ul>
<li><p>보안 강화: 중요한 정보(로그인 정보, 사용자의 개인 설정 등)를 서버에 저장함으로써 보안을 강화할 수 있다.</p>
</li>
<li><p>사용자별 데이터 관리: 각 사용자에게 고유한 세션을 할당함으로써 개별 사용자에 맞는 데이터 관리가 가능하다.</p>
</li>
</ul>
<h3 id="단점-1">단점</h3>
<ul>
<li><p>서버 부하 증가: 모든 세션 데이터가 서버에 저장되므로, 많은 사용자가 접속하는 웹사이트의 경우 서버의 부하가 증가할 수 있다.</p>
</li>
<li><p>리소스 관리 필요: 세션의 수와 크기에 따라 서버의 리소스를 효율적으로 관리해야 한다. 세션 데이터가 많을 경우, 서버의 메모리 사용량이 증가한다.</p>
</li>
</ul>
<h2 id="캐시cache">캐시(Cache)</h2>
<h3 id="정의-2">정의</h3>
<ul>
<li><p>데이터 저장소: 캐시는 자주 사용되는 데이터를 임시로 저장하는 저장소.
웹 콘텐츠, 이미지, 비디오, 스크립트 등을 포함할 수 있으며, 이 데이터는 빠른 재접근을 위해 저장된다.</p>
</li>
<li><p>효율적인 데이터 접근: 캐시의 주 목적은 웹사이트나 애플리케이션의 성능을 향상시키기 위해 데이터 접근 시간을 줄이는 것.</p>
</li>
</ul>
<h3 id="특징-2">특징</h3>
<ul>
<li><p>저장 위치: 캐시는 클라이언트 측(예: 웹 브라우저), 서버 측, 그리고 네트워크 장비(예: CDN)에 저장될 수 있다.</p>
</li>
<li><p>데이터 유형: HTML 페이지, CSS 스타일시트, 자바스크립트 파일, 이미지 및 미디어 파일 등 다양한 유형의 데이터가 캐시될 수 있다.</p>
</li>
<li><p>만료 정책: 캐시된 데이터는 일반적으로 만료 시간이 설정되어 있으며, 이 시간이 지나면 캐시에서 제거되거나 갱신된다.</p>
</li>
</ul>
<h3 id="장점-2">장점</h3>
<ul>
<li><p>성능 향상: 데이터를 빠르게 로드함으로써 웹사이트의 로딩 시간을 줄일 수 있다.</p>
</li>
<li><p>대역폭 절약: 자주 사용되는 데이터를 로컬에 저장함으로써 네트워크 트래픽을 줄이고 대역폭을 절약할 수 있다.</p>
</li>
<li><p>서버 부하 감소: 서버에 요청하는 횟수가 줄어들면서 서버의 부하가 감소한다.</p>
</li>
</ul>
<h3 id="단점-2">단점</h3>
<ul>
<li>최신 데이터 문제: 캐시된 데이터가 최신 상태가 아닐 수 있어 사용자가 구버전의 데이터를 볼 수 있다.</li>
<li>리소스 관리: 캐시된 데이터가 많아지면, 특히 브라우저나 클라이언트 측에서 시스템 리소스를 많이 사용할 수 있다.</li>
<li>관리 필요성: 캐시된 데이터의 만료 및 갱신에 대한 관리가 필요하다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Algo-Challenge]]]></title>
            <link>https://velog.io/@seong_li/Algo-Challenge-20240201</link>
            <guid>https://velog.io/@seong_li/Algo-Challenge-20240201</guid>
            <pubDate>Thu, 01 Feb 2024 02:25:26 GMT</pubDate>
            <description><![CDATA[<h1 id="sql--level-3-없어진-기록-찾기---59042">[SQL : level 3] 없어진 기록 찾기 - 59042</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/59042">문제 링크</a> </p>
<h3 id="문제-설명">문제 설명</h3>
<p><code>ANIMAL_INS</code> 테이블은 동물 보호소에 들어온 동물의 정보를 담은 테이블입니다. <code>ANIMAL_INS</code> 테이블 구조는 다음과 같으며, <code>ANIMAL_ID</code>, <code>ANIMAL_TYPE</code>, <code>DATETIME</code>, <code>INTAKE_CONDITION</code>, <code>NAME</code>, <code>SEX_UPON_INTAKE</code>는 각각 동물의 아이디, 생물 종, 보호 시작일, 보호 시작 시 상태, 이름, 성별 및 중성화 여부를 나타냅니다.</p>
<table class="table">
        <thead><tr>
<th>NAME</th>
<th>TYPE</th>
<th>NULLABLE</th>
</tr>
</thead>
        <tbody><tr>
<td>ANIMAL_ID</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>ANIMAL_TYPE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>DATETIME</td>
<td>DATETIME</td>
<td>FALSE</td>
</tr>
<tr>
<td>INTAKE_CONDITION</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>NAME</td>
<td>VARCHAR(N)</td>
<td>TRUE</td>
</tr>
<tr>
<td>SEX_UPON_INTAKE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
</tbody>
      </table>
<p><code>ANIMAL_OUTS</code> 테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. <code>ANIMAL_OUTS</code> 테이블 구조는 다음과 같으며, <code>ANIMAL_ID</code>, <code>ANIMAL_TYPE</code>, <code>DATETIME</code>, <code>NAME</code>, <code>SEX_UPON_OUTCOME</code>는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다. <code>ANIMAL_OUTS</code> 테이블의 <code>ANIMAL_ID</code>는 <code>ANIMAL_INS</code>의 <code>ANIMAL_ID</code>의 외래 키입니다.</p>
<table class="table">
        <thead><tr>
<th>NAME</th>
<th>TYPE</th>
<th>NULLABLE</th>
</tr>
</thead>
        <tbody><tr>
<td>ANIMAL_ID</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>ANIMAL_TYPE</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
<tr>
<td>DATETIME</td>
<td>DATETIME</td>
<td>FALSE</td>
</tr>
<tr>
<td>NAME</td>
<td>VARCHAR(N)</td>
<td>TRUE</td>
</tr>
<tr>
<td>SEX_UPON_OUTCOME</td>
<td>VARCHAR(N)</td>
<td>FALSE</td>
</tr>
</tbody>
      </table>
<p>천재지변으로 인해 일부 데이터가 유실되었습니다. 입양을 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물의 ID와 이름을 ID 순으로 조회하는 SQL문을 작성해주세요. </p>

<h5>예시</h5>

<p>예를 들어, <code>ANIMAL_INS</code> 테이블과 <code>ANIMAL_OUTS</code> 테이블이 다음과 같다면</p>

<p><code>ANIMAL_INS</code></p>
<table class="table">
        <thead><tr>
<th>ANIMAL_ID</th>
<th>ANIMAL_TYPE</th>
<th>DATETIME</th>
<th>INTAKE_CONDITION</th>
<th>NAME</th>
<th>SEX_UPON_INTAKE</th>
</tr>
</thead>
        <tbody><tr>
<td>A352713</td>
<td>Cat</td>
<td>2017-04-13 16:29:00</td>
<td>Normal</td>
<td>Gia</td>
<td>Spayed Female</td>
</tr>
<tr>
<td>A350375</td>
<td>Cat</td>
<td>2017-03-06 15:01:00</td>
<td>Normal</td>
<td>Meo</td>
<td>Neutered Male</td>
</tr>
</tbody>
      </table>
<p><code>ANIMAL_OUTS</code></p>
<table class="table">
        <thead><tr>
<th>ANIMAL_ID</th>
<th>ANIMAL_TYPE</th>
<th>DATETIME</th>
<th>NAME</th>
<th>SEX_UPON_OUTCOME</th>
</tr>
</thead>
        <tbody><tr>
<td>A349733</td>
<td>Dog</td>
<td>2017-09-27 19:09:00</td>
<td>Allie</td>
<td>Spayed Female</td>
</tr>
<tr>
<td>A352713</td>
<td>Cat</td>
<td>2017-04-25 12:25:00</td>
<td>Gia</td>
<td>Spayed Female</td>
</tr>
<tr>
<td>A349990</td>
<td>Cat</td>
<td>2018-02-02 14:18:00</td>
<td>Spice</td>
<td>Spayed Female</td>
</tr>
</tbody>
      </table>
<p><code>ANIMAL_OUTS</code> 테이블에서</p>

<ul>
<li>Allie의 ID는 <code>ANIMAL_INS</code>에 없으므로, Allie의 데이터는 유실되었습니다.</li>
<li>Gia의 ID는 <code>ANIMAL_INS</code>에 있으므로, Gia의 데이터는 유실되지 않았습니다.</li>
<li>Spice의 ID는 <code>ANIMAL_INS</code>에 없으므로, Spice의 데이터는 유실되었습니다.</li>
</ul>

<p>따라서 SQL문을 실행하면 다음과 같이 나와야 합니다. </p>
<table class="table">
        <thead><tr>
<th>ANIMAL_ID</th>
<th>NAME</th>
</tr>
</thead>
        <tbody><tr>
<td>A349733</td>
<td>Allie</td>
</tr>
<tr>
<td>A349990</td>
<td>Spice</td>
</tr>
</tbody>
      </table>
<hr>

<h3 id="my-code">My Code</h3>
<pre><code>-- 입양 간 기록은 있는데, 보호소에 들어온 기록이 없는 동물
-- 동물의 ID와 이름을, ID ASC 조회

SELECT ANIMAL_ID, NAME
FROM ANIMAL_OUTS
WHERE ANIMAL_ID NOT IN (
    SELECT ANIMAL_ID
    FROM ANIMAL_INS
)
ORDER BY ANIMAL_ID ASC
;</code></pre><hr><hr>

<h1 id="java--level-2-숫자-변환하기---154538">[JAVA : level 2] 숫자 변환하기 - 154538</h1>
<p><a href="https://school.programmers.co.kr/learn/courses/30/lessons/154538?language=java">문제 링크</a> </p>
<h3 id="문제-설명-1">문제 설명</h3>
<p>자연수 <code>x</code>를 <code>y</code>로 변환하려고 합니다. 사용할 수 있는 연산은 다음과 같습니다.</p>

<ul>
<li><code>x</code>에 <code>n</code>을 더합니다</li>
<li><code>x</code>에 2를 곱합니다.</li>
<li><code>x</code>에 3을 곱합니다.</li>
</ul>

<p>자연수 <code>x</code>, <code>y</code>, <code>n</code>이 매개변수로 주어질 때, <code>x</code>를 <code>y</code>로 변환하기 위해 필요한 최소 연산 횟수를 return하도록 solution 함수를 완성해주세요. 이때 <code>x</code>를 <code>y</code>로 만들 수 없다면 -1을 return 해주세요.</p>

<hr>

<h5>제한사항</h5>

<ul>
<li>1&nbsp;≤&nbsp;<code>x</code> ≤ <code>y</code>&nbsp;≤ 1,000,000</li>
<li>1 ≤ <code>n</code> &lt; <code>y</code></li>
</ul>

<hr>

<h5>입출력 예</h5>
<table class="table">
        <thead><tr>
<th>x</th>
<th>y</th>
<th>n</th>
<th>result</th>
</tr>
</thead>
        <tbody><tr>
<td>10</td>
<td>40</td>
<td>5</td>
<td>2</td>
</tr>
<tr>
<td>10</td>
<td>40</td>
<td>30</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>5</td>
<td>4</td>
<td>-1</td>
</tr>
</tbody>
      </table>
<hr>

<h5>입출력 예 설명</h5>

<p>입출력 예 #1<br>
<code>x</code>에 2를 2번 곱하면 40이 되고 이때가 최소 횟수입니다.</p>

<p>입출력 예 #2<br>
<code>x</code>에 <code>n</code>인 30을 1번 더하면 40이 되고 이때가 최소 횟수입니다.</p>

<p>입출력 예 #3<br>
<code>x</code>를 <code>y</code>로 변환할 수 없기 때문에 -1을 return합니다.</p>
<hr>

<h3 id="wrong-code-50">Wrong Code (50%)</h3>
<pre><code>class Solution {
    public static int temp_cnt;

    public int solution(int x, int y, int n) {
        temp_cnt = 123456789;
        int cnt = 0;
        int value = x;
        func(value, x, y, n, cnt);

        if(temp_cnt == 123456789) return -1;
        else return temp_cnt;
    }

    public static void func(int value, int x, int y, int n, int cnt){
        if(value == y){
            if(temp_cnt &gt; cnt){
                temp_cnt = cnt;
            }
            return;
        } else if (value &gt; y) return;

        // func_1
        func(value + n, x, y, n, cnt + 1);

        // func_2
        func(value * 2, x, y, n, cnt + 1);

        // func_3
        func(value * 3, x, y, n, cnt + 1);
    }
}</code></pre><pre><code>import java.util.*;
class Solution {
    public static int temp_cnt;
    public static LinkedList&lt;Integer&gt; list ;

    public int solution(int x, int y, int n) {
        list = new LinkedList&lt;&gt;();
        int cnt = 0;
        int value = x;
        func(value, x, y, n, cnt);

        if(list.size() == 0 ) return -1;
        else return Collections.min(list);
    }

    public static void func(int value, int x, int y, int n, int cnt){
        if(value == y){
            list.add(cnt);
            return;
        } else if (value &gt; y) return;

        // func_1
        func(value + n, x, y, n, cnt + 1);

        // func_2
        func(value * 2, x, y, n, cnt + 1);

        // func_3
        func(value * 3, x, y, n, cnt + 1);
    }
}</code></pre><h3 id="answer-code-dp">Answer Code (Dp)</h3>
<pre><code>class Solution {
    public int solution(int x, int y, int n) {
        int[] dp = new int[y+1];

        for(int index = x ; index &lt;= y ; index++){
            // 처음 x만 0으로 시작, 이후에 0이면 Max값 넣어서 제외해버려~
            if(index != x &amp;&amp; dp[index] == 0){
                dp[index] = Integer.MAX_VALUE;
                continue; // 돌아가~
            }

            if(index + n &lt;= y){
                dp[index+n] = dp[index+n] == 0 ? dp[index] + 1 : Math.min(dp[index] + 1, dp[index+n]);
            }
            if(index * 2 &lt;= y){
                dp[index*2] = dp[index*2] == 0 ? dp[index] + 1 : Math.min(dp[index] + 1, dp[index*2]);
            }
            if(index * 3 &lt;= y){
                dp[index*3] = dp[index*3] == 0 ? dp[index] + 1 : Math.min(dp[index] + 1, dp[index*3]);
            }

        }

        if(dp[y] == Integer.MAX_VALUE) return -1;
        return dp[y];

    }
}</code></pre><h3 id="other-code-bfs">Other Code (BFS)</h3>
<pre><code>import java.util.Queue;
import java.util.LinkedList;

class Solution {
    public int solution(int x, int y, int n) {
        boolean[] visited = new boolean[y + 1]; // 방문 여부를 체크하는 배열
        Queue&lt;Integer&gt; valuesQueue = new LinkedList&lt;&gt;(); // 숫자를 저장하는 큐
        Queue&lt;Integer&gt; countsQueue = new LinkedList&lt;&gt;(); // 연산 횟수를 저장하는 큐

        // 초기 값과 연산 횟수를 큐에 추가
        valuesQueue.add(x);
        countsQueue.add(0);
        visited[x] = true;

        while (!valuesQueue.isEmpty()) {
            int currentValue = valuesQueue.poll();
            int currentCount = countsQueue.poll();

            if (currentValue == y) {
                return currentCount; // 목표에 도달한 경우
            }

            // 다음에 방문할 숫자들을 큐에 추가
            if (currentValue + n &lt;= y &amp;&amp; !visited[currentValue + n]) {
                valuesQueue.add(currentValue + n);
                countsQueue.add(currentCount + 1);
                visited[currentValue + n] = true;
            }
            if (currentValue * 2 &lt;= y &amp;&amp; !visited[currentValue * 2]) {
                valuesQueue.add(currentValue * 2);
                countsQueue.add(currentCount + 1);
                visited[currentValue * 2] = true;
            }
            if (currentValue * 3 &lt;= y &amp;&amp; !visited[currentValue * 3]) {
                valuesQueue.add(currentValue * 3);
                countsQueue.add(currentCount + 1);
                visited[currentValue * 3] = true;
            }
        }

        return -1; // y에 도달할 수 없는 경우
    }
}</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[[CS-Challenge : HTTP]]]></title>
            <link>https://velog.io/@seong_li/CS-Challenge-20240131</link>
            <guid>https://velog.io/@seong_li/CS-Challenge-20240131</guid>
            <pubDate>Wed, 31 Jan 2024 03:05:09 GMT</pubDate>
            <description><![CDATA[<p>:) HTTP 프로토콜에서 가장 많이 사용되는 두 가지 방식인 GET 방식과 POST 방식의 차이를 설명할게욥</p>
<p><img src="https://velog.velcdn.com/images/seong_li/post/1fc6519d-14d7-487d-a607-d7468c65920e/image.png" alt=""></p>
<h1 id="http란">HTTP란?</h1>
<ul>
<li>우선, HTTP을 간단하게 설명하자면<blockquote>
<p>HTTP는 &quot;HyperText Transfer Protocol&quot;의 약자로, 인터넷에서 데이터를 주고받기 위한 프로토콜(규약)이다. 주로 웹 브라우저와 웹 서버 간에 HTML 문서나 이미지와 같은 리소스를 주고받는 데 사용된다.</p>
</blockquote>
</li>
</ul>
<HR>

<h1 id="get-방식">GET 방식</h1>
<h3 id="정의">정의</h3>
<ul>
<li>GET 방식은 서버에 정보를 요청할 때 사용된다.</li>
</ul>
<h3 id="사용방식">사용방식</h3>
<ul>
<li>URL의 일부로 파라미터를 전송한다. <blockquote>
<p>예를 들어, <a href="http://example.com/?query=test%EC%99%80">http://example.com/?query=test와</a> 같이 URL 끝에 ? 뒤에 파라미터가 붙는다.</p>
</blockquote>
</li>
</ul>
<h3 id="특징">특징</h3>
<ul>
<li><p>데이터가 URL에 노출되기 때문에 사용자나 로그를 통해 쉽게 볼 수 있다.</p>
<blockquote>
<ul>
<li>GET 요청은 URL의 일부로 데이터를 전송한다. 예를 들어, <a href="http://example.com/?search=query%EC%99%80">http://example.com/?search=query와</a> 같이, 검색어 &#39;query&#39;가 URL에 직접 포함된다.
이런 특성 때문에 사용자는 주소창을 통해 전송된 데이터를 직접 볼 수 있고, 브라우저의 히스토리나 서버 로그에도 이 정보가 저장된다.</li>
<li>이는 디버깅에 유리하며, URL 자체를 공유함으로써 동일한 검색 결과나 페이지 상태를 다른 사용자와 쉽게 공유할 수 있게 한다.</li>
</ul>
</blockquote>
</li>
<li><p>보안에 민감한 데이터를 전송하기에는 부적합하다.</p>
<blockquote>
<ul>
<li>데이터가 URL에 노출되므로, 비밀번호나 개인정보와 같은 민감한 정보를 GET 방식으로 전송하는 것은 매우 위험하다. <em><strong>절대 노노 !</strong></em>.</li>
</ul>
</blockquote>
</li>
<li><p>URL 길이 제한이 있기 때문에 전송할 수 있는 데이터 양에 제한이 있다.</p>
<blockquote>
<ul>
<li>대부분의 웹 서버와 브라우저는 URL 길이에 제한을 두고 있다. 이는 대략 2000~8000 문자 사이에서 변할 수 있지만, 환경에 따라 다르다.</li>
<li>긴 쿼리 문자열이나 대량의 데이터를 요청하는 경우에는 POST 방식이 더 적합하다.</li>
</ul>
</blockquote>
</li>
<li><p>캐싱이 가능하여 빠른 성능을 제공한다.</p>
<blockquote>
<ul>
<li>웹 페이지나 이미지와 같은 정적 리소스는 한 번 로드된 후 브라우저 캐시에 저장되어, 같은 리소스에 대한 재요청 시 서버에 다시 요청하지 않고 캐시에서 빠르게 로드할 수 있다.</li>
<li>캐싱은 특히 네트워크 대역폭이 제한적이거나 서버 응답 시간이 중요한 경우에 유용하다.</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="장점">장점</h3>
<ul>
<li><p>간단함과 효율성
GET은 구현이 간단하고 사용하기 쉽다. 웹 페이지에 대한 간단한 요청을 처리하는 데 매우 효율적이다.</p>
</li>
<li><p>캐싱
GET 요청은 캐시될 수 있어, 같은 요청에 대해 빠른 응답을 제공한다. 이는 네트워크 대역폭을 절약하고 서버 부하를 줄인다.</p>
</li>
<li><p>북마크와 공유 용이성
GET 요청은 URL에 데이터가 포함되므로, 사용자가 해당 URL을 북마크하거나 공유하기 쉽다.</p>
</li>
<li><p>브라우저 호환성 및 서버 로깅
거의 모든 웹 브라우저와 서버에서 지원되며, 서버 로그에 요청 URL이 기록되어 디버깅이 용이하다.</p>
</li>
</ul>
<h3 id="단점">단점</h3>
<ul>
<li><p>보안 취약성
GET은 URL에 데이터를 포함시키기 때문에, 보안에 민감한 정보를 전송하는 데 부적합하다. </p>
</li>
<li><p>데이터 크기 제한
URL의 길이에는 제한이 있으므로, GET 방식은 상대적으로 작은 양의 데이터를 전송하는 데 사용된다.</p>
</li>
<li><p>데이터 타입 제한
GET은 주로 문자열 데이터를 전송하는 데 사용되며, 바이너리 데이터 전송에는 적합하지 않다.</p>
</li>
<li><p>캐싱의 단점
캐싱은 장점이기도 하지만, 잘못 구성된 경우 오래된 데이터가 제공될 위험이 있으며, 동적인 컨텐츠에는 적합하지 않을 수 있다.</p>
</li>
</ul>
<HR>

<h1 id="post-방식">POST 방식</h1>
<h3 id="정의-1">정의</h3>
<ul>
<li>POST 방식은 서버에 데이터를 제출할 때 사용된다.</li>
</ul>
<h3 id="사용방식-1">사용방식</h3>
<ul>
<li><p>데이터는 HTTP 메시지의 본문(body)을 통해 전송된다.</p>
<blockquote>
<p>POST 요청 예시 </p>
<ul>
<li>HTML 폼을 통한 데이터 전송  <pre><code></code></pre></li>
</ul>
</blockquote>
<form action="http://example.com/submit" method="post">
  <input type="text" name="username" />
  <input type="password" name="password" />
  <input type="submit" value="Submit" />
</form>  

<blockquote>
<ul>
<li>AJAX를 사용한 데이터 전송<pre><code>fetch(&#39;http://example.com/submit&#39;, {
method: &#39;POST&#39;,
headers: {
  &#39;Content-Type&#39;: &#39;application/json&#39;
},
body: JSON.stringify({username: &#39;user&#39;, password: &#39;pass&#39;})
});</code></pre></li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="특징-1">특징</h3>
<ul>
<li><p>데이터가 URL에 노출되지 않아 GET보다 보안적으로 우수하다.</p>
<blockquote>
<ul>
<li>보안성: POST 방식은 데이터를 HTTP 요청의 본문(Body)에 포함시켜 전송한다. 특히 로그인 정보나 개인정보 같은 민감한 데이터를 전송할 때 주로 사용된다.</li>
<li>URL 노출 없음: 데이터가 URL에 노출되지 않기 때문에, 브라우저의 주소창이나 히스토리, 로그 파일에 민감한 정보가 남지 않는다.</li>
</ul>
</blockquote>
</li>
<li><p>전송할 수 있는 데이터 양에 제한이 없다.</p>
<blockquote>
<ul>
<li>큰 데이터 전송: POST 방식은 URL 길이에 제한을 받지 않기 때문에, 상대적으로 많은 양의 데이터를 전송할 수 있다. 이는 대규모의 데이터를 서버로 보내야 하는 상황에 적합하다.</li>
<li>폼 데이터 전송, 파일 업로드, JSON/XML 데이터 전송 등 크기가 큰 데이터를 처리할 때 주로 사용된다.</li>
</ul>
</blockquote>
</li>
<li><p>데이터가 본문에 포함되어 있어 외부에서 볼 수 없다.</p>
<blockquote>
<ul>
<li>데이터 은닉: POST 요청은 데이터를 HTTP 본문에 숨겨 전송한다. 이는 네트워크를 통해 데이터가 전송될 때 외부에서 쉽게 볼 수 없도록 한다.</li>
<li>네트워크 보안: 데이터가 본문에 포함되어 전송되므로, 네트워크 스니핑을 통한 데이터 노출 위험이 줄어든다. 그러나 전송 데이터를 완벽하게 보호하려면 HTTPS와 같은 보안 프로토콜을 사용하는 것이 필수!!.<blockquote>
<ul>
<li>HTTPS (HyperText Transfer Protocol Secure)
HTTP에 데이터 암호화를 추가한 프로토콜. 웹 브라우저와 웹 서버 간의 통신을 암호화하여 보안을 강화한 것!</li>
</ul>
</blockquote>
</li>
</ul>
</blockquote>
</li>
</ul>
<h3 id="장점-1">장점</h3>
<ul>
<li><p>보안성
POST는 데이터를 HTTP 메시지의 본문에 포함하여 전송하기 때문에, URL에 민감한 정보가 노출되지 않는다. 이는 보안에 민감한 데이터 전송에 적합하다.</p>
</li>
<li><p>데이터 크기에 제한 없음
POST는 URL 길이 제한의 영향을 받지 않으므로, 많은 양의 데이터를 전송할 수 있다. </p>
</li>
<li><p>다양한 데이터 타입 지원
POST 방식은 다양한 종류의 데이터(텍스트, 바이너리 데이터, JSON 등)를 전송할 수 있다. 이는 파일 업로드, JSON 데이터 전송 등 다양한 애플리케이션에 유용하다.</p>
</li>
<li><p>부가적인 헤더 필드 사용
POST 요청은 필요에 따라 추가적인 헤더 필드(Content-Type 등)를 사용하여 데이터 형식을 명시할 수 있다. 이는 데이터 처리의 정확성과 효율성을 높인다.</p>
</li>
</ul>
<h3 id="단점-1">단점</h3>
<ul>
<li><p>상대적으로 복잡함
데이터를 본문에 담아 전송해야 하기 때문에, 요청의 구성이 GET보다 복잡해질 수 있다.</p>
</li>
<li><p>캐싱 불가
일반적으로 POST 요청은 캐시되지 않는다. 따라서 동일한 요청을 반복할 때마다 서버로부터 새로운 응답을 받아야 하기 때문에, 네트워크 트래픽과 서버 부하를 증가시킬 수 있다.</p>
</li>
<li><p>서버 부하 증가
POST 요청은 매번 서버에서 요청을 처리해야 하므로, GET 요청보다 서버에 더 많은 부하를 줄 수 있다. 특히, 대용량 데이터를 처리할 때 서버의 부하가 더욱 증가할 수 있다.</p>
</li>
<li><p>북마크와 공유의 어려움
POST 요청은 데이터가 URL에 포함되지 않기 때문에, 사용자가 특정 상태의 페이지를 북마크하거나 공유하기 어렵다.</p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>