<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>jdev.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 17 Jul 2024 08:24:39 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. jdev.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/jp-share" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 자동차 대여 기록 별 대여 금액 구하기 (Mysql)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D-%EB%B3%84-%EB%8C%80%EC%97%AC-%EA%B8%88%EC%95%A1-%EA%B5%AC%ED%95%98%EA%B8%B0-Mysql</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%90%EB%8F%99%EC%B0%A8-%EB%8C%80%EC%97%AC-%EA%B8%B0%EB%A1%9D-%EB%B3%84-%EB%8C%80%EC%97%AC-%EA%B8%88%EC%95%A1-%EA%B5%AC%ED%95%98%EA%B8%B0-Mysql</guid>
            <pubDate>Wed, 17 Jul 2024 08:24:39 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jp-share/post/dd465a1a-c853-483f-928a-c1b3dc39ad4e/image.png" alt=""></p>
<h2 id="⚽-설명문">⚽ 설명문</h2>
<p><strong>레벨: 4</strong>
<strong>언어: Mysql</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/acbb6a21-3995-4d48-8063-0ef795182623/image.jpg" style="margin:0;">
<img src="https://velog.velcdn.com/images/jp-share/post/f5eba934-efd3-4840-92dc-b3ebc4579b76/image.jpg" style="margin:0;">
<img src="https://velog.velcdn.com/images/jp-share/post/742a97de-70ed-4de7-9ad4-018ae80a7222/image.jpg" style="margin:0;">

<h2 id="🧦-느낀점">🧦 느낀점</h2>
<p>해당 문제는 날짜값을 정확하게 구하면 풀 수 있는 문제라고 생각합니다</p>
<ol>
<li>대여 종료일과 시작일의 차이를 구하고</li>
<li>CAR_RENTAL_COMPANY_DISCOUNT_PLAN 해당 테이블과 조인을 하고</li>
<li>금액과 대여차이일자와 할인율을 곱해서 금액을 구합니다</li>
</ol>
<h2 id="🥈-내가-작성한-코드">🥈 내가 작성한 코드</h2>
<pre><code class="language-mysql">SELECT AA.HISTORY_ID
    , ROUND(AA.DIFFDATE * AA.DAILY_FEE * ((100 - IFNULL(BB.DISCOUNT_RATE, 0)) / 100), 0) AS FEE
  FROM (SELECT A.* 
            , B.HISTORY_ID
            , DATEDIFF(B.END_DATE, B.START_DATE) + 1 AS DIFFDATE
            , CASE WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 &gt;= 90 THEN &#39;90일 이상&#39;
                WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 &gt;= 30 THEN &#39;30일 이상&#39;
                WHEN DATEDIFF(B.END_DATE, B.START_DATE) + 1 &gt;= 7 THEN &#39;7일 이상&#39;
                 END DURATION_TYPE
          FROM CAR_RENTAL_COMPANY_CAR A
          JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
            ON (A.CAR_ID = B.CAR_ID)
         WHERE A.CAR_TYPE = &#39;트럭&#39;) AA
  LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN BB
    ON (AA.CAR_TYPE = BB.CAR_TYPE AND AA.DURATION_TYPE = BB.DURATION_TYPE)
 ORDER BY FEE DESC, HISTORY_ID DESC</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 취소되지 않은 진료 예약 조회하기 (Mysql)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B7%A8%EC%86%8C%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EC%A7%84%EB%A3%8C-%EC%98%88%EC%95%BD-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0-Mysql</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%B7%A8%EC%86%8C%EB%90%98%EC%A7%80-%EC%95%8A%EC%9D%80-%EC%A7%84%EB%A3%8C-%EC%98%88%EC%95%BD-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0-Mysql</guid>
            <pubDate>Tue, 16 Jul 2024 07:31:18 GMT</pubDate>
            <description><![CDATA[<h2 id="🥼-설명문">🥼 설명문</h2>
<p><strong>레벨: 4</strong>
<strong>언어: Mysql</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/52655dd6-ed42-4f4f-81ee-2dd096b40351/image.jpg" style="margin: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/72d6fc3b-1da3-4586-9299-f1468a28682b/image.jpg" style="margin: 0;">

<h2 id="🌝-느낀점">🌝 느낀점</h2>
<p>해당문제는 문제 요구사항만 제대로 이해하면 풀수 있는 문제라고 생각됩니다
흉부외과 CS 와 취소되지 않은 내역과 2022년4월13일 진료일인 목록을 찾으면 된다고 봅니다</p>
<h2 id="🎲-내가-작성한-코드">🎲 내가 작성한 코드</h2>
<pre><code class="language-mysql">SELECT A.APNT_NO, B.PT_NAME, B.PT_NO, A.MCDP_CD, C.DR_NAME, A.APNT_YMD
  FROM APPOINTMENT A
  JOIN PATIENT B
    ON (A.PT_NO = B.PT_NO)
  JOIN DOCTOR C
    ON (A.MDDR_ID = C.DR_ID)
 WHERE A.MCDP_CD = &#39;CS&#39;
   AND A.APNT_CNCL_YN = &#39;N&#39;
   AND DATE_FORMAT(A.APNT_YMD, &#39;%Y%m%d&#39;) = &#39;20220413&#39;
 ORDER BY A.APNT_YMD</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 오프라인/온라인 판매 데이터 통합하기 (Mysql)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%A4%ED%94%84%EB%9D%BC%EC%9D%B8%EC%98%A8%EB%9D%BC%EC%9D%B8-%ED%8C%90%EB%A7%A4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%86%B5%ED%95%A9%ED%95%98%EA%B8%B0-Mysql</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%98%A4%ED%94%84%EB%9D%BC%EC%9D%B8%EC%98%A8%EB%9D%BC%EC%9D%B8-%ED%8C%90%EB%A7%A4-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%86%B5%ED%95%A9%ED%95%98%EA%B8%B0-Mysql</guid>
            <pubDate>Mon, 15 Jul 2024 09:32:27 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jp-share/post/8fe0134e-68fe-4ba8-9041-4ebd71485ba4/image.png" alt=""></p>
<h2 id="⚽-설명문">⚽ 설명문</h2>
<p><strong>레벨: 4</strong>
<strong>언어: Mysql</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/c1fa7eb2-3c44-4424-83ac-e22d118c5ef4/image.jpg" style="margin: 0">
<img src="https://velog.velcdn.com/images/jp-share/post/3f0be919-15fa-4d81-a464-ed8e513ba674/image.jpg" style="margin: 0">

<h2 id="👔-느낀점">👔 느낀점</h2>
<p>해당 문제는 UNION을 사용할 줄 알면 되는 문제라고 생각합니다.
오프라인 판매와 온라인 판매를 UNION ALL 전부를 합치는 SQL을 작성했습니다</p>
<h2 id="🧨-내가-작상한-코드">🧨 내가 작상한 코드</h2>
<pre><code class="language-mysql">SELECT *
  FROM (SELECT DATE_FORMAT(SALES_DATE, &#39;%Y-%m-%d&#39;) AS SALES_DATE
            , PRODUCT_ID
            , USER_ID
            , SALES_AMOUNT
          FROM ONLINE_SALE
         WHERE DATE_FORMAT(SALES_DATE, &#39;%Y%m&#39;) = &#39;202203&#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 DATE_FORMAT(SALES_DATE, &#39;%Y%m&#39;) = &#39;202203&#39;) AA
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 년, 월, 성별 별 상품 구매 회원 수 구하기 (Mysql)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%85%84-%EC%9B%94-%EC%84%B1%EB%B3%84-%EB%B3%84-%EC%83%81%ED%92%88-%EA%B5%AC%EB%A7%A4-%ED%9A%8C%EC%9B%90-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0-Mysql</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%85%84-%EC%9B%94-%EC%84%B1%EB%B3%84-%EB%B3%84-%EC%83%81%ED%92%88-%EA%B5%AC%EB%A7%A4-%ED%9A%8C%EC%9B%90-%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0-Mysql</guid>
            <pubDate>Mon, 15 Jul 2024 09:21:19 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jp-share/post/f569951b-0232-451f-9799-afd66a4efc44/image.png" alt=""></p>
<h2 id="🎈-설명문">🎈 설명문</h2>
<p><strong>레벨: 4</strong>
<strong>언어: Mysql</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/04d43b40-62f6-48b4-8597-9458d639e00d/image.jpg" style="margin: 0">
<img src="https://velog.velcdn.com/images/jp-share/post/61b31bad-ac6d-4099-b659-03ed1affcd79/image.jpg" style="margin: 0">


<h2 id="🎨-느낀점">🎨 느낀점</h2>
<p>간단한 group by 문제라고 생각합니다.
년도, 월, 성별을 group으로 짓고 다른날에 따른 같은 유저아이디가 중복되서 나올수 있으므로 distinct를 사용하여 중복제거를 해서 나온 값을 카운팅을 한 SQL을 작성했습니다</p>
<h2 id="⚽-내가-작성한-코드">⚽ 내가 작성한 코드</h2>
<pre><code class="language-mysql">SELECT YEAR(A.SALES_DATE) AS YEAR
    , MONTH(A.SALES_DATE) AS MONTH 
    , B.GENDER
    , COUNT(DISTINCT A.USER_ID) AS USERS
  FROM ONLINE_SALE A
  JOIN USER_INFO B
    ON (A.USER_ID = B.USER_ID)
 WHERE B.GENDER IS NOT NULL
 GROUP BY YEAR, MONTH, GENDER
 ORDER BY YEAR, MONTH, GENDER</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 서울에 위치한 식당 목록 출력하기 (Mysql)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%84%9C%EC%9A%B8%EC%97%90-%EC%9C%84%EC%B9%98%ED%95%9C-%EC%8B%9D%EB%8B%B9-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0-Mysql</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%84%9C%EC%9A%B8%EC%97%90-%EC%9C%84%EC%B9%98%ED%95%9C-%EC%8B%9D%EB%8B%B9-%EB%AA%A9%EB%A1%9D-%EC%B6%9C%EB%A0%A5%ED%95%98%EA%B8%B0-Mysql</guid>
            <pubDate>Mon, 15 Jul 2024 08:14:23 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jp-share/post/4ef5d2c0-84f0-469b-84d9-883a60c54287/image.png" alt=""></p>
<h2 id="⚾-설명문">⚾ 설명문</h2>
<p><strong>레벨: 4</strong>
<strong>언어: Mysql</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/e742daa1-dbbd-4075-9fd1-d07efd0da74c/image.jpg" style="margin: 0">
<img src="https://velog.velcdn.com/images/jp-share/post/016eff0f-775d-4caf-ad1d-f2b5c623bb82/image.jpg" style="margin: 0">

<h2 id="🌝-느낀점">🌝 느낀점</h2>
<p>해당 문제는 간단한 JOIN 문제라고 생각합니다.
해당 점수 평균값을 구하고 반올림을 셋째 자리에서 한다음에 구하는거 외에는 어려운게 없다고 생각합니다</p>
<p>주의할점은 LIKE 조회를 할때 &#39;%서울%&#39; 하니 틀리다고 나오니 &#39;서울%&#39;로 하시기 바랍니다</p>
<h2 id="🛒-내가-작성한-코드">🛒 내가 작성한 코드</h2>
<pre><code class="language-mysql">SELECT A.REST_ID
    , A.REST_NAME
    , A.FOOD_TYPE
    , A.FAVORITES
    , A.ADDRESS
    , ROUND(AVG(B.REVIEW_SCORE), 2) AS SCORE
  FROM REST_INFO A
  JOIN REST_REVIEW B
    ON (A.REST_ID = B.REST_ID)
 WHERE A.ADDRESS LIKE &#39;서울%&#39;
 GROUP BY A.REST_ID
 ORDER BY SCORE DESC, FAVORITES DESC</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 언어별 개발자 분류하기 (Mysql)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%96%B8%EC%96%B4%EB%B3%84-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%B6%84%EB%A5%98%ED%95%98%EA%B8%B0-Mysql</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%96%B8%EC%96%B4%EB%B3%84-%EA%B0%9C%EB%B0%9C%EC%9E%90-%EB%B6%84%EB%A5%98%ED%95%98%EA%B8%B0-Mysql</guid>
            <pubDate>Mon, 15 Jul 2024 07:40:53 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jp-share/post/30fa1e39-6ec0-47e6-9e4d-d64d869bd490/image.png" alt=""></p>
<h2 id="⚾-설명문">⚾ 설명문</h2>
<p><strong>레벨: 4</strong>
<strong>언어: Mysql</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/2eaba718-8df8-445b-b658-92c7537963ef/image.jpg" style="margin: 0">
<img src="https://velog.velcdn.com/images/jp-share/post/485654f7-c5cf-412f-9234-365e16cf9300/image.jpg" style="margin: 0">

<h2 id="🔥-느낀점">🔥 느낀점</h2>
<p>해당 문제는 비트마스크를 사용한 문제인데,
비트연산자를 이해하고 있는 상태면 풀수 있는 문제라고 생각합니다
A등급은 프론트엔드에 해당되는 스킬인 비트를 가지고, 파이썬 스킬을 가지면 되는 문제라서
일단 비트연산자인 &amp; 사용하여 관련되 비트를 포함하고있으면 1이상 나오기때문에 True가 되고 Python 스킬을 가진지 &amp;로 비교하여 True를 구하고
나머지 B,C 등급도 이와 똑같이 비교해서 등급을 구하면됩니다</p>
<h2 id="⚽-내가-작성한-코드">⚽ 내가 작성한 코드</h2>
<pre><code class="language-mysql">SELECT 
    CASE WHEN SKILL_CODE &amp; (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = &#39;Front End&#39;)
            &amp;&amp; SKILL_CODE &amp; (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;Python&#39;) THEN &#39;A&#39;
        WHEN SKILL_CODE &amp; (SELECT CODE FROM SKILLCODES WHERE NAME = &#39;C#&#39;) THEN &#39;B&#39;
        WHEN SKILL_CODE &amp; (SELECT SUM(CODE) FROM SKILLCODES WHERE CATEGORY = &#39;Front End&#39;) THEN &#39;C&#39;
    END GRADE
    , ID
    , EMAIL
  FROM DEVELOPERS
 HAVING GRADE IS NOT NULL
 ORDER BY GRADE, ID</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 (Mysql)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%B0%EA%B0%84-%ED%8F%89%EA%B0%80%EC%A0%90%EC%88%98%EC%97%90-%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94-%ED%8F%89%EA%B0%80-%EB%93%B1%EA%B8%89-%EB%B0%8F-%EC%84%B1%EA%B3%BC%EA%B8%88-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0-Mysql</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%B0%EA%B0%84-%ED%8F%89%EA%B0%80%EC%A0%90%EC%88%98%EC%97%90-%ED%95%B4%EB%8B%B9%ED%95%98%EB%8A%94-%ED%8F%89%EA%B0%80-%EB%93%B1%EA%B8%89-%EB%B0%8F-%EC%84%B1%EA%B3%BC%EA%B8%88-%EC%A1%B0%ED%9A%8C%ED%95%98%EA%B8%B0-Mysql</guid>
            <pubDate>Mon, 15 Jul 2024 06:45:31 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jp-share/post/4e360a4a-b063-4609-8dc3-ff00e9ffac03/image.png" alt=""></p>
<h2 id="📜-설명문">📜 설명문</h2>
<p><strong>레벨: 4</strong>
<strong>언어: Mysql</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/974d8904-9fa1-4ca9-bcaf-b66482f1f142/image.jpg" style="margin: 0">
<img src="https://velog.velcdn.com/images/jp-share/post/3dbf3c05-88f6-436d-9d35-1e0fd246d5df/image.jpg" style="margin: 0">

<h2 id="🥮-느낀점">🥮 느낀점</h2>
<p>해당 문제는 쉬운편의 문제라고 생각됩니다.
해당년도의 평균점수를 구해서 문제 요구사항대로 기준점수를 잡아
평가등급을 구하며,
또한 성과금퍼센트를 곱해서 보너스를 구하면 되는문제입니다</p>
<h2 id="🧨-내가-작성한-코드">🧨 내가 작성한 코드</h2>
<pre><code class="language-mysql">
SELECT A.EMP_NO, A.EMP_NAME
    , CASE WHEN AVG_SCORE &gt;= 96 THEN &#39;S&#39;
        WHEN AVG_SCORE &gt;= 90 AND AVG_SCORE &lt; 96 THEN &#39;A&#39;
        WHEN AVG_SCORE &gt;= 80 AND AVG_SCORE &lt; 90 THEN &#39;B&#39;
        ELSE &#39;C&#39; END GRADE
    , CASE WHEN AVG_SCORE &gt;= 96 THEN A.SAL * 0.2
        WHEN AVG_SCORE &gt;= 90 AND AVG_SCORE &lt; 96 THEN A.SAL * 0.15
        WHEN AVG_SCORE &gt;= 80 AND AVG_SCORE &lt; 90 THEN A.SAL * 0.1
        ELSE 0 END BONUS
  FROM HR_EMPLOYEES A
  JOIN (SELECT EMP_NO, AVG(SCORE) AS AVG_SCORE
          FROM HR_GRADE
         GROUP BY EMP_NO) B
    ON (A.EMP_NO = B.EMP_NO)
 ORDER BY A.EMP_NO</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 특정 세대의 대장균 찾기
(Mysql)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8A%B9%EC%A0%95-%EC%84%B8%EB%8C%80%EC%9D%98-%EB%8C%80%EC%9E%A5%EA%B7%A0-%EC%B0%BE%EA%B8%B0Mysql</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8A%B9%EC%A0%95-%EC%84%B8%EB%8C%80%EC%9D%98-%EB%8C%80%EC%9E%A5%EA%B7%A0-%EC%B0%BE%EA%B8%B0Mysql</guid>
            <pubDate>Mon, 15 Jul 2024 06:27:50 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/jp-share/post/26e46d81-bd17-4092-929b-5d5596a5170d/image.png" alt=""></p>
<h2 id="🌝설명문">🌝설명문</h2>
<p><strong>레벨: 4</strong>
<strong>언어: Mysql</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/b4d500d8-8734-46f8-8a65-19ce6fd08459/image.jpg">


<h2 id="⚾느낀점">⚾느낀점</h2>
<p>해당 문제는 비교적 쉬운 문제라고 생각합니다
Depth를 3까지 가져가면 되는 문제라고 생각해서입니다
Oracle일 경우 계층쿼리를 사용하면되지만 Mysql 사용하였기 때문에 직접 조인을 걸어 SQL을 작성했습니다</p>
<h2 id="⚽내가-작성한-코드">⚽내가 작성한 코드</h2>
<pre><code class="language-mysql">SELECT AA.ID
  FROM ECOLI_DATA AA
  JOIN (SELECT A.ID
          FROM ECOLI_DATA A
          JOIN (SELECT *
                  FROM ECOLI_DATA
                 WHERE PARENT_ID IS NULL) B
            ON (A.PARENT_ID = B.ID)) BB
    ON (AA.PARENT_ID = BB.ID)
 ORDER BY AA.ID</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Javascript] 렌더링 CSR, SSR(SPA, MPA), SSG란 무엇인가?]]></title>
            <link>https://velog.io/@jp-share/Javascript-CSR-SSR-SSG%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</link>
            <guid>https://velog.io/@jp-share/Javascript-CSR-SSR-SSG%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80</guid>
            <pubDate>Mon, 14 Nov 2022 06:08:23 GMT</pubDate>
            <description><![CDATA[<h3 id="spa-single-page-application">SPA (Single Page Application)</h3>
<ul>
<li>과거 SSR 렌더링 방식(페이지 이동시 무조건 서버에서 렌더링)에서 깜빡임 현상으로 사용자 경험에 위배 -&gt; 필요한 요소들만 변경을 위한 단일 페이지에서 랜더링 방식진행</li>
<li>Node.js 환경과 생태계과 발달하면서 webpack, babel 등장</li>
<li>Oauth2 Client Secret 노출에 대한 우려</li>
<li>BFF(Backend For Frontend) 등장</li>
</ul>
<h3 id="mpa-multi-page-application">MPA (Multi Page Application)</h3>
<ul>
<li>서버에서 렌더링(SSR) - 페이지 첫 및 이동시 페이지 반환</li>
<li>템플릿엔진(Thymeleaf, Freemarker, JMustache), JSP</li>
</ul>
<h2 id="🥪-csr">🥪 CSR</h2>
<ul>
<li>클라이언트 렌더링 Client Side Rendering의 약자</li>
<li>컴퓨터 하드웨어 성능이 좋아져 클라이언트에서 렌더링 시도</li>
</ul>
<h4 id="렌더링-순서">렌더링 순서</h4>
<ul>
<li>Url 진입시도</li>
<li>서버에서 API 응답시 비어있는 Html파일 생성 반환</li>
<li>클라이언트(웹브라우저)에서 응답 받은 Html파일에 Html, Css 등 적용(메타태그 포함)</li>
<li>Javascript 페이지 이동기능 사용시 페이지별 Html 응답 방식이 아닌 기존 Html에서 재 렌더링 시도</li>
</ul>
<h4 id="관련-라이브러리">관련 라이브러리</h4>
<ul>
<li>서버와 분리된 별도 클라이언트 javascript 서버 및 프레임워크</li>
<li>react, vue, angular, svelte 등등</li>
</ul>
<h4 id="장점">장점</h4>
<ul>
<li>페이지 이동시 렌더링 속도가 우수 (클라이언트에서 부분요소만 렌더링)</li>
<li>필요한 부분요소만 렌더링하여 깜빡이는 현상 미발생 (사용자 경험에 좋다)</li>
<li>서버 부하 감소</li>
</ul>
<h4 id="단점">단점</h4>
<ul>
<li>SEO(검색엔진)에서 미노출 </li>
<li>최초 로딩시간이 가장 오래걸린다 빈 Html 파일, 모든 스크립트 파일(브라우저에서 렌더링 시도를 위해) - 다운로드 받는 과정에서 오버레이 띄우기 필요</li>
<li>어플리케이션이 커질수록 최초 로딩시간 더 길어짐</li>
<li>사용자 디바이스에 따른 성능폭 발생(옛날 휴대폰 등?)</li>
</ul>
<h4 id="스크래핑-방법">스크래핑 방법</h4>
<ul>
<li>Java 사용시 Jsoup 불가능 / Selenium(암시적, 명시적 대기) 가능</li>
</ul>
<h4 id="용도">용도</h4>
<h2 id="🥡-ssrmpa-spa">🥡 SSR(MPA, SPA)</h2>
<ul>
<li>서버 렌더링(Server Side Rendering)의 약자</li>
<li>과거 컴퓨터 하드웨어 성능이 좋으편이 아니라 서버에서 렌더링 시도(MPA)</li>
<li>현재 컴퓨터 하드웨어 성능이 좋아져 첫페이지 이후 클라이언트에서 렌더링 시도 및 SEO를 위한(SPA) - Universal</li>
</ul>
<h4 id="관련-라이브러리-1">관련 라이브러리</h4>
<ul>
<li>MPA - 템플릿엔진(Thymeleaf, Freemarker, JMustache), JSP</li>
<li>SPA - Nuxt.js, Next.js, Quasar</li>
</ul>
<h4 id="렌더링-순서-1">렌더링 순서</h4>
<ul>
<li>Url 진입시도</li>
<li>서버에서 API 응답시점에서 렌더링된 Html파일을 생성(Html, Css 파싱 적용된 파일) 반환</li>
<li>페이지 이동시 서버에서 렌더링된 Html파일 응답(MPA), 클라이언트에서 부분요소 렌더링(SPA) </li>
</ul>
<h4 id="장점-1">장점</h4>
<ul>
<li>렌더링된 Html파일 크롤링하여 SEO(검색엔진) 노출</li>
</ul>
<h4 id="단점-1">단점</h4>
<ul>
<li>MPA - 페이지 이동시 서버에서 렌더링형태여서 속도 느림 및 깜빡임(사용자 경험위배)</li>
</ul>
<h4 id="스크래핑-방법-1">스크래핑 방법</h4>
<ul>
<li>Java 사용시 Jsoup 가능 / Selenium 가능</li>
</ul>
<h4 id="용도-1">용도</h4>
<h2 id="🧆-ssg">🧆 SSG</h2>
<ul>
<li>정적 파일(빌드시) 생성(Static Side Generator)의 약자</li>
<li>Jamstack 연관(Javascript, Api, Markup 함축 약자)</li>
<li>CDN(Content Delivery Network) 사용!</li>
<li>웹사이트 최초로 생겼을때도 빌드방식으로 생성된건 아니지만 Html, Css 페이지별로 작성해서 노출</li>
</ul>
<h4 id="렌더링-순서-2">렌더링 순서</h4>
<ul>
<li>Webpack으로 번들링 및 빌드 진행시 페이지별 렌더링된 Html파일(Html, Css 파싱 적용된 파일) 별도 생성</li>
<li>Url 진입시 이전에 생성된 Html 파일 반환</li>
<li>페이지 이동시 이전에 생성된 해당 페이지 Html 파일 반환</li>
</ul>
<h4 id="관련-라이브러리-2">관련 라이브러리</h4>
<ul>
<li>Vue - Nuxt.js, VuePress</li>
<li>React - Next.js, Gatsby</li>
<li>Netlify</li>
</ul>
<h4 id="장점-2">장점</h4>
<ul>
<li>CSR, SSR 에 비해 최초 페이지 로딩 속도가 가장 빠르다 (생성 후 파일 반환 형식이 아니라서)</li>
<li>페이지 로딩이 일관적이다</li>
</ul>
<h4 id="단점-2">단점</h4>
<ul>
<li>페이지가 많아질수록 빌드속도가 더 느려짐</li>
</ul>
<h4 id="스크래핑-방법-2">스크래핑 방법</h4>
<ul>
<li>Java 사용시 Jsoup 가능 / Selenium 가능</li>
</ul>
<h4 id="용도-2">용도</h4>
<ul>
<li>회사 소개 페이지 (빠른 렌더링 속도가 중요&lt;첫 페이지 진입시&gt; - 이탈률 증가 방지)</li>
<li>블로그</li>
</ul>
<h3 id="🌯-추천-및-참고-자료">🌯 추천! 및 참고 자료</h3>
<p><a href="https://www.youtube.com/watch?v=iZ9csAfU5Os">드림코딩 - 렌더링 역사 와 설명</a>
<a href="https://www.youtube.com/watch?v=5ILR9Vd_Vos">얄팍한코딩사전 - CSR, SSR, SSG란</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] 스프링 3대요소(DI, AOP, PSA)]]></title>
            <link>https://velog.io/@jp-share/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-3%EB%8C%80%EC%9A%94%EC%86%8CDI-AOP-PSA</link>
            <guid>https://velog.io/@jp-share/Spring-%EC%8A%A4%ED%94%84%EB%A7%81-3%EB%8C%80%EC%9A%94%EC%86%8CDI-AOP-PSA</guid>
            <pubDate>Thu, 03 Nov 2022 16:54:00 GMT</pubDate>
            <description><![CDATA[<h2 id="🎭-di">🎭 DI</h2>
<ul>
<li>의존성 주입(Dependency Injection) 약자</li>
<li>객체지향 SOLID D와 관계된 Depency Inversion Principal과 연관(의존성 역전 원칙)</li>
<li>Ioc 컨테이너(Application Context) 관리 (Bean 라이프사이클 및 Proxy 형태로 관리 가능)</li>
<li>Ioc 컨테이너 형태여서 기본값설정을 임의로 완료설정하여 Spring Boot 이점인 자동구성 손쉽게 가능</li>
</ul>
<ul>
<li>의존성 분리의 이점이 있는데 단일 어플리케이션으로만 생각하면 이점에 대해 개념만 알고 체감이 안될수가 있음 (본인이 Spring 관련 라이브러리를 만들고 의존하고 버전업에 따른 비슷한 기능을 추가 구현에 따른 확정성, 교체를 하는 경험과 생각을 가져보는 전환이 필요하다고 생각) </li>
</ul>
<h4 id="bean-생성-방법">Bean 생성 방법</h4>
<ol>
<li>XML 생성방법 (Spring 3.0 이전에 해당방법만 존재)</li>
<li>@Configuration, @Bean 생성방법</li>
<li>@Controller, @Service, @Repository, @Component 생성방법</li>
</ol>
<ul>
<li>최근 선호 방법은 2,3번 Java에서 사용하는 방법입니다</li>
</ul>
<h4 id="주입방법">주입방법</h4>
<table>
<thead>
<tr>
<th>방법</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>field</td>
<td>기본 생성자 클래스 생성후 필드 주입으로 해당 Bean 미존재시에도 에러 전파 X</td>
</tr>
<tr>
<td>setter</td>
<td>기본 생성자 클래스 생성후 수정자 주입으로 해당 Bean 미존재시에도 에러 전파 X</td>
</tr>
<tr>
<td>constructor</td>
<td>Spring 진영에서 권장하는 방법 - Spring Boot 로딩시 결국에 ClassLoader를 통한 파싱으로 Bean 주입을 시도 및 생성자를 통한 생성인데 (단일 생성자 하나일시 그 해당생성자로 생성하게되는데 해당 Bean이 미존재시 객체 생성 에러가 전파되 Spring Boot 로딩 실패로 빠른 확인 가능)</td>
</tr>
</tbody></table>
<h4 id="관련-어노테이션">관련 어노테이션</h4>
<table>
<thead>
<tr>
<th>어노테이션</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>@Autowired</td>
<td>필드, 수정자 주입시 사용 (생성자시에도 사용할수 있지만 단일 생성자일시 필수X)</td>
</tr>
<tr>
<td>@Qualifier</td>
<td>Autowired 주입시 우선순위(1: 클래스타입, 2: Bean 이름) 동일타입시 Bean 이름 명시로 주입</td>
</tr>
<tr>
<td>@Resource</td>
<td>Resource 주입시 우선순위(1: Bean 이름, 2: 클래스타입)</td>
</tr>
<tr>
<td>@ComponentScan</td>
<td>Bean 패키지 경로 및 클래스 등록범위 설정 (filter를 사용하여 범위 세부설정 가능)</td>
</tr>
<tr>
<td>@Bean</td>
<td>@Configuration 선언된 클래스 메서드 반환형태로 Bean 생성시도</td>
</tr>
<tr>
<td>@Configuration</td>
<td>@Bean 사용하기위한 클래스에 선언</td>
</tr>
<tr>
<td>@Lazy</td>
<td>Bean 생성시 지연생성(필자 기준으로 - 단위테스트, 라이브러리 형태로 제공해서 사용안하는 기능은 나중에 생성하는 방식이 더 나은 방법이지 않은가에 대한 판단)</td>
</tr>
<tr>
<td>@Primary</td>
<td>같은 타입의 Bean 생성시 가장 처음 우선순위로 설정</td>
</tr>
<tr>
<td>@Order</td>
<td>같은 타입의 Bean 생성시 우선순위 설정 (List 형태로 받아올시 순서 설정가능)</td>
</tr>
<tr>
<td>@Import</td>
<td>해당 타입의 Bean만 등록 (필자기준 - 단위테스트, 공통모듈 개발시 사용)</td>
</tr>
<tr>
<td>@Conditional</td>
<td>Bean 생성조건 선언 (해당 어노테이션 사용하여 @Enable*** 구성 가능), 해당 어노테이션으로 파생된 어노테이션 추가 존재(ex - @Conditionalonclass 등등)</td>
</tr>
<tr>
<td>@Scope</td>
<td>Bean 생성 및 파괴 범위(ex: 싱글톤, 프로토타입, 세션, 리퀘스트) / Batch @StepScope, @JobScope 등 batch 전용 스코프도 존재 / (필자기준 - 프로토타입 scope 사용시 @Lookup 사용)</td>
</tr>
<tr>
<td>@Lookup</td>
<td>Bean 생성 파괴 라이프사이클안에서 결국 필드에 저장되는데 싱글톤 객체에 프로토타입 타 빈주입이 불가능 하여 가능하게 하는 어노테이션 (필자기준 - factory class 생성하여 해당 메서드에 선언식으로 factory class bean 주입 받아서 메스드로 호출 생성 / interface default method로도 implement 받은 후 하면 가능하지 않을까 판단)</td>
</tr>
<tr>
<td>@Description</td>
<td>Bean 설명을 나타내는 정보성 어노테이션</td>
</tr>
<tr>
<td>@Role</td>
<td>Bean 역할 정보성 어노테이션 (3개의 값 -인프라, 어플리케이션, 보조)</td>
</tr>
</tbody></table>
<h4 id="참고-링크">참고 링크</h4>
<h2 id="🧵-aop">🧵 AOP</h2>
<ul>
<li>관점 지향 프로그래밍(Aspect Oriented Programming)의 약어</li>
<li>비즈니스 로직 외 공통적으로 들어가는 부가적인 로직을 Proxy 패턴 형태로 호출</li>
<li>단위테스트 할때 로직분리로 유용</li>
</ul>
<h4 id="관련-어노테이션-1">관련 어노테이션</h4>
<table>
<thead>
<tr>
<th>어노테이션</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>@Aspect</td>
<td>@Component bean 주입 어노테이션과 같이 사용하여 관점 지향 클래스 선언</td>
</tr>
<tr>
<td>@PointCut</td>
<td>어노테이션, 인터페이스 등 선언된 곳 설정 (해당 설정된 곳만 aop 기능 사용)</td>
</tr>
<tr>
<td>@Before</td>
<td>호출 이전시점</td>
</tr>
<tr>
<td>@Around</td>
<td>전체시점 / ProceedingJoinPoint(해당 시점에서만 사용가능) 사용하여 해당</td>
</tr>
<tr>
<td>@After</td>
<td>반환후 (에러, 성공) 시점</td>
</tr>
<tr>
<td>@AfterThrowing</td>
<td>반환후 에러 시점</td>
</tr>
<tr>
<td>@AfterReturning</td>
<td>반환후 성공 시점</td>
</tr>
</tbody></table>
<h4 id="커스텀-해본-기능-필자기준">커스텀 해본 기능 (필자기준)</h4>
<table>
<thead>
<tr>
<th>기능명</th>
<th>설명</th>
</tr>
</thead>
<tbody><tr>
<td>@ApiLog 기능</td>
<td>해당 Api 호출시 로그 DB 저장(기능타입, referer, ip 등등 저장)</td>
</tr>
<tr>
<td>@ExcelTemplate 기능</td>
<td>엑셀 양식 다운로드 (데이터 유효성, 스타일, 암호화, 데이터 포맷등의 기능)</td>
</tr>
<tr>
<td>@ExcelDownload 기능</td>
<td>엑셀 데이터 다운로드 (스타일, 데이터 포맷, 스트리밍)</td>
</tr>
</tbody></table>
<h4 id="예시">예시</h4>
<p>@Transantional
@Cacheable
@CacheEvit
@CachePut
@PreAuthorize
@PostAuthorize
@PreFilter
@PostFilter</p>
<h4 id="참고링크">참고링크</h4>
<h2 id="🥼-psa">🥼 PSA</h2>
<ul>
<li>다른 기술로 교체가능한 추상화(Portable Service Abstraction) 약자</li>
<li>추상화를 위한 인터페이스 사용</li>
</ul>
<h4 id="예시-1">예시</h4>
<p>Spring Data JPA, Spring Data MongoDB 등의 Spring Data
EhCacheCacheManager, JCacheCacheManager 등의 CacheManager</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Spring] 동시성처리(비관적, 낙관적 잠금)]]></title>
            <link>https://velog.io/@jp-share/Spring-%EB%8F%99%EC%8B%9C%EC%84%B1%EC%B2%98%EB%A6%AC%EB%B9%84%EA%B4%80%EC%A0%81-%EB%82%99%EA%B4%80%EC%A0%81-%EC%9E%A0%EA%B8%88</link>
            <guid>https://velog.io/@jp-share/Spring-%EB%8F%99%EC%8B%9C%EC%84%B1%EC%B2%98%EB%A6%AC%EB%B9%84%EA%B4%80%EC%A0%81-%EB%82%99%EA%B4%80%EC%A0%81-%EC%9E%A0%EA%B8%88</guid>
            <pubDate>Thu, 03 Nov 2022 16:32:26 GMT</pubDate>
            <description><![CDATA[<h2 id="🧶-알아야되는-이유">🧶 알아야되는 이유!</h2>
<p>멀티스레딩 환경에서 0.1 초정도 차이로 인한 동시적인 케이스에서 데이터 불일치 현상 발생 방지를 위하여!</p>
<h2 id="🧦-비관적-잠금">🧦 비관적 잠금</h2>
<p>@Lock - JPA에서 제공 (말그대로 충돌을 비관적(자주 발생)으로 보는경우)</p>
<ul>
<li>DB락 이용</li>
<li>데이터 정합성 중요한 경우</li>
</ul>
<p>ex) </p>
<ul>
<li>주문 등록시 (재고가 1인상태에서 두명이 주문후 재고가 0이 되었으나 둘다 결제되어버리는상황 방지)</li>
<li>음식점 자리 결제, 비행기 자리 예약하는 경우 (자리 및 해당시간 충돌 상황 방지)</li>
<li>학교 유명교수 수강자리가 10자리인데 500명의 학생이 수강신청을 하는 경우</li>
<li>콜라보 한정판 상품이 5개 정도 있는데 1000명의 인원이 구매시도 하는 경우 등</li>
</ul>
<h2 id="👜-낙관적-잠금">👜 낙관적 잠금</h2>
<p>@Version - JPA에서 제공 (말그대로 충돌을 낙관적(잘 안일어남)으로 보는경우)</p>
<ul>
<li>커밋시점에서 버전확인 (비관적보다 성능상 이점)</li>
<li>롤백후 에러 (클라이언트 입장에서 재시도 필요)</li>
</ul>
<p>ex)</p>
<ul>
<li>그룹웨어 기업정보 변경시 (시스템관리자와 기업관리자 정보변경시 변경되었다는걸 인지하고 확인필요)</li>
<li>브랜드음식메뉴 가격변경 후 매장메뉴 반영한다음에 가격변경시 (변경되었다는걸 인지하지 못하고 변경 방지)</li>
<li>게시글 글 변경시 (Confluence 사용시 경험가능)</li>
</ul>
<h3 id="🥼-참고">🥼 참고</h3>
<p>@Transantion 고립단계 지식필요</p>
<ul>
<li>Spring Batch에도 동시성 상황 고려를 위해 고립단계 최상 Serializable 기본값</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 숫자 짝꿍(Java)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%AB%EC%9E%90-%EC%A7%9D%EA%BF%8DJava</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%88%AB%EC%9E%90-%EC%A7%9D%EA%BF%8DJava</guid>
            <pubDate>Sun, 30 Oct 2022 08:54:33 GMT</pubDate>
            <description><![CDATA[<h2 id="⚾-설명문">⚾ 설명문</h2>
<p><strong>레벨: 1</strong>
<strong>언어: 자바(Java)</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/680fcd0f-3399-45cf-bebb-101895e7d869/image.jpg">


<h2 id="🎛-느낀점">🎛 느낀점</h2>
<p>해당문제는 자바코딩을 기본적으로 할줄알면 풀수있는 문제라고 생각합니다.
저는 Map을 사용해서 풀었습니다.</p>
<p><strong>풀이방법</strong></p>
<ol>
<li>x와 y의 문자 카운터를 담는 map 선언 및 값 put</li>
<li>x와 y의 같은 문자에 해당하는 최소카운팅을 값을 list에 추가</li>
<li>list 값이 없을시 -1</li>
<li>list에 0만 존재시 0</li>
<li>외의 값 반환</li>
</ol>
<p><strong>가장 좋아요 많이 받은 코드</strong>
저와의 차이점이라면 저는 Map 사용했지만 좋아요 많이받는 코드는 배열을 사용해서 index가 key이고 값이 카운팅 값이라는 차이점입니다.</p>
<ol>
<li>x와 y의 배열 선언</li>
<li>0의 아스키코드가 48인데 character값에서 48을 빼면 해당 맞는 int값으로 변환</li>
<li>빈문자열 비교시 -1</li>
<li>정렬된값이 들어있는 문자열에서 첫번째값이 0이면 0</li>
<li>외의 값 반환</li>
</ol>
<h2 id="🧥-내가-작성한-코드">🧥 내가 작성한 코드</h2>
<pre><code class="language-java">import java.util.*;
import java.util.stream.*;


class Solution {
    public String solution(String X, String Y) {
        Map&lt;String, Integer&gt; xMap = new HashMap&lt;&gt;();
        Map&lt;String, Integer&gt; yMap = new HashMap&lt;&gt;();

        List&lt;String&gt; list = new ArrayList&lt;&gt;();

        for(String key: X.split(&quot;&quot;)) {
            xMap.put(key, xMap.getOrDefault(key, 0)+1);
        }

        for(String key: Y.split(&quot;&quot;)) {
            yMap.put(key, yMap.getOrDefault(key, 0)+1);
        }

        for(String key: xMap.keySet()) {
            if(!yMap.containsKey(key)) continue;

            int length = Math.min(xMap.get(key), yMap.get(key));
            for(int i = 0; i &lt; length; i++) {
                list.add(key);
            }
        }

        String result = list.stream()
            .sorted(Collections.reverseOrder())
            .collect(Collectors.joining());

        if(result.isEmpty()) return &quot;-1&quot;;
        if(result.replaceAll(&quot;0&quot;, &quot;&quot;).isEmpty()) return &quot;0&quot;;
        return result;
    }
}</code></pre>
<h2 id="👔-가장-좋아요-많이-받은코드">👔 가장 좋아요 많이 받은코드</h2>
<pre><code class="language-java">class Solution {
    public String solution(String X, String Y) {
        StringBuilder answer = new StringBuilder();
        int[] x = {0,0,0,0,0,0,0,0,0,0};
        int[] y = {0,0,0,0,0,0,0,0,0,0};
        for(int i=0; i&lt;X.length();i++){
           x[X.charAt(i)-48] += 1;
        }
        for(int i=0; i&lt;Y.length();i++){
           y[Y.charAt(i)-48] += 1;
        }

        for(int i=9; i &gt;= 0; i--){
            for(int j=0; j&lt;Math.min(x[i],y[i]); j++){
                answer.append(i);
            }
        }
        if(&quot;&quot;.equals(answer.toString())){
           return &quot;-1&quot;;
        }else if(answer.toString().charAt(0)==48){
           return &quot;0&quot;;
        }else {
            return answer.toString();
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 연속 부분 수열 합의 개수 (Java)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%B0%EC%86%8D-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4-%ED%95%A9%EC%9D%98-%EA%B0%9C%EC%88%98-Java</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%97%B0%EC%86%8D-%EB%B6%80%EB%B6%84-%EC%88%98%EC%97%B4-%ED%95%A9%EC%9D%98-%EA%B0%9C%EC%88%98-Java</guid>
            <pubDate>Sat, 15 Oct 2022 10:09:13 GMT</pubDate>
            <description><![CDATA[<h2 id="⚽-설명">⚽ 설명</h2>
<p><strong>레벨: 2</strong>
<strong>언어: 자바(Java)</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/d889fc18-aa03-47d5-8d77-c27369e691f6/image.jpg" style="margin: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/61b5efeb-9ae6-4a7e-a643-a97fd75923f7/image.jpg" style="margin: 0;">


<h2 id="🥌-느낀점">🥌 느낀점</h2>
<p>최근에 나온 문제여서 좋아요 많이 받은 코드는 없어서 따로 추가 안합니다.
레벨2에서도 하위권 문제인데 시간내서 풀어봤습니다</p>
<p>해당문제는 <strong>Set</strong>을 활용한 문제입니다.
<strong>풀이방법</strong></p>
<ol>
<li>원형수열로 끝자리에서 처음자리로 다시이어지는 경우로 인해 배열을 2배 추가로 늘리기</li>
<li>합계 중복 미허용 set 변수선언</li>
<li>순차 인덱스에서 n번까지 실행을 더한값 set 저장</li>
<li>set 크기 반환</li>
</ol>
<h2 id="🏀-내가-작성한-코드">🏀 내가 작성한 코드</h2>
<pre><code class="language-java">import java.util.*;
import java.util.stream.*;

class Solution {
    public int solution(int[] elements) {
        int[] newElements = new int[elements.length * 2];

        for(int i = 0; i &lt; elements.length; i++) {
            newElements[i] = newElements[i + elements.length] = elements[i];
        }

        Set&lt;Integer&gt; set = new HashSet&lt;&gt;();

        for(int i = 1; i &lt;= elements.length; i++) {
            for(int j = 0; j &lt; elements.length; j++) {
                set.add(Arrays.stream(newElements, j, j+i).sum());
            }
        }

        return set.size();
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 가장 긴 팰린드롬(Java)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%ED%8C%B0%EB%A6%B0%EB%93%9C%EB%A1%ACJava</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EA%B0%80%EC%9E%A5-%EA%B8%B4-%ED%8C%B0%EB%A6%B0%EB%93%9C%EB%A1%ACJava</guid>
            <pubDate>Thu, 22 Sep 2022 07:33:40 GMT</pubDate>
            <description><![CDATA[<h2 id="💎-설명">💎 설명</h2>
<p><strong>레벨: 3</strong>
<strong>언어: 자바(Java)</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/e6adf1a5-a188-4485-a135-2c1b1c7e602c/image.jpg">

<h2 id="👜-느낀점">👜 느낀점</h2>
<p>해당 문제는 알고리즘이랑 자료구조 필요없이 루프돌리면 구할수 있는문제이다.</p>
<p>이 문제를 풀때 효율성에 몇번 걸렸었는데 <strong>주의할점</strong>이 있다.</p>
<ul>
<li>String substring() or StringBuilder reverse() 사용하면 효율성1번에서 계속 걸립니다.(둘다 구현된걸 사용하지말고 직접 해야됩니다)</li>
</ul>
<p><strong>풀이방법</strong></p>
<ol>
<li>큰범위 부터 줄여나가는식 루프</li>
<li>인덱스가 0인것 부터 시작하는 루프</li>
<li>해당 문자열값 시작순서, 끝순서 문자값 구해서 계속비교 시도필요
(원래 reverse()사용하다가 효율성에서 계속걸렸습니다 쩝)</li>
</ol>
<p>좋아요 받은 코드가 없어서 제가 작성한 것만 올립니다...</p>
<h2 id="⛳-내가-작성한-코드">⛳ 내가 작성한 코드</h2>
<pre><code class="language-java">class Solution {
    public int solution(String s) {

        for(int i = s.length(); i &gt; 0; i--) {
            for(int j = 0; j+i &lt;= s.length(); j++) {
                if(isPalindrome(s, j, j+i-1)) return i;
            }
        }

        return 0;
    }

    boolean isPalindrome(String value, int start, int end) {
        while(start &lt;= end) {
            if(value.charAt(start++) != value.charAt(end--)) return false;
        }
        return true;
    }
}
</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 입국심사(Java)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%85%EA%B5%AD%EC%8B%AC%EC%82%ACJava</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%9E%85%EA%B5%AD%EC%8B%AC%EC%82%ACJava</guid>
            <pubDate>Thu, 22 Sep 2022 01:54:59 GMT</pubDate>
            <description><![CDATA[<h2 id="🎏-설명">🎏 설명</h2>
<p><strong>레벨: 3</strong>
<strong>언어: 자바(Java)</strong></p>
<img src="https://velog.velcdn.com/images/jp-share/post/356a459b-c371-4641-ba39-9197a02c423d/image.jpg">
<img src="https://velog.velcdn.com/images/jp-share/post/1f346bed-d6e6-4666-9c33-0fe38099876b/image.jpg">

<h2 id="🃏-느낀점">🃏 느낀점</h2>
<p>해당 문제는 <strong>이분탐색</strong>문제입니다.
이분탐색 문제를 풀어본 경우가 있어 어떠한 지점을 포커스를 두고 풀어내야할지 생각을 해봤습니다..</p>
<p><strong>풀이방법</strong></p>
<ol>
<li>루프돌리기, 한 심사위원만 사용하여 최소시간으로 끝낼수 있는 경우 배열 sorting</li>
<li>최대값으로 한 심사위원만 사용하여 최소시간으로 끝낼수 있는 경우 대입</li>
<li>이분탐색 시도 중간값, 해당시간때 발생할수 있는 사람수 변수 선언</li>
<li>시간때별로 발생할수 있는 사람 경우 변수 대입</li>
<li>최소값, 최대값 범위차이 끝까지 줄이기</li>
<li>이분탐색이 더 불가한경우에 반환</li>
</ol>
<p>가장 좋아요 많이 받은 코드랑 비교해보겠습니다
차이점은</p>
<ol>
<li>재귀호출 방식</li>
<li>제가 한 방식은 사람수 더해가기, 좋아요 많이 받은코드는 사람수 빼기(사실 별차이 없습니다 ㅎㅎ)</li>
</ol>
<p>이로 인한 차이는 좋아요 많이 받은 코드는
메서드 콜스택에 누적되서 공간복잡도가 더 든다고 생각합니다</p>
<p>나머지는 풀이방법 비슷합니다(사실 2분탐색 풀이방법은 비슷비슷합니다)</p>
<h2 id="🎲-내가-작성한-코드">🎲 내가 작성한 코드</h2>
<pre><code class="language-java">import java.util.*;

class Solution {
    public long solution(int n, int[] times) {
        Arrays.sort(times);
        long start = 0,
             end = (long) times[0] * (long) n;

        while(start &lt;= end) {
            long mid = (start + end) / 2,
                 humans = 0;

            for(int i = 0; i &lt; times.length; i++) humans += mid / times[i];

            if(humans &gt;= n) end = mid - 1;
            else start = mid + 1;
        }

        return start;
    }
}</code></pre>
<h2 id="🎯-가장-좋아요-많이-받은-코드">🎯 가장 좋아요 많이 받은 코드</h2>
<pre><code class="language-java">import java.util.Arrays;

class Solution {
    public int solution(int n, int[] times) {
        Arrays.sort(times);
        return (int) find((long) n, times, (long) times.length, times[0], (long) ((long) times[0] * (long) n));
    }

    public long find(long n, int[] times, long nExamination, long from, long to) {
        long minTime;
        long tmp = n;
        if (from == to) {
            return from;
        }
        else {
            minTime = (from + to) / 2;// + ((from + to) % 2 == 1? 1 : 0);
            for (int i = 0; i &lt; nExamination; i++) {
                tmp -=  minTime / (long) times[i];
            }
            if (tmp &gt; 0) {
                return find(n, times, nExamination, minTime + 1, to);
            }
            else {
                return find(n, times, nExamination, from, minTime);
            }
        }
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 아이템 줍기(Java)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%95%84%EC%9D%B4%ED%85%9C-%EC%A4%8D%EA%B8%B0Java</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%95%84%EC%9D%B4%ED%85%9C-%EC%A4%8D%EA%B8%B0Java</guid>
            <pubDate>Sun, 18 Sep 2022 14:49:27 GMT</pubDate>
            <description><![CDATA[<h2 id="🧶-설명">🧶 설명</h2>
<p><strong>레벨</strong>: 3
<strong>언어</strong>: 자바(Java)</p>
<img src="https://velog.velcdn.com/images/jp-share/post/169cf26c-42d0-44cb-aac2-8354e3e0ecd9/image.jpg" style="margin: 0; padding: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/edbfcb27-173a-4ed4-9820-a3fc922bce5f/image.jpg" style="margin: 0; padding: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/f4aec39a-dffe-463d-b083-68f8bd54fec4/image.jpg" style="margin: 0; padding: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/9cd71e93-4464-47c0-941c-5d3e4d374b69/image.jpg" style="margin: 0; padding: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/d362ee04-e7f9-4b38-aa50-8abb5237a313/image.jpg" style="margin: 0; padding: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/fe661cee-0126-4360-889e-b07e833a6efe/image.jpg" style="margin: 0; padding: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/cdd69df9-42dd-42ee-ba3f-522a419e3b20/image.jpg" style="margin: 0; padding: 0;">


<h2 id="👜-느낀점">👜 느낀점</h2>
<p>이문제는 너비우선탐색 문제인데,
사각형들의 모음으로 외변을 따라서 길을 이용해야되는데
풀어보니 주의할점이 2가지 있더라(아래 사진을 준비했다)</p>
<img src="https://velog.velcdn.com/images/jp-share/post/7bab7a4b-bac8-48ac-a151-2ec38f94e317/image.jpg">

<h4 id="주의할점">주의할점</h4>
<ol>
<li>(보라색 표시) 직사각형이 겹치면 해당경로들이 안쪽으로 들어가는데 이경우 제외 필요</li>
<li>(하늘색 표시) 좌표로 표시하면 (3,5) 와 (3,6)이 방문가능한 경로인데 단순하게 가능한 경우로 했을시 하늘색으로 표시해둔 경로로 이동되는 경우가 있다 이를 어떻게 해야될지??</li>
</ol>
<p>풀이방법에서 주의할점을 같이 말씀드려보겠습니다.</p>
<ol>
<li>Boolean 배열은 준비한다(상태가 null, true, false 3개 필요)</li>
<li>하늘색 표시한것처럼 단순히 지금숫자대로 이용하면 예외케이스가 발생하는 경우가 있어서 전체적인 숫자를 2배로 불린다.(하늘색 표시일경우 바로 맞다지가 않게됨)</li>
<li>직사각형 루프를 돌리고 Boolean 배열 기본값이 null인데, 직사각형 내부에 있는 좌표들은 다 false처리를 하고 빗변은 true로 하는데, 다른 직사각형을 다시 확인시 안되는 경로들은 true 변경하지 못하게 하고, 확인안한 null일 경우만 true 변경이 가능하게 하기위함입니다</li>
<li>첫번째 위치와 이동에 따른 흔적을 담을 queue 선언</li>
<li>도착위치가 같고 카운팅숫자가 루프돌리면서 얻은 최소치보다 아래면 값 변경</li>
<li>좌표외 위치일시 길이 아닌곳인 경우는 제외</li>
<li>최종적으로 2배 불린걸 나누기 2로해서 반환</li>
</ol>
<p>이런 방식으로 풀었습니다</p>
<h2 id="⛑-내가-작성한-코드">⛑ 내가 작성한 코드</h2>
<pre><code class="language-java">import java.util.*;

class Solution {
    static final int[] moveX = new int[]{1, -1, 0, 0},
                        moveY = new int[]{0, 0, 1, -1};

    static class Node {
        int x;
        int y;
        int count;

        public Node(int x, int y, int count) {
            this.x = x;
            this.y = y;
            this.count = count;
        }
    }


    public int solution(int[][] rectangle, int characterX, int characterY, int itemX, int itemY) {
        Boolean[][] roadway = new Boolean[102][102];

        characterX *= 2;
        characterY *= 2;
        itemX *= 2;
        itemY *= 2;

        for(int i = 0; i &lt; rectangle.length; i++) {
            int[] nowRec = rectangle[i];

            for(int j = 0; j &lt; 4; j++) nowRec[j] *= 2;

            for(int x = nowRec[0]; x &lt;= nowRec[2]; x++) {
                for(int y = nowRec[1]; y &lt;= nowRec[3]; y++) {
                    roadway[x][y] = (x == nowRec[0] || x == nowRec[2] ||
                                     y == nowRec[1] || y == nowRec[3]) &amp;&amp; roadway[x][y] != Boolean.FALSE;   
                }
            }

        }

        Queue&lt;Node&gt; queue = new LinkedList&lt;&gt;();
        roadway[characterX][characterY] = false;
        queue.offer(new Node(characterX, characterY, 0));

        int min = Integer.MAX_VALUE;
        while(!queue.isEmpty()) {
            Node node = queue.poll();

            if(node.x == itemX &amp;&amp; node.y == itemY &amp;&amp; min &gt; node.count) {
                min = node.count;
                continue;
            }

            for(int i = 0; i &lt; 4; i++) {
                int x = node.x + moveX[i], y = node.y + moveY[i];
                if(x &lt; 2 || y &lt; 2 || x &gt; 100 || y &gt; 100) continue;
                if(roadway[x][y] != Boolean.TRUE) continue;

                roadway[x][y] = false;
                queue.offer(new Node(x, y, node.count + 1));
            }


        }

        return min / 2;
    }
}</code></pre>
<h2 id="🏅-가장-좋아요-많이-받은-코드">🏅 가장 좋아요 많이 받은 코드</h2>
<pre><code class="language-java">import java.util.*;

class Solution {
    static String[][] shape;
    static int startX, startY, targetX, targetY, answer, total;
    public int solution(int[][] rectangle, int characterX, int characterY, int itemX, int itemY) {
        shape = new String[52][52];
        startX = characterX; startY = characterY; targetX = itemX; targetY = itemY; 
        answer = total = 0;

        for(int i=0; i&lt;52; i++) Arrays.fill(shape[i],&quot;&quot;); // &quot;&quot;로 초기화

        for(int[] xy : rectangle){
            int leftX = xy[0], rightX = xy[2], leftY = xy[1], rightY = xy[3];

            // 꼭지점 (왼쪽아래(LDX), 오른쪽아래(RDX), 왼쪽위(LUX), 오른쪽위(RUX))
            shape[leftX][leftY] = &quot;LDX&quot;; shape[rightX][leftY] = &quot;RDX&quot;; shape[leftX][rightY] = &quot;LUX&quot;; shape[rightX][rightY] = &quot;RUX&quot;;

            for(int x=leftX+1; x&lt;rightX; x++){// 상(U), 하(D)
                shape[x][rightY] += &quot;U&quot;; shape[x][leftY] += &quot;D&quot;;
            }

            for(int y=leftY+1; y&lt;rightY; y++){// 좌(L), 우(R)
                shape[leftX][y] += &quot;L&quot;; shape[rightX][y] += &quot;R&quot;;
            }
        }

        followLine(characterX, characterY);

        return Math.min(answer, total-answer);
    }

    public void followLine(int x, int y){
        String location = shape[x][y];
        if(location.equals(&quot;RU&quot;) || location.equals(&quot;UR&quot;) || location.equals(&quot;LUX&quot;) || location.equals(&quot;U&quot;))  x++;
        if(location.equals(&quot;LD&quot;) || location.equals(&quot;DL&quot;) || location.equals(&quot;RDX&quot;) || location.equals(&quot;D&quot;))  x--;
        if(location.equals(&quot;LU&quot;) || location.equals(&quot;UL&quot;) || location.equals(&quot;LDX&quot;) || location.equals(&quot;L&quot;))  y++;
        if(location.equals(&quot;RD&quot;) || location.equals(&quot;DR&quot;) || location.equals(&quot;RUX&quot;) || location.equals(&quot;R&quot;))  y--;
        total++;
        if(x == targetX &amp;&amp; y == targetY)    answer = total;
        if(x == startX &amp;&amp; y == startY)      return;
        followLine(x, y);
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - [3차] 압축(Java)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-3%EC%B0%A8-%EC%95%95%EC%B6%95Java</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-3%EC%B0%A8-%EC%95%95%EC%B6%95Java</guid>
            <pubDate>Sun, 18 Sep 2022 11:29:07 GMT</pubDate>
            <description><![CDATA[<h2 id="🎢-설명">🎢 설명</h2>
<p><strong>레벨</strong>: 2
<strong>언어</strong>: 자바(Java)</p>
<img src="https://velog.velcdn.com/images/jp-share/post/d6bb7ebd-9de7-4135-9173-3b4d8175f81b/image.jpg" style="margin: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/f940784f-5b52-4f2b-8c9b-0a6ceeebfa6c/image.jpg" style="margin: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/f3f9a069-9662-41a3-9c96-a004a03e4a26/image.jpg" style="margin: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/81065341-bdcc-41db-814a-5834a1aa8a90/image.jpg" style="margin: 0;">



<h2 id="🎫-느낀점">🎫 느낀점</h2>
<p>해당 문제는 알고리즘 문제라기보단 적절한 자료구조를 이용하면 풀수 있는문제입니다..
간단하지는 않으니 레벨2로 분류된듯 싶습니다.</p>
<p>저의 풀이방법을 대해 설명드리면</p>
<ol>
<li>순차적이며 필요할때는 다음단어를 꺼내쓰기위해 단어들 queue에 저장</li>
<li>사전역할을 할 list 변수 stream으로 초기화</li>
<li>결과값 담아서 나중에는 배열로 변경할 list 변수</li>
<li>queue에 있는 것과 현재 지금 확인중인 단어가 비어있는지 여부로 루프</li>
<li>해당하는 값이 사전에 있다면 다음단어 포함시켜서 확인시도</li>
<li>해당하는 값이 없다면 현재값에 다음단어 포함시켜서 사전등록 및 인덱스값 저장</li>
</ol>
<p>이런식으로 풀었습니다</p>
<ol>
<li>사전변수 역할 dic과 결과 result 선언 및 초기화</li>
<li>A ~ Z까지 dic변수에 값 추가</li>
<li>msg 순차적인 루프와 dic 역 루프 조회를 하는데</li>
<li>msg 순차적으로 돌때 현재 인덱스 이후의 문자열값에서 최근 사전에 등록된 단어 순을 기준으로 앞자리부분이 같은 경우가 있는지 먼저 확인 (제가 작성한 코드보다 시간복잡도가 더 좋게 나올듯 싶습니다)</li>
<li>현재 사전에서 구한값길이 -1을 변수에 대입 및 결과 인덱스값을 추가</li>
<li>사전에서 구한값길이 더한거랑 msg 길이를 비교하는데 (이게 마지막단어가 사전에 안들어가는 경우를 계산하기 위해서인듯?)</li>
<li>나머지는 배열로 변환해서 반환</li>
</ol>
<p>공간복잡도, 시간복잡도 면에서는 좋아요 많이 받은 코드가 더 나은듯 싶습니다!</p>
<h2 id="🥿-내가-작성한-코드">🥿 내가 작성한 코드</h2>
<pre><code class="language-java">import java.util.*;
import java.util.stream.*;

class Solution {

    public int[] solution(String msg) {

        Queue&lt;String&gt; queue = new LinkedList&lt;&gt;();

        for(String word: msg.split(&quot;&quot;)) {
            queue.offer(word);
        }

        List&lt;String&gt; list = IntStream.range(&#39;A&#39;, &#39;Z&#39;+1)
            .mapToObj(val -&gt; String.valueOf((char) val))
            .collect(Collectors.toList());

        List&lt;Integer&gt; result = new ArrayList&lt;&gt;();

        String value = &quot;&quot;;
        while(!queue.isEmpty() || !&quot;&quot;.equals(value)) {
            if(list.contains(value + queue.peek())) {   
                value = value + queue.poll();
                continue;
            }

            list.add(value+queue.peek());
            result.add(list.indexOf(value)+1);
            value = &quot;&quot;;
        }


        return result.stream()
            .mapToInt(val -&gt; val.intValue())
            .toArray();
    }
}</code></pre>
<h2 id="🏀-가장-좋아요-많이-받은-코드">🏀 가장 좋아요 많이 받은 코드</h2>
<pre><code class="language-java">import java.util.ArrayList;

class Solution {
  public int[] solution(String msg) {
    ArrayList&lt;String&gt; dic = new ArrayList&lt;String&gt;();
    ArrayList&lt;Integer&gt; result = new ArrayList&lt;Integer&gt;();

    for(int i = 0 ; i &lt; 26; i++) {
        dic.add(String.valueOf((char)(&#39;A&#39;+i)));
    }

    for(int i = 0 ; i &lt; msg.length() ; i++) {
        for(int j = dic.size()-1 ; j &gt;= 0 ; j--) {
            if(msg.substring(i).startsWith(dic.get(j))) {
                i += dic.get(j).length()-1;
                result.add(j+1);
                if(i+1 &lt; msg.length())
                    dic.add(dic.get(j)+msg.charAt(i+1));
                break;
            }
        }
    }

    int[] answer = new int[result.size()];

    for(int i = 0 ; i &lt; result.size() ; i++) 
        answer[i] = result.get(i);

    return answer;  
  }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - k진수에서 소수 개수 구하기(Java)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-k%EC%A7%84%EC%88%98%EC%97%90%EC%84%9C-%EC%86%8C%EC%88%98-%EA%B0%9C%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0Java</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-k%EC%A7%84%EC%88%98%EC%97%90%EC%84%9C-%EC%86%8C%EC%88%98-%EA%B0%9C%EC%88%98-%EA%B5%AC%ED%95%98%EA%B8%B0Java</guid>
            <pubDate>Sun, 18 Sep 2022 10:17:35 GMT</pubDate>
            <description><![CDATA[<h2 id="😗-설명">😗 설명</h2>
<p><strong>레벨</strong>: 2
<strong>언어</strong>: 자바(Java)</p>
<img src="https://velog.velcdn.com/images/jp-share/post/2a3524b8-f0cf-4d32-9afa-f1300a2f2da0/image.jpg" style="margin-bottom: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/6ce8a3e9-53d5-4acb-b314-886094704577/image.jpg" style="margin-top: 0;">

<h2 id="🐕-느낀점">🐕 느낀점</h2>
<p>레벨 2중에서도 쉬운문제가 아닐까 싶다..
요즘에 코테능력이 오른건가 내 기분상 쉽게풀리는데</p>
<p>해당문제를 근본적으로 살펴보면 0 제외한 숫자들을 뽑아내서 소수체크를 하는 문제인데
저의 풀이방법은 다음과 같습니당</p>
<ol>
<li>Integer 메서드인 toString 으로 진법변환을 시도</li>
<li>정규식을 사용해서(0 하나이상 일경우 split)</li>
<li>소수체킹을 합니다</li>
</ol>
<p>처음에 이문제를 풀고 중간에 런타임에러가 발생했는데.. 빈문자열이 들어갔나싶었더니
overflowException이 발생하지 않았을까 싶어서 Integer -&gt; Long으로 변경했습니다.</p>
<p>좋아요 많이받은코드 풀이방법을 살펴보면</p>
<ol>
<li>제가 한방식처럼 Integer.toString 사용</li>
<li>split을 단지 0으로만하면 00 이런식으로 연속으로 붙는경우 해당사이 빈문자열값이 배열에 들어갑니다.</li>
<li>그래서 루프돌때 length 체킹해서 빈문자열 넘기고, 1일 경우도 소수이니 넘기고</li>
<li>루프돌리면서 소수체킹하네요</li>
</ol>
<p>흐름을 보면 저랑 비슷한코드입니다.</p>
<p>음 마지막으로 생각해보니 stream으로 좀더 간결하게 할수있었겠네용!</p>
<h2 id="🐽-내가-작성한-코드">🐽 내가 작성한 코드</h2>
<pre><code class="language-java">class Solution {
    public int solution(int n, int k) {

        int answer = 0;
        for(String value: Integer.toString(n, k).split(&quot;[0]+&quot;)) {
            if(isPrime(Long.valueOf(value))) answer++;
        }

        return answer;
    }

    boolean isPrime(long value) {
        if(value &lt; 2) return false;

        for(int i = 2; i &lt;= (int) Math.sqrt(value); i++) {
            if(value % i == 0) return false;
        }

        return true;
    }
}</code></pre>
<h2 id="🐚-좋아요-가장-많이-받은-코드">🐚 좋아요 가장 많이 받은 코드</h2>
<pre><code class="language-java">class Solution {
    public int solution(int n, int k) {

        int ans = 0;
        String temp[] = Integer.toString(n, k).split(&quot;0&quot;);

        Loop : for(String t : temp) {
            if(t.length() == 0) continue;
            long a = Long.parseLong(t);
            if(a == 1) continue;
            for(int i=2; i&lt;=Math.sqrt(a); i++)
                if(a%i == 0) continue Loop;

            ans++;
        }
        return ans;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - 주차 요금 계산(Java)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A3%BC%EC%B0%A8-%EC%9A%94%EA%B8%88-%EA%B3%84%EC%82%B0Java</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EC%A3%BC%EC%B0%A8-%EC%9A%94%EA%B8%88-%EA%B3%84%EC%82%B0Java</guid>
            <pubDate>Sat, 17 Sep 2022 10:57:17 GMT</pubDate>
            <description><![CDATA[<h2 id="😽-설명">😽 설명</h2>
<p><strong>레벨</strong>: 2
<strong>언어</strong>: 자바(Java)</p>
<img src="https://velog.velcdn.com/images/jp-share/post/95a3546a-5f2f-4ba8-ac7f-5cd00f00d9e9/image.jpg" style="margin-top: 0; margin-bottom: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/1c53aa82-695d-4f98-a477-59c80cc16fd6/image.jpg" style="margin-top: 0; margin-bottom: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/9c255f61-da1c-4015-a752-57a5baa1b540/image.jpg" style="margin-top: 0; margin-bottom: 0;">
<img src="https://velog.velcdn.com/images/jp-share/post/5767c9fc-bc67-4722-9e23-e8d05bb375b9/image.jpg" style="margin-top: 0; margin-bottom: 0;">


<h2 id="🐹-느낀점">🐹 느낀점</h2>
<p>해당 문제는 알고리즘 활용보단 자료구조 활용하는방식인 문제라고 생각합니다
난이도도 사실상 어렵다기보단 계산으로 인한 코드가 많은 문제라고 볼수있습니다.</p>
<p>저의 풀이방법은</p>
<ol>
<li>records 배열에 있는 차량별 입출입 기록들을 queue에 넣어서 순차처리예정이며</li>
<li>추출해낸 차량별 입출이 기록들을 queue에서 뽑아내어 입출입 시간간격을 구하고(출입 없을시 23:59 값 대입)</li>
<li>입출입 시간간격에 따른 계산 진행</li>
<li>차량번호 낮은순으로 비용값 배열 반환
이런 방식으로 풀었습니다</li>
</ol>
<p>가장 좋아요 많이 받은 코드를 분석해보면</p>
<ol>
<li>records 배열에 있는 값 추출</li>
<li>제가 했던방식과는 별개로 Queue에 넣지않고 +- 바로 구해서 넣는방식</li>
<li>계산비용을 구하기 위한 루프 및 계산처리로 배열반환</li>
</ol>
<p>최종적으로 느낀게 queue를 안사용하고 풀수있었으며, 가장 좋아요 많이 받은 코드에서 map에서 for문 다시 돌리기보단 제가 했던 stream으로 반환식으로 했으면 좀 더 보기 좋지 않았을까 생각해봅니당~~</p>
<h2 id="🦥-내가-작성한-코드">🦥 내가 작성한 코드</h2>
<pre><code class="language-java">import java.util.*;

class Solution {
    private static final String IN = &quot;IN&quot;, OUT = &quot;OUT&quot;;

    static class InOut{
        int time;
        String type;

        public InOut(String time, String type) {
            String[] hourMin = time.split(&quot;:&quot;);
            this.time = Integer.valueOf(hourMin[0]) * 60 + Integer.valueOf(hourMin[1]);
            this.type = type;
        }
    }

    public int[] solution(int[] fees, String[] records) {
        Map&lt;String, Queue&lt;InOut&gt;&gt; map = new HashMap&lt;&gt;();

        for(String record: records) {
            String[] recordArr = record.split(&quot; &quot;);
            Queue&lt;InOut&gt; queue = map.getOrDefault(recordArr[1], new LinkedList&lt;InOut&gt;());
            queue.offer(new InOut(recordArr[0], recordArr[2]));
            map.put(recordArr[1], queue);
        }

        Map&lt;String, Integer&gt; resultMap = new HashMap&lt;&gt;();
        for(String carNum: map.keySet()) {
            Queue&lt;InOut&gt; queue = map.get(carNum);
            int range = 0;
            while(!queue.isEmpty()) {
                InOut in = queue.poll();

                InOut out = queue.isEmpty()
                    ? new InOut(&quot;23:59&quot;, OUT)
                    : queue.poll();

                range += out.time - in.time;
            }

            int pay = resultMap.getOrDefault(carNum, 0);

            range = range - fees[0];
            pay += fees[1];

            if(range &gt; 0) {
                pay += Math.ceil((double) range / fees[2]) * fees[3];
            };

            resultMap.put(carNum, pay);
        }

        return resultMap.keySet()
            .stream()
            .sorted()
            .map(key -&gt; resultMap.get(key))
            .mapToInt(val -&gt; val.intValue())
            .toArray();
    }
}</code></pre>
<h2 id="🦎-좋아요-가장-많이받은-코드">🦎 좋아요 가장 많이받은 코드</h2>
<pre><code class="language-java">import java.util.*;

class Solution {

    public int timeToInt(String time) {
        String temp[] = time.split(&quot;:&quot;);
        return Integer.parseInt(temp[0])*60 + Integer.parseInt(temp[1]);
    }
    public int[] solution(int[] fees, String[] records) {

        TreeMap&lt;String, Integer&gt; map = new TreeMap&lt;&gt;();

        for(String record : records) {
            String temp[] = record.split(&quot; &quot;);
            int time = temp[2].equals(&quot;IN&quot;) ? -1 : 1;
            time *= timeToInt(temp[0]);
            map.put(temp[1], map.getOrDefault(temp[1], 0) + time);
        }
        int idx = 0, ans[] = new int[map.size()];
        for(int time : map.values()) {
            if(time &lt; 1) time += 1439;
            time -= fees[0];
            int cost = fees[1];
            if(time &gt; 0)
                cost += (time%fees[2] == 0 ? time/fees[2] : time/fees[2]+1)*fees[3];

            ans[idx++] = cost;
        }
        return ans;
    }
}</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[[코딩테스트] 프로그래머스 - n^2 배열 자르기(Java)]]></title>
            <link>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-n2-%EB%B0%B0%EC%97%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0Java</link>
            <guid>https://velog.io/@jp-share/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-n2-%EB%B0%B0%EC%97%B4-%EC%9E%90%EB%A5%B4%EA%B8%B0Java</guid>
            <pubDate>Sat, 17 Sep 2022 09:48:49 GMT</pubDate>
            <description><![CDATA[<h2 id="🤕-설명">🤕 설명</h2>
<p><strong>레벨</strong>: 2
<strong>언어</strong>: 자바(Java)</p>
<img src="https://velog.velcdn.com/images/jp-share/post/da9d59fa-10c8-4df3-9daf-1dac46f761e4/image.jpg">

<h2 id="🤡-느낀점">🤡 느낀점</h2>
<p>해당 문제는 2차원배열에서 i or j 값이 해당값일시 그값은 배열에 대입후
1차원배열로 변환한 다음에 주어진 범위의 배열값을 도출하는 문제입니다..</p>
<p>배열을 만들고 해당값을 도출하면 시간초과가 되어서
해당문제를 접근할때는 해당범위를 이용해서 그값을 역으로 도출하는식으로 가야됩니다.</p>
<ol>
<li>저는 그래서 left, right 범위를 루프로 돌리면서</li>
<li>현재 값이 2차원배열로 표현식 x, y 값을 구하고</li>
<li>둘중의 큰값인 경우가 해당값으로 대입되니 그값을 도출하는 식으로 변경 및 반환</li>
</ol>
<p>이런 방식으로 풀었습니다.</p>
<p>좋아요 가장많이 받은코드는 stream 이용했는데 쩝 생각해보니
stream으로 하면 더 간결하겠다는 생각이 들었습니다 ㅎㅎㅎ</p>
<h2 id="🐕-내가-작성한-코드">🐕 내가 작성한 코드</h2>
<pre><code class="language-java">class Solution {
    public int[] solution(int n, long left, long right) {
        int[] answer = new int[(int)(right - left) + 1];

        for(int idx = 0; left &lt;= right; idx++, left++) {
            answer[idx] = (int) Math.max(left / n, left % n) + 1;
        }

        return answer;
    }
}</code></pre>
<h2 id="🐼-가장-좋아요-많이받은-코드">🐼 가장 좋아요 많이받은 코드</h2>
<pre><code class="language-java">import java.util.Arrays;
import java.util.stream.LongStream;

class Solution {
    public int[] solution(int n, long left, long right) {
        return LongStream.rangeClosed(left, right).mapToInt(value -&gt; (int) (Math.max(value / n, value % n) + 1)).toArray();
    }
}
</code></pre>
]]></description>
        </item>
    </channel>
</rss>