<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Dyllis.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Tue, 04 Jun 2024 14:11:36 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>Dyllis.log</title>
            <url>https://velog.velcdn.com/images/dyllis_lin/profile/8714c3b8-77a8-4867-af59-6eb4187c8274/social_profile.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. Dyllis.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dyllis_lin" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[MySQL] Hacker Rank 문제 연습 8]]></title>
            <link>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-8</link>
            <guid>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-8</guid>
            <pubDate>Tue, 04 Jun 2024 14:11:36 GMT</pubDate>
            <description><![CDATA[<h3 id="weather-observation-station-17-aggregation">Weather Observation Station 17 (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/ee4763c1-99f4-495e-96f2-fbe6314395a9/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT ROUND(LONG_W, 4)
FROM STATION
WHERE LAT_N &gt; 38.7780
ORDER BY LAT_N
LIMIT 1;</code></pre>
<hr>
<h3 id="weather-observation-station-18-aggregation">Weather Observation Station 18 (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/4ca469d5-4430-46cb-a6c7-3b5ef0019dc5/image.png" alt=""></li>
</ul>
<blockquote>
<p>맨헤튼 거리</p>
</blockquote>
<ul>
<li>두 점 사이의 거리를 측정하는 방법 중  하나</li>
<li>두 점 사이의 경로를 구부리지 않고 직선 경로로 계산(좌표 죽에 평행한 경로를 따름)<blockquote>
<p>두 점 P1 = (x1, y1)과 P2 = (x2, y2) 사이의 맨해튼 거리
= |x1 - x2| + |y1 - y2|</p>
</blockquote>
예) 두 점 (1, 2)와 (4, 6) 사이의 맨헤튼 거리
|1 - 4| + |2 - 6|
= 3 + 4
= 7</li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT ROUND((MAX(LAT_N) - MIN(LAT_N)) + (MAX(LONG_W) - MIN(LONG_W)), 4)
FROM STATION;</code></pre>
<hr>
<h3 id="weather-observation-station-19-aggregation">Weather Observation Station 19 (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/47050054-e1f8-4a54-80ee-aef2a0ae2fd7/image.png" alt=""></li>
</ul>
<blockquote>
<p>유클리드 거리</p>
<ul>
<li>두 점 사이의 <strong>직선</strong> 거리를 측정하는 방법(일반적으로 생각하는직선거리) </li>
</ul>
</blockquote>
<ul>
<li>피타고라스의 정리 이용하여 계산</li>
<li>평면 또는 3차원 공간에서 두 점 사이의 최단 경로<blockquote>
<p>두 점 P1 = (x1, y1)과 P2 = (x2, y2) 사이의 유클리드 거리
= √(x2 - x1)^2 + (y2 - y1)^2</p>
</blockquote>
예) 두 점 (1, 2)와 (4, 6) 사이의 유클리드 거리
√(4 - 1)^2 + (6 - 2)^2
= √3^2 + 4^2
= √9 + 16
= √25
= 5</li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT ROUND(POWER(POWER(MAX(LAT_N)-MIN(LAT_N),2) + POWER(MAX(LONG_W)-MIN(LONG_W), 2), 0.5), 4) 
FROM STATION;</code></pre>
<hr>
<h3 id="population-census-basic-join">Population Census (Basic Join)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/4ca6a84e-3221-4620-a732-49ca1275f68b/image.png" alt=""><img src="https://velog.velcdn.com/images/dyllis_lin/post/ebbb4e04-dc43-4680-8afc-fe3de792d3f4/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT SUM(CITY.POPULATION) 
FROM CITY 
JOIN COUNTRY 
ON CITY.COUNTRYCODE = COUNTRY.CODE 
WHERE CONTINENT = &#39;ASIA&#39;;</code></pre>
<hr>
<h3 id="african-cities-basic-join">African Cities (Basic Join)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/44c926c7-c2d9-4e2b-a57a-8bc44dc9361e/image.png" alt=""><img src="https://velog.velcdn.com/images/dyllis_lin/post/e1965f1e-bdab-4791-916e-f3992b695fdd/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT CI.NAME
FROM CITY CI
JOIN COUNTRY CO
ON CI.COUNTRYCODE = CO.CODE
WHERE CO.CONTINENT = &#39;AFRICA&#39;;</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 알고리즘 연습 22 (프로그래머스)]]></title>
            <link>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-22-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</link>
            <guid>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-22-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</guid>
            <pubDate>Tue, 04 Jun 2024 14:06:05 GMT</pubDate>
            <description><![CDATA[<h3 id="택배-상자-연습문제">택배 상자 (연습문제)</h3>
<ul>
<li><p>영재는 택배상자를 트럭에 싣는 일을 합니다. 영재가 실어야 하는 택배상자는 크기가 모두 같으며 1번 상자부터 n번 상자까지 번호가 증가하는 순서대로 컨테이너 벨트에 일렬로 놓여 영재에게 전달됩니다. 컨테이너 벨트는 한 방향으로만 진행이 가능해서 벨트에 놓인 순서대로(1번 상자부터) 상자를 내릴 수 있습니다. 하지만 컨테이너 벨트에 놓인 순서대로 택배상자를 내려 바로 트럭에 싣게 되면 택배 기사님이 배달하는 순서와 택배상자가 실려 있는 순서가 맞지 않아 배달에 차질이 생깁니다. 따라서 택배 기사님이 미리 알려준 순서에 맞게 영재가 택배상자를 실어야 합니다.<br>
만약 컨테이너 벨트의 맨 앞에 놓인 상자가 현재 트럭에 실어야 하는 순서가 아니라면 그 상자를 트럭에 실을 순서가 될 때까지 잠시 다른 곳에 보관해야 합니다. 하지만 고객의 물건을 함부로 땅에 둘 수 없어 보조 컨테이너 벨트를 추가로 설치하였습니다. 보조 컨테이너 벨트는 앞 뒤로 이동이 가능하지만 입구 외에 다른 면이 막혀 있어서 맨 앞의 상자만 뺄 수 있습니다(즉, 가장 마지막에 보조 컨테이너 벨트에 보관한 상자부터 꺼내게 됩니다). 보조 컨테이너 벨트를 이용해도 기사님이 원하는 순서대로 상자를 싣지 못 한다면, 더 이상 상자를 싣지 않습니다.<br>
예를 들어, 영재가 5개의 상자를 실어야 하며, 택배 기사님이 알려준 순서가 기존의 컨테이너 벨트에 네 번째, 세 번째, 첫 번째, 두 번째, 다섯 번째 놓인 택배상자 순서인 경우, 영재는 우선 첫 번째, 두 번째, 세 번째 상자를 보조 컨테이너 벨트에 보관합니다. 그 후 네 번째 상자를 트럭에 싣고 보조 컨테이너 벨트에서 세 번째 상자 빼서 트럭에싣습니다. 다음으로 첫 번째 상자를 실어야 하지만 보조 컨테이너 벨트에서는 두 번째 상자를, 기존의 컨테이너 벨트에는 다섯 번째 상자를 꺼낼 수 있기 때문에 더이상의 상자는 실을 수 없습니다. 따라서 트럭에는 2개의 상자만 실리게 됩니다.<br>
택배 기사님이 원하는 상자 순서를 나타내는 정수 배열 <code>order</code>가 주어졌을 때, 영재가 몇 개의 상자를 실을 수 있는지 return 하는 solution 함수를 완성하세요.<br></p>
<ul>
<li>제한사항<ul>
<li>1 ≤ <code>order</code>의 길이 ≤ 1,000,000</li>
<li><code>order</code>는 1이상 <code>order</code>의 길이 이하의 모든 정수가 한번씩 등장합니다.</li>
<li><code>order[i]</code>는 기존의 컨테이너 벨트에 <code>order[i]</code>번째 상자를 i+1번째로 트럭에 실어야 함을 의미합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(order):
    stack = []
    order_idx = 0
    n = len(order)

    for box in range(1, n + 1):
        stack.append(box)
        while stack and stack[-1] == order[order_idx]:
            stack.pop()
            order_idx += 1

    return order_idx</code></pre>
<hr>
<h3 id="큰-수-만들기-탐욕법greedy">큰 수 만들기 (탐욕법(Greedy))</h3>
<ul>
<li><p>어떤 숫자에서 k개의 수를 제거했을 때 얻을 수 있는 가장 큰 숫자를 구하려 합니다.<br>
예를 들어, 숫자 1924에서 수 두 개를 제거하면 [19, 12, 14, 92, 94, 24] 를 만들 수 있습니다. 이 중 가장 큰 숫자는 94 입니다.<br>
문자열 형식으로 숫자 number와 제거할 수의 개수 k가 solution 함수의 매개변수로 주어집니다. number에서 k 개의 수를 제거했을 때 만들 수 있는 수 중 가장 큰 숫자를 문자열 형태로 return 하도록 solution 함수를 완성하세요.<br></p>
<ul>
<li>제한사항<ul>
<li>number는 2자리 이상, 1,000,000자리 이하인 숫자입니다.</li>
<li>k는 1 이상 <code>number의 자릿수</code> 미만인 자연수입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(number, k):
    stack = []
    for num in number:
        while k &gt; 0 and stack and stack[-1] &lt; num:
            stack.pop()
            k -= 1
        stack.append(num)

    # k가 남아있는 경우 처리 (남아있는 k만큼 뒤에서 자름)
    if k &gt; 0:
        stack = stack[:-k]

    return &#39;&#39;.join(stack)</code></pre>
<hr>
<h3 id="삼각-달팽이-">삼각 달팽이 ()</h3>
<ul>
<li><p>정수 n이 매개변수로 주어집니다. 다음 그림과 같이 밑변의 길이와 높이가 n인 삼각형에서 맨 위 꼭짓점부터 반시계 방향으로 달팽이 채우기를 진행한 후, 첫 행부터 마지막 행까지 모두 순서대로 합친 새로운 배열을 return 하도록 solution 함수를 완성해주세요.<br>
<img src="https://velog.velcdn.com/images/dyllis_lin/post/3c2aaf68-ef9e-425e-ba62-27ee59fe774a/image.png" alt=""></p>
<ul>
<li>제한사항<ul>
<li>n은 1 이상 1,000 이하입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(n):
    # 2차원 배열 초기화
    triangle = [[] for _ in range(n)]

    # 각 행의 길이 설정
    for i in range(n):
        triangle[i] = [0] * (i + 1)

    # 방향: 아래(0), 오른쪽(1), 위(2)
    dx = [1, 0, -1]
    dy = [0, 1, -1]

    x, y, num = 0, 0, 1
    direction = 0

    while num &lt;= n * (n + 1) // 2:
        triangle[x][y] = num
        num += 1

        nx, ny = x + dx[direction], y + dy[direction]

        if nx &lt; 0 or ny &lt; 0 or nx &gt;= n or ny &gt; nx or triangle[nx][ny] != 0:
            direction = (direction + 1) % 3
            nx, ny = x + dx[direction], y + dy[direction]

        x, y = nx, ny

    # 2차원 배열을 일차원 배열로 변환
    result = []
    for row in triangle:
        result.extend(row)

    return result</code></pre>
<hr>
<h3 id="연속된-부분-수열의-합-연습-문제">연속된 부분 수열의 합 (연습 문제)</h3>
<ul>
<li><p>비내림차순으로 정렬된 수열이 주어질 때, 다음 조건을 만족하는 부분 수열을 찾으려고 합니다.<br></p>
<ul>
<li>기존 수열에서 임의의 두 인덱스의 원소와 그 사이의 원소를 모두 포함하는 부분 수열이어야 합니다.</li>
<li>부분 수열의 합은 <code>k</code>입니다.</li>
<li>합이 <code>k</code>인 부분 수열이 여러 개인 경우 길이가 짧은 수열을 찾습니다.</li>
<li>길이가 짧은 수열이 여러 개인 경우 앞쪽(시작 인덱스가 작은)에 나오는 수열을 찾습니다.</li>
</ul>
<p>수열을 나타내는 정수 배열 <code>sequence</code>와 부분 수열의 합을 나타내는 정수 <code>k</code>가 매개변수로 주어질 때, 위 조건을 만족하는 부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return 하는 solution 함수를 완성해주세요. 이때 수열의 인덱스는 0부터 시작합니다.</p>
<ul>
<li>제한사항<ul>
<li>5 ≤ <code>sequence</code>의 길이 ≤ 1,000,000<ul>
<li>1 ≤ <code>sequence</code>의 원소 ≤ 1,000</li>
<li><code>sequence</code>는 비내림차순으로 정렬되어 있습니다.</li>
</ul>
</li>
<li>5 ≤ <code>k</code> ≤ 1,000,000,000<ul>
<li><code>k</code>는 항상 sequence의 부분 수열로 만들 수 있는 값입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(sequence, k):
    n = len(sequence)
    start, end = 0, 0
    current_sum = sequence[0]
    min_length = float(&#39;inf&#39;)
    best_range = [0, 0]

    while start &lt; n and end &lt; n:
        if current_sum == k:
            if (end - start) &lt; min_length:
                min_length = end - start
                best_range = [start, end]

            # Move start to reduce the window size
            current_sum -= sequence[start]
            start += 1
        elif current_sum &lt; k:
            # Expand the window
            end += 1
            if end &lt; n:
                current_sum += sequence[end]
        else:
            # Shrink the window
            current_sum -= sequence[start]
            start += 1

    return best_range</code></pre>
<hr>
<h3 id="두-큐-합-같게-만들기-2022-kakao-tech-internship">두 큐 합 같게 만들기 (2022 KAKAO TECH INTERNSHIP)</h3>
<ul>
<li>길이가 같은 두 개의 큐가 주어집니다. 하나의 큐를 골라 원소를 추출(pop)하고, 추출된 원소를 다른 큐에 집어넣는(insert) 작업을 통해 각 큐의 원소 합이 같도록 만들려고 합니다. 이때 필요한 작업의 최소 횟수를 구하고자 합니다. 한 번의 pop과 한 번의 insert를 합쳐서 작업을 1회 수행한 것으로 간주합니다.<Br>
큐는 먼저 집어넣은 원소가 먼저 나오는 구조입니다. 이 문제에서는 큐를 배열로 표현하며, 원소가 배열 앞쪽에 있을수록 먼저 집어넣은 원소임을 의미합니다. 즉, pop을 하면 배열의 첫 번째 원소가 추출되며, insert를 하면 배열의 끝에 원소가 추가됩니다. 예를 들어 큐 [1, 2, 3, 4]가 주어졌을 때, pop을 하면 맨 앞에 있는 원소 1이 추출되어 [2, 3, 4]가 되며, 이어서 5를 insert하면 [2, 3, 4, 5]가 됩니다.<br>
다음은 두 큐를 나타내는 예시입니다.<pre><code> queue1 = [3, 2, 7, 2]
 queue2 = [4, 6, 5, 1]</code></pre>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;두 큐에 담긴 모든 원소의 합은 30입니다. 따라서, 각 큐의 합을 15로
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;만들어야 합니다. 예를 들어, 다음과 같이 2가지 방법이 있습니다.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1. queue2의 4, 6, 5를 순서대로 추출하여 queue1에 추가한 뒤,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue1의 3, 2, 7, 2를 순서대로 추출하여 queue2에 추가합니다. 그
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;결과 queue1은 [4, 6, 5], queue2는 [1, 3, 2, 7, 2]가 되며, 각 큐의 원소
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;합은 15로 같습니다. 이 방법은 작업을 7번 수행합니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2. queue1에서 3을 추출하여 queue2에 추가합니다. 그리고 queue2에서
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4를 추출하여 queue1에 추가합니다. 그 결과 queue1은 [2, 7, 2, 4],
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queue2는 [6, 5, 1, 3]가 되며, 각 큐의 원소 합은 15로 같습니다. 이
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;방법은 작업을 2번만 수행하며, 이보다 적은 횟수로 목표를 달성할 수
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;없습니다.<br></li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;따라서 각 큐의 원소 합을 같게 만들기 위해 필요한 작업의 최소 횟수는
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2입니다.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;길이가 같은 두 개의 큐를 나타내는 정수 배열 queue1, queue2가
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;매개변수로 주어집니다. 각 큐의 원소 합을 같게 만들기 위해 필요한
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;작업의 최소 횟수를 return 하도록 solution 함수를 완성해주세요. 단,
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;어떤 방법으로도 각 큐의 원소 합을 같게 만들 수 없는 경우, -1을 return
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;해주세요.</p>
<ul>
<li>제한사항<ul>
<li>1 ≤ <code>queue1</code>의 길이 = <code>queue2</code>의 길이 ≤ 300,000</li>
<li>1 ≤ ``queue1의 원소, <code>queue2</code>의 원소 ≤ 109<ul>
<li>주의: 언어에 따라 합 계산 과정 중 산술 오버플로우 발생 가능성이 있으므로 long type 고려가 필요합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(queue1, queue2):
    total_sum = sum(queue1) + sum(queue2)
    target_sum = total_sum // 2

    # 전체 합이 홀수라면 불가능
    if total_sum % 2 != 0:
        return -1

    combined = queue1 + queue2
    n = len(queue1)
    max_index = len(combined)

    start, end = 0, n
    current_sum = sum(queue1)
    min_operations = float(&#39;inf&#39;)

    while start &lt; max_index and end &lt; max_index:
        if current_sum == target_sum:
            min_operations = min(min_operations, (start + (end - n)))
            current_sum -= combined[start]
            start += 1
        elif current_sum &lt; target_sum:
            if end &lt; max_index:
                current_sum += combined[end]
                end += 1
            else:
                break
        else:
            current_sum -= combined[start]
            start += 1

    return min_operations if min_operations != float(&#39;inf&#39;) else -1</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] Hacker Rank 문제 연습 7]]></title>
            <link>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5</link>
            <guid>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5</guid>
            <pubDate>Mon, 03 Jun 2024 13:55:00 GMT</pubDate>
            <description><![CDATA[<h3 id="top-earners-aggregation">Top Earners (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/fc2c4bbf-ba25-4127-ae05-96104c83e1a6/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT (SALARY * MONTHS)
       , COUNT(*)
FROM EMPLOYEE
GROUP BY SALARY * MONTHS
ORDER BY SALARY * MONTHS DESC
LIMIT 1;</code></pre>
<hr>
<h3 id="weather-observation-station-13-aggregation">Weather Observation Station 13 (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/ae73444a-50b2-42c2-a5cd-09ce9b51d295/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT ROUND(SUM(LAT_N), 4)
FROM STATION
WHERE LAT_N BETWEEN &#39;38.7880&#39; AND &#39;137.2345&#39;;</code></pre>
<hr>
<h3 id="weather-observation-station-14-aggregation">Weather Observation Station 14 (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/8e56ff51-cec7-43cb-aa8b-191d4d3a959c/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT ROUND(MAX(LAT_N), 4)
FROM STATION 
WHERE LAT_N &lt; &#39;137.2345&#39;;</code></pre>
<hr>
<h3 id="weather-observation-station-15-aggregation">Weather Observation Station 15 (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/a3ab8a91-0220-423c-9e02-81657ff33f07/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT ROUND(LONG_W, 4)
FROM STATION
WHERE LAT_N &lt; 137.2345
ORDER BY LAT_N DESC
LIMIT 1;</code></pre>
<hr>
<h3 id="weather-observation-station-16-aggregation">Weather Observation Station 16 (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/21ff6a25-c58d-4df5-871d-d046b7dfb6bf/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT ROUND(MIN(LAT_N), 4)
FROM STATION
WHERE LAT_N &gt; 38.7780</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 알고리즘 연습 21 (프로그래머스)]]></title>
            <link>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-21-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</link>
            <guid>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-21-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</guid>
            <pubDate>Mon, 03 Jun 2024 13:46:59 GMT</pubDate>
            <description><![CDATA[<h3 id="2개-이하로-다른-비트-월간-코드-챌린지-시즌2">2개 이하로 다른 비트 (월간 코드 챌린지 시즌2)</h3>
<ul>
<li><p>양의 정수 <code>x</code>에 대한 함수 <code>f(x)</code>를 다음과 같이 정의합니다.</p>
<ul>
<li><code>x</code>보다 크고 <code>x</code>와 비트가 1~2개 다른 수들 중에서 제일 작은 수
예를 들어,</li>
<li><code>f(2) = 3</code> 입니다. 다음 표와 같이 2보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 3이기 때문입니다.<br><br>수    비트    다른 &nbsp;&nbsp;비트의 개수
2    &nbsp;&nbsp;000...0010<br>3    &nbsp;&nbsp;000...0011    &nbsp;1<br>
<code>f(7) = 11</code> 입니다. 다음 표와 같이 7보다 큰 수들 중에서 비트가 다른 지점이 2개 이하이면서 제일 작은 수가 11이기 때문입니다.<br>
수  &nbsp;비트    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;다른 비트의 개수
7 &nbsp;&nbsp;&nbsp;000...0111<br>8  &nbsp;&nbsp;&nbsp;000...1000    &nbsp;&nbsp;4
9    &nbsp;&nbsp;&nbsp;000...1001    &nbsp;&nbsp;3
10    &nbsp;&nbsp;000...1010    &nbsp;&nbsp;3
11    &nbsp;&nbsp;000...1011    &nbsp;&nbsp;2<br>
정수들이 담긴 배열 <code>numbers</code>가 매개변수로 주어집니다. <code>numbers</code>의 모든 수들에 대하여 각 수의 <code>f</code> 값을 배열에 차례대로 담아 return 하도록 solution 함수를 완성해주세요.</li>
</ul>
<ul>
<li>제한사항<ul>
<li>1 ≤ <code>numbers</code>의 길이 ≤ 100,000</li>
<li>0 ≤ <code>numbers</code>의 모든 수 ≤ 10^15</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(numbers):
    result = []
    for x in numbers:
        if x % 2 == 0:
            result.append(x + 1)
        else:
            # x의 가장 낮은 0 비트를 1로 바꾸고, 그 다음 비트를 0으로 바꾼다.
            bit = 1
            while x &amp; bit:
                bit &lt;&lt;= 1
            result.append(x + bit - (bit &gt;&gt; 1))
    return result</code></pre>
<hr>
<h3 id="다리를-지나는-트럭-스택큐">다리를 지나는 트럭 (스택/큐)</h3>
<ul>
<li><p>트럭 여러 대가 강을 가로지르는 일차선 다리를 정해진 순으로 건너려 합니다. 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 알아내야 합니다. 다리에는 트럭이 최대 bridge_length대 올라갈 수 있으며, 다리는 weight 이하까지의 무게를 견딜 수 있습니다. 단, 다리에 완전히 오르지 않은 트럭의 무게는 무시합니다.<br>
예를 들어, 트럭 2대가 올라갈 수 있고 무게를 10kg까지 견디는 다리가 있습니다. 무게가 [7, 4, 5, 6]kg인 트럭이 순서대로 최단 시간 안에 다리를 건너려면 다음과 같이 건너야 합니다.<br>
경과 시간    다리를 지난 트럭    다리를 건너는 트럭    대기 트럭
0    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[7,4,5,6]
1<del>2    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[7]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[4,5,6]
3    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[7]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[4]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[5,6]
4    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[7]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[4,5]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[6]
5    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[7,4]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[5]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[6]
6</del>7    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[7,4,5]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[6]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]
8    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[7,4,5,6]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[]<Br>
따라서, 모든 트럭이 다리를 지나려면 최소 8초가 걸립니다.<br>
solution 함수의 매개변수로 다리에 올라갈 수 있는 트럭 수 bridge_length, 다리가 견딜 수 있는 무게 weight, 트럭 별 무게 truck_weights가 주어집니다. 이때 모든 트럭이 다리를 건너려면 최소 몇 초가 걸리는지 return 하도록 solution 함수를 완성하세요.     <br></p>
<ul>
<li>제한사항<ul>
<li>bridge_length는 1 이상 10,000 이하입니다.</li>
<li>weight는 1 이상 10,000 이하입니다.</li>
<li>truck_weights의 길이는 1 이상 10,000 이하입니다.</li>
<li>모든 트럭의 무게는 1 이상 weight 이하입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">from collections import deque

def solution(bridge_length, weight, truck_weights):
    time = 0
    bridge_queue = deque([0] * bridge_length)  # 다리 길이만큼의 큐 생성
    bridge_weight = 0  # 현재 다리 위 트럭들의 총 무게

    for truck in truck_weights:
        while True:
            time += 1
            bridge_weight -= bridge_queue.popleft()  # 다리에서 트럭이 나가는 경우 무게 감소
            if bridge_weight + truck &lt;= weight:  # 새로운 트럭이 올라올 수 있는지 확인
                bridge_queue.append(truck)
                bridge_weight += truck
                break
            else:
                bridge_queue.append(0)  # 트럭이 올라올 수 없으면 0을 추가하여 다리 상태 유지

    # 마지막 트럭이 다리 위에 올라간 후 다리 길이만큼 시간이 더 필요
    time += bridge_length
    return time</code></pre>
<hr>
<h3 id="가장-큰-수-정렬">가장 큰 수 (정렬)</h3>
<ul>
<li>0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요.<br>
예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다.<br>
0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요.<br>
- 제한사항
   - numbers의 길이는 1 이상 100,000 이하입니다.
  - numbers의 원소는 0 이상 1,000 이하입니다.
  - 정답이 너무 클 수 있으니 문자열로 바꾸어 return 합니다.

</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">from functools import cmp_to_key

def compare(x, y):
    if x + y &gt; y + x:
        return -1
    elif x + y &lt; y + x:
        return 1
    else:
        return 0

def solution(numbers):
    # numbers를 문자열로 변환
    numbers = list(map(str, numbers))
    # 커스텀 정렬 기준으로 정렬
    numbers.sort(key=cmp_to_key(compare))
    # 정렬된 숫자들을 이어붙임
    answer = &#39;&#39;.join(numbers)
    # 앞자리 0 처리 (e.g., [0, 0]인 경우 &#39;00&#39; -&gt; &#39;0&#39;)
    return answer if answer[0] != &#39;0&#39; else &#39;0&#39;</code></pre>
<hr>
<h3 id="소수-찾기-완전탐색">소수 찾기 (완전탐색)</h3>
<ul>
<li><p>한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다.<br>
각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이 조각으로 만들 수 있는 소수가 몇 개인지 return 하도록 solution 함수를 완성해주세요.</p>
<Br>

<ul>
<li>제한사항<ul>
<li>numbers는 길이 1 이상 7 이하인 문자열입니다.</li>
<li>numbers는 0~9까지 숫자만으로 이루어져 있습니다.<ul>
<li>&quot;013&quot;은 0, 1, 3 숫자가 적힌 종이 조각이 흩어져있다는 의미입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">from itertools import permutations

# 소수 판별 함수
def is_prime(n):
    if n &lt;= 1:
        return False
    if n == 2:
        return True
    if n % 2 == 0:
        return False
    for i in range(3, int(n**0.5) + 1, 2):
        if n % i == 0:
            return False
    return True

def solution(numbers):
    # 모든 숫자 조합을 생성
    num_set = set()
    for i in range(1, len(numbers) + 1):
        perms = permutations(numbers, i)
        for perm in perms:
            num = int(&#39;&#39;.join(perm))
            num_set.add(num)

    # 소수 판별 후 카운트
    prime_count = 0
    for num in num_set:
        if is_prime(num):
            prime_count += 1

    return prime_count</code></pre>
<hr>
<h3 id="쿼드압축-후-개수-세기-월간-코드-챌린지-시즌1">쿼드압축 후 개수 세기 (월간 코드 챌린지 시즌1)</h3>
<ul>
<li><p>0과 1로 이루어진 2n x 2n 크기의 2차원 정수 배열 arr이 있습니다. 당신은 이 arr을 <a href="https://en.wikipedia.org/wiki/Quadtree">쿼드 트리</a>와 같은 방식으로 압축하고자 합니다. 구체적인 방식은 다음과 같습니다.<br></p>
<ol>
<li>당신이 압축하고자 하는 특정 영역을 S라고 정의합니다.</li>
<li>만약 S 내부에 있는 모든 수가 같은 값이라면, S를 해당 수 하나로 압축시킵니다.</li>
<li>그렇지 않다면, S를 정확히 4개의 균일한 정사각형 영역(입출력 예를 참고해주시기 바랍니다.)으로 쪼갠 뒤, 각 정사각형 영역에 대해 같은 방식의 압축을 시도합니다.</li>
</ol>
<p>arr이 매개변수로 주어집니다. 위와 같은 방식으로 arr을 압축했을 때, 배열에 최종적으로 남는 0의 개수와 1의 개수를 배열에 담아서 return 하도록 solution 함수를 완성해주세요.</p>
  <br>

<ul>
<li>제한사항<ul>
<li>arr의 행의 개수는 1 이상 1024 이하이며, 2의 거듭 제곱수 형태를 하고 있습니다. 즉, arr의 행의 개수는 1, 2, 4, 8, ..., 1024 중 하나입니다.<ul>
<li>arr의 각 행의 길이는 arr의 행의 개수와 같습니다. 즉, arr은 정사각형 배열입니다.</li>
<li>arr의 각 행에 있는 모든 값은 0 또는 1 입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(arr):
    def compress(x, y, size):
        initial = arr[x][y]
        all_same = True

        for i in range(x, x + size):
            for j in range(y, y + size):
                if arr[i][j] != initial:
                    all_same = False
                    break
            if not all_same:
                break

        if all_same:
            if initial == 0:
                result[0] += 1
            else:
                result[1] += 1
        else:
            new_size = size // 2
            compress(x, y, new_size)
            compress(x, y + new_size, new_size)
            compress(x + new_size, y, new_size)
            compress(x + new_size, y + new_size, new_size)

    n = len(arr)
    result = [0, 0]
    compress(0, 0, n)
    return result</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[한숨이 계속 나와]]></title>
            <link>https://velog.io/@dyllis_lin/%ED%95%9C%EC%88%A8%EC%9D%B4-%EA%B3%84%EC%86%8D-%EB%82%98%EC%99%80</link>
            <guid>https://velog.io/@dyllis_lin/%ED%95%9C%EC%88%A8%EC%9D%B4-%EA%B3%84%EC%86%8D-%EB%82%98%EC%99%80</guid>
            <pubDate>Fri, 31 May 2024 14:17:29 GMT</pubDate>
            <description><![CDATA[<h2 id="적응">적응</h2>
<h3 id="반복해서-사용할수록-sql파이썬은-적응-되지만-폭언은">반복해서 사용할수록 SQL/파이썬은 적응 되지만 폭언은...</h3>
<p>들어도 들어도 적응이 안 돼ㅋ 그냥 빨리 이 집구석에서 탈출하고 싶음. 내 마음의 자유를 위해서는 무조건 취업해서 독립하는게 장땡인데, 무작정 아무데나 취업하기는 무섭다. 진짜 어떤 회사든 간에 처음으로 붙은 회사 가버려? 이게 맞아? 내 미래/커리어를 위한 회사여야 하는데 어째 나는 회사 선택/취업을 도피의 수단으로 쓰고 있는건지.</p>
<h2 id="통계">통계</h2>
<h3 id="새로운-것-투성이-그러나-재밌는">새로운 것 투성이, 그러나 재밌는</h3>
<p>분명 학교에서 통계 배웠을 때는 안 재밌었던 것 같은데 다시 시작하니까 생각보다 재밌다. 어렵기는 한데, 뭔가 하나하나 적용시켜보고 따져보는게 재밌달까? 통계의 세계는 생각보다 넓더라.</p>
<h2 id="다짐">다짐</h2>
<h3 id="무너지지-말아야-한다-내-자신아">무너지지 말아야 한다 내 자신아</h3>
<p>버텨!!!!!! 제발... 이러는거 하루이틀도 아닌데 여기서 무너지면 안된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 알고리즘 연습 20 (프로그래머스)]]></title>
            <link>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-20-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</link>
            <guid>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-20-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</guid>
            <pubDate>Fri, 31 May 2024 13:42:45 GMT</pubDate>
            <description><![CDATA[<h3 id="주차-요금-계산-2022-kakao-blind-recruitment">주차 요금 계산 (2022 KAKAO BLIND RECRUITMENT)</h3>
<ul>
<li>주차장의 요금표와 차량이 들어오고(입차) 나간(출차) 기록이 주어졌을 때, 차량별로 주차 요금을 계산하려고 합니다. 아래는 하나의 예시를 나타냅니다.<bR><ul>
<li>요금표
기본 시간(분)    기본 요금(원)    단위 시간(분)    단위 요금(원)
180&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;600<bR></li>
<li>입/출차 기록
시각(시:분)    차량 번호    내역
05:34    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5961    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;입차
06:00    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0000    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;입차
06:34    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0000    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;출차
07:59    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5961    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;출차
07:59    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0148    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;입차
18:59    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0000    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;입차
19:09    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0148    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;출차
22:59    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5961    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;입차
23:00    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5961    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;출차<bR></li>
<li>자동차별 주차 요금
차량 번호    누적 주차 시간(분)    주차 요금(원)
0000    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;34 + 300 = 334    &nbsp;&nbsp;&nbsp;5000 + ⌈(334 - 180) / 10⌉ x 600 = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14600
0148    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;670    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5000 +⌈(670 - 180) / 10⌉x 600 = &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;34400
5961    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;145 + 1 = 146    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5000  <bR></li>
<li>어떤 차량이 입차된 후에 출차된 내역이 없다면, 23:59에 출차된 것으로 간주합니다.<ul>
<li><code>0000</code>번 차량은 18:59에 입차된 이후, 출차된 내역이 없습니다. 따라서, 23:59에 출차된 것으로 간주합니다.</li>
</ul>
</li>
<li>00:00부터 23:59까지의 입/출차 내역을 바탕으로 차량별 누적 주차 시간을 계산하여 요금을 일괄로 정산합니다.</li>
<li>누적 주차 시간이 <code>기본 시간</code>이하라면, <code>기본 요금</code>을 청구합니다.</li>
<li>누적 주차 시간이 <code>기본 시간</code>을 초과하면, <code>기본 요금</code>에 더해서 초과한 시간에 대해서 <code>단위 시간</code> 마다 <code>단위 요금</code>을 청구합니다.<ul>
<li>초과한 시간이 <code>단위 시간</code>으로 나누어 떨어지지 않으면, ``올림합니다.</li>
<li><code>⌈</code>a<code>⌉</code> : a보다 작지 않은 최소의 정수를 의미합니다. 즉, <code>올림</code>을 의미합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;주차 요금을 나타내는 정수 배열 <code>fees</code>, 자동차의 입/출차 내역을
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;나타내는 문자열 배열 <code>records</code>가 매개변수로 주어집니다. <strong>차량 번호가</strong>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>작은 자동차부터</strong> 청구할 주차 요금을 차례대로 정수 배열에 담아서
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 하도록 solution 함수를 완성해주세요.<bR>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 제한사항
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>fees</code>의 길이 = 4
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- fees[0] = <code>기본 시간(분)</code>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 1 ≤ fees[0] ≤ 1,439
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- fees[1] = <code>기본 요금(원)</code>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 0 ≤ fees[1] ≤ 100,000
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- fees[2] = <code>단위 시간(분)</code> 
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 1 ≤ fees[2] ≤ 1,439 
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- fees[3] = <code>단위 요금(원)</code> 
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 1 ≤ fees[3] ≤ 10,000
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 1 ≤ <code>records</code>의 길이 ≤ 1,000
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>records</code>의 각 원소는 <code>&quot;시각 차량번호 내역&quot;</code> 형식의
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;문자열입니다.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>시각</code>, <code>차량번호</code>, <code>내역</code>은 하나의 공백으로 구분되어 있습니다.<br> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>시각</code>은 차량이 입차되거나 출차된 시각을 나타내며, <code>HH:MM</code>
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;형식의 길이 5인 문자열입니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>HH:MM</code>은 00:00부터 23:59까지 주어집니다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 잘못된 시각(&quot;25:22&quot;, &quot;09:65&quot; 등)은 입력으로 주어지지
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;않습니다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - <code>차량번호</code>는 자동차를 구분하기 위한, &#39;0&#39;~&#39;9&#39;로 구성된 길이 4인
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;문자열입니다.
       &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>내역</code>은 길이 2 또는 3인 문자열로, <code>IN</code> 또는 <code>OUT</code>입니다. 
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>IN</code>은 입차를, <code>OUT</code>은 출차를 의미합니다. 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - <code>records</code>의 원소들은 시각을 기준으로 오름차순으로 정렬되어
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;주어집니다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - <code>records</code>는 하루 동안의 입/출차된 기록만 담고 있으며,
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;입차된 차량이 다음날 출차되는 경우는 입력으로 주어지지
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;않습니다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 같은 시각에, 같은 차량번호의 내역이 2번 이상 나타내지
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;않습니다. 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 마지막 시각(23:59)에 입차되는 경우는 입력으로 주어지지
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;않습니다. 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 아래의 예를 포함하여, 잘못된 입력은 주어지지 않습니다
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 주차장에 없는 차량이 출차되는 경우<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - 주차장에 이미 있는 차량(차량번호가 같은 차량)이 다시
        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;입차되는 경우   </p>
<p>제출한 코드 :</p>
<pre><code class="language-python">from math import ceil

def time_to_minutes(time):
    &quot;&quot;&quot;시간을 분으로 변환&quot;&quot;&quot;
    h, m = map(int, time.split(&#39;:&#39;))
    return h * 60 + m

def calculate_fee(total_time, fees):
    &quot;&quot;&quot;주차 요금을 계산&quot;&quot;&quot;
    base_time, base_fee, unit_time, unit_fee = fees
    if total_time &lt;= base_time:
        return base_fee
    else:
        extra_time = total_time - base_time
        extra_fee = ceil(extra_time / unit_time) * unit_fee
        return base_fee + extra_fee

def solution(fees, records):
    parking_times = {}
    in_parking = {}

    for record in records:
        time, car_number, status = record.split()
        time = time_to_minutes(time)

        if status == &#39;IN&#39;:
            in_parking[car_number] = time
        elif status == &#39;OUT&#39;:
            if car_number in in_parking:
                in_time = in_parking.pop(car_number)
                parked_time = time - in_time
                if car_number in parking_times:
                    parking_times[car_number] += parked_time
                else:
                    parking_times[car_number] = parked_time

    # 23:59 출차 처리를 위해
    end_time = time_to_minutes(&quot;23:59&quot;)
    for car_number, in_time in in_parking.items():
        parked_time = end_time - in_time
        if car_number in parking_times:
            parking_times[car_number] += parked_time
        else:
            parking_times[car_number] = parked_time

    result = []
    for car_number in sorted(parking_times.keys()):
        total_time = parking_times[car_number]
        fee = calculate_fee(total_time, fees)
        result.append(fee)

    return result</code></pre>
<hr>
<h3 id="모음사전-완전탐색">모음사전 (완전탐색)</h3>
<ul>
<li>사전에 알파벳 모음 &#39;A&#39;, &#39;E&#39;, &#39;I&#39;, &#39;O&#39;, &#39;U&#39;만을 사용하여 만들 수 있는, 길이 5 이하의 모든 단어가 수록되어 있습니다. 사전에서 첫 번째 단어는 &quot;A&quot;이고, 그다음은 &quot;AA&quot;이며, 마지막 단어는 &quot;UUUUU&quot;입니다.<BR>
단어 하나 word가 매개변수로 주어질 때, 이 단어가 사전에서 몇 번째 단어인지 return 하도록 solution 함수를 완성해주세요.<pre><code>  &lt;bR&gt;</code></pre><ul>
<li>제한사항<ul>
<li>word의 길이는 1 이상 5 이하입니다.</li>
<li>word는 알파벳 대문자 &#39;A&#39;, &#39;E&#39;, &#39;I&#39;, &#39;O&#39;, &#39;U&#39;로만 이루어져 있습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(word):
    # 각 자리별 가중치를 설정
    weights = [781, 156, 31, 6, 1]
    vowels = [&#39;A&#39;, &#39;E&#39;, &#39;I&#39;, &#39;O&#39;, &#39;U&#39;]

    result = 0

    for i, char in enumerate(word):
        # 현재 자리의 단어가 몇 번째 모음인지 확인
        index = vowels.index(char)
        # 각 자리의 위치를 계산해서 더하기
        result += weights[i] * index + 1

    return result</code></pre>
<hr>
<h3 id="뒤에-있는-큰-수-찾기-연습문제">뒤에 있는 큰 수 찾기 (연습문제)</h3>
<ul>
<li>정수로 이루어진 배열 <code>numbers</code>가 있습니다. 배열 의 각 원소들에 대해 자신보다 뒤에 있는 숫자 중에서 자신보다 크면서 가장 가까이 있는 수를 뒷 큰수라고 합니다.<BR>
정수 배열 <code>numbers</code>가 매개변수로 주어질 때, 모든 원소에 대한 뒷 큰수들을 차례로 담은 배열을 return 하도록 solution 함수를 완성해주세요. 단, 뒷 큰수가 존재하지 않는 원소는 -1을 담습니다.<pre><code>    &lt;bR&gt;</code></pre><ul>
<li>제한사항<ul>
<li>4 ≤ <code>numbers</code>의 길이 ≤ 1,000,000<ul>
<li>1 ≤ <code>numbers[i]</code> ≤ 1,000,000</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(numbers):
    n = len(numbers)
    answer = [-1] * n
    stack = []

    for i in range(n - 1, -1, -1):
        # 스택이 비어 있지 않고, 현재 숫자가 스택의 top보다 크거나 같으면 pop
        while stack and stack[-1] &lt;= numbers[i]:
            stack.pop()

        # 스택이 비어 있지 않다면, top이 뒷 큰수가 됨
        if stack:
            answer[i] = stack[-1]

        # 현재 숫자를 스택에 추가
        stack.append(numbers[i])

    return answer</code></pre>
<hr>
<h3 id="롤케이크-자르기-연습문제">롤케이크 자르기 (연습문제)</h3>
<ul>
<li>철수는 롤케이크를 두 조각으로 잘라서 동생과 한 조각씩 나눠 먹으려고 합니다. 이 롤케이크에는 여러가지 토핑들이 일렬로 올려져 있습니다. 철수와 동생은 롤케이크를 공평하게 나눠먹으려 하는데, 그들은 롤케이크의 크기보다 롤케이크 위에 올려진 토핑들의 종류에 더 관심이 많습니다. 그래서 잘린 조각들의 크기와 올려진 토핑의 개수에 상관없이 각 조각에 동일한 가짓수의 토핑이 올라가면 공평하게 롤케이크가 나누어진 것으로 생각합니다.<BR>
예를 들어, 롤케이크에 4가지 종류의 토핑이 올려져 있다고 합시다. 토핑들을 1, 2, 3, 4와 같이 번호로 표시했을 때, 케이크 위에 토핑들이 [1, 2, 1, 3, 1, 4, 1, 2] 순서로 올려져 있습니다. 만약 세 번째 토핑(1)과 네 번째 토핑(3) 사이를 자르면 롤케이크의 토핑은 [1, 2, 1], [3, 1, 4, 1, 2]로 나뉘게 됩니다. 철수가 [1, 2, 1]이 놓인 조각을, 동생이 [3, 1, 4, 1, 2]가 놓인 조각을 먹게 되면 철수는 두 가지 토핑(1, 2)을 맛볼 수 있지만, 동생은 네 가지 토핑(1, 2, 3, 4)을 맛볼 수 있으므로, 이는 공평하게 나누어진 것이 아닙니다. 만약 롤케이크의 네 번째 토핑(3)과 다섯 번째 토핑(1) 사이를 자르면 [1, 2, 1, 3], [1, 4, 1, 2]로 나뉘게 됩니다. 이 경우 철수는 세 가지 토핑(1, 2, 3)을, 동생도 세 가지 토핑(1, 2, 4)을 맛볼 수 있으므로, 이는 공평하게 나누어진 것입니다. 공평하게 롤케이크를 자르는 방법은 여러가지 일 수 있습니다. 위의 롤케이크를 [1, 2, 1, 3, 1], [4, 1, 2]으로 잘라도 공평하게 나뉩니다. 어떤 경우에는 롤케이크를 공평하게 나누지 못할 수도 있습니다.<BR>
롤케이크에 올려진 토핑들의 번호를 저장한 정수 배열 <code>topping</code>이 매개변수로 주어질 때, 롤케이크를 공평하게 자르는 방법의 수를 return 하도록 solution 함수를 완성해주세요.<pre><code>      &lt;BR&gt;</code></pre><ul>
<li>제한사항<ul>
<li>1 ≤ <code>topping</code>의 길이 ≤ 1,000,000<ul>
<li>1 ≤ <code>topping</code>의 원소 ≤ 10,000</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(topping):
    from collections import defaultdict

    left_set = set()
    right_count = defaultdict(int)

    # 오른쪽 집합에 모든 토핑의 개수 세기
    for t in topping:
        right_count[t] += 1

    # 공평하게 나눌 수 있는 위치의 수
    fair_cuts = 0

    # 각 위치에서 자를 때 왼쪽과 오른쪽의 토핑 종류 수를 비교
    for t in topping:
        # 현재 토핑을 왼쪽으로 이동
        left_set.add(t)
        right_count[t] -= 1

        # 오른쪽에 더 이상 존재하지 않으면 집합에서 제거
        if right_count[t] == 0:
            del right_count[t]

        # 공평하게 나눌 수 있는지 확인
        if len(left_set) == len(right_count):
            fair_cuts += 1

    return fair_cuts</code></pre>
<hr>
<h3 id="숫자-변환하기-연습문제">숫자 변환하기 (연습문제)</h3>
<ul>
<li>자연수 <code>x</code>를 <code>y</code>로 변환하려고 합니다. 사용할 수 있는 연산은 다음과 같습니다.<pre><code>        &lt;BR&gt;</code></pre><ul>
<li><code>x</code>에 <code>n</code>을 더합니다</li>
<li><code>x</code>에 2를 곱합니다.</li>
<li><code>x</code>에 3을 곱합니다.</li>
</ul>
</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;자연수 <code>x</code>, <code>y</code>, <code>n</code>이 매개변수로 주어질 때, <code>x</code>를 <code>y</code>로 변환하기 위해
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;필요한 최소 연산 횟수를 return하도록 solution 함수를 완성해주세요.
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;이때 <code>x</code>를 <code>y</code>로 만들 수 없다면 -1을 return 해주세요.</p>
<p> &nbsp; &nbsp; &nbsp; &nbsp;- 제한사항
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- 1 ≤ <code>x</code> ≤ <code>y</code> ≤ 1,000,000
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;- 1 ≤ <code>n</code> &lt; <code>y</code></p>
<p>제출한 코드 :</p>
<pre><code class="language-python">from collections import deque

def solution(x, y, n):
    if x == y:
        return 0

    # BFS를 위한 큐 초기화: (현재 값, 연산 횟수)
    queue = deque([(x, 0)])
    visited = set()  # 방문한 값을 기록

    while queue:
        current, operations = queue.popleft()

        # 다음 가능한 연산들을 수행
        for next_value in (current + n, current * 2, current * 3):
            if next_value == y:
                return operations + 1
            if next_value &lt; y and next_value not in visited:
                visited.add(next_value)
                queue.append((next_value, operations + 1))

    # 큐를 다 돌 때까지 목표 값을 찾지 못한 경우
    return -1</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 알고리즘 연습 19 (프로그래머스)]]></title>
            <link>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-19-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</link>
            <guid>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-19-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</guid>
            <pubDate>Fri, 31 May 2024 13:01:49 GMT</pubDate>
            <description><![CDATA[<h3 id="기능개발-스택큐">기능개발 (스택/큐)</h3>
<ul>
<li>프로그래머스 팀에서는 기능 개선 작업을 수행 중입니다. 각 기능은 진도가 100%일 때 서비스에 반영할 수 있습니다.<BR>
또, 각 기능의 개발속도는 모두 다르기 때문에 뒤에 있는 기능이 앞에 있는 기능보다 먼저 개발될 수 있고, 이때 뒤에 있는 기능은 앞에 있는 기능이 배포될 때 함께 배포됩니다.<BR>
먼저 배포되어야 하는 순서대로 작업의 진도가 적힌 정수 배열 progresses와 각 작업의 개발 속도가 적힌 정수 배열 speeds가 주어질 때 각 배포마다 몇 개의 기능이 배포되는지를 return 하도록 solution 함수를 완성하세요.<BR>
- 제한사항
   - 작업의 개수(progresses, speeds배열의 길이)는 100개 이하입니다.
   - 작업 진도는 100 미만의 자연수입니다.
   - 작업 속도는 100 이하의 자연수입니다.
   - 배포는 하루에 한 번만 할 수 있으며, 하루의 끝에 이루어진다고 가정합니다. 예를 들어 진도율이 95%인 작업의 개발 속도가 하루에 4%라면 배포는 2일 뒤에 이루어집니다.

</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">import math

def solution(progresses, speeds):
    # 각 작업이 완료되는데 필요한 일수 계산
    days = [math.ceil((100 - p) / s) for p, s in zip(progresses, speeds)]

    # 배포 결과를 저장할 리스트
    result = []

    # 첫 번째 작업의 완료 일수
    current_max_day = days[0]
    count = 0

    for day in days:
        if day &gt; current_max_day:
            result.append(count)
            current_max_day = day
            count = 1
        else:
            count += 1

    # 마지막 배포 그룹 추가
    result.append(count)

    return result</code></pre>
<hr>
<h3 id="프로세스-스택큐">프로세스 (스택/큐)</h3>
<ul>
<li>운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다.<ol>
<li>실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다.<ol start="2">
<li>큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다.</li>
<li>만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다.</li>
<li>1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다.<bR></li>
</ol>
</li>
</ol>
</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;예를 들어 프로세스 4개 [A, B, C, D]가 순서대로 실행 대기 큐에 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;들어있고, 우선순위가 [2, 1, 3, 2]라면 [C, D, A, B] 순으로 실행하게
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;됩니다.<BR><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;배열 <code>priorities</code>와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;알려주는 <code>location</code>이 매개변수로 주어질 때, 해당 프로세스가 몇 번째로
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;실행되는지 return 하도록 solution 함수를 작성해주세요.    </p>
<ul>
<li>제한사항<ul>
<li>priorities의 길이는 1 이상 100 이하입니다.<ul>
<li>priorities의 원소는 1 이상 9 이하의 정수입니다.<ul>
<li>priorities의 원소는 우선순위를 나타내며 숫자가 클 수록
&nbsp;&nbsp;&nbsp;우선순위가 높습니다.</li>
</ul>
</li>
</ul>
</li>
<li>location은 0 이상 (대기 큐에 있는 프로세스 수 - 1) 이하의 값을 가집니다.<ul>
<li>priorities의 가장 앞에 있으면 0, 두 번째에 있으면 1 … 과 같이
&nbsp;&nbsp;&nbsp;표현합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">from collections import deque

def solution(priorities, location):
    # 프로세스와 초기 위치를 큐에 저장
    queue = deque([(p, i) for i, p in enumerate(priorities)])
    # 실행 순서 카운터
    order = 0

    while queue:
        # 큐의 맨 앞에 있는 프로세스
        current = queue.popleft()

        # 큐에 남아있는 프로세스 중 우선순위가 더 높은 것이 있는지 확인
        if any(current[0] &lt; q[0] for q in queue):
            # 현재 프로세스를 다시 큐의 끝에 넣음
            queue.append(current)
        else:
            # 현재 프로세스를 실행
            order += 1
            # 현재 프로세스가 목표 프로세스인지 확인
            if current[1] == location:
                return order</code></pre>
<hr>
<h3 id="피로도-완전탐색">피로도 (완전탐색)</h3>
<ul>
<li>XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 &quot;최소 필요 피로도&quot;와 던전 탐험을 마쳤을 때 소모되는 &quot;소모 피로도&quot;가 있습니다. &quot;최소 필요 피로도&quot;는 해당 던전을 탐험하기 위해 가지고 있어야 하는 최소한의 피로도를 나타내며, &quot;소모 피로도&quot;는 던전을 탐험한 후 소모되는 피로도를 나타냅니다. 예를 들어 &quot;최소 필요 피로도&quot;가 80, &quot;소모 피로도&quot;가 20인 던전을 탐험하기 위해서는 유저의 현재 남은 피로도는 80 이상 이어야 하며, 던전을 탐험한 후에는 피로도 20이 소모됩니다.<BR>
이 게임에는 하루에 한 번씩 탐험할 수 있는 던전이 여러개 있는데, 한 유저가 오늘 이 던전들을 최대한 많이 탐험하려 합니다. 유저의 현재 피로도 k와 각 던전별 &quot;최소 필요 피로도&quot;, &quot;소모 피로도&quot;가 담긴 2차원 배열 dungeons 가 매개변수로 주어질 때, 유저가 탐험할수 있는 최대 던전 수를 return 하도록 solution 함수를 완성해주세요.  <BR>
- 제한사항
  - k는 1 이상 5,000 이하인 자연수입니다.
  - dungeons의 세로(행) 길이(즉, 던전의 개수)는 1 이상 8 이하
    입니다.
  &nbsp;- dungeons의 가로(열) 길이는 2 입니다.
  &nbsp;- dungeons의 각 행은 각 던전의 ["최소 필요 피로도", "소모
    &nbsp;&nbsp;피로도"] 입니다.
      - "최소 필요 피로도"는 항상 "소모 피로도"보다 크거나
    &nbsp;&nbsp;&nbsp;같습니다.
      - "최소 필요 피로도"와 "소모 피로도"는 1 이상 1,000 이하인 &nbsp;&nbsp;&nbsp;자연수입니다.
  &nbsp;- 서로 다른 던전의 ["최소 필요 피로도", "소모 피로도"]가
    &nbsp;&nbsp;서로 같을 수 있습니다.


</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">from itertools import permutations

def solution(k, dungeons):
    max_dungeons = 0
    n = len(dungeons)

    for perm in permutations(dungeons):
        current_fatigue = k
        explored_dungeons = 0

        for required, consume in perm:
            if current_fatigue &gt;= required:
                current_fatigue -= consume
                explored_dungeons += 1
            else:
                break

        max_dungeons = max(max_dungeons, explored_dungeons)

    return max_dungeons</code></pre>
<hr>
<h3 id="타겟-넘버-깊이너비-우선-탐색dfsbfs">타겟 넘버 (깊이/너비 우선 탐색(DFS/BFS))</h3>
<ul>
<li>n개의 음이 아닌 정수들이 있습니다. 이 정수들을 순서를 바꾸지 않고 적절히 더하거나 빼서 타겟 넘버를 만들려고 합니다. 예를 들어 [1, 1, 1, 1, 1]로 숫자 3을 만들려면 다음 다섯 방법을 쓸 수 있습니다.<BR></li>
<li>1+1+1+1+1 = 3</li>
<li>1-1+1+1+1 = 3</li>
<li>1+1-1+1+1 = 3</li>
<li>1+1+1-1+1 = 3</li>
<li>1+1+1+1-1 = 3
<bR>사용할 수 있는 숫자가 담긴 배열 numbers, 타겟 넘버 target이 매개변수로 주어질 때 숫자를 적절히 더하고 빼서 타겟 넘버를 만드는 방법의 수를 return 하도록 solution 함수를 작성해주세요. <BR>
 - 제한사항
    - 주어지는 숫자의 개수는 2개 이상 20개 이하입니다.
    - 각 숫자는 1 이상 50 이하인 자연수입니다.
    - 타겟 넘버는 1 이상 1000 이하인 자연수입니

</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(numbers, target):
    def dfs(index, current_sum):
        # 기저 사례: 인덱스가 numbers의 길이와 같으면 현재 합이 타겟과 같은지 확인
        if index == len(numbers):
            return 1 if current_sum == target else 0

        # 현재 숫자를 더하는 경우와 빼는 경우를 재귀 호출
        add_case = dfs(index + 1, current_sum + numbers[index])
        subtract_case = dfs(index + 1, current_sum - numbers[index])

        # 두 경우의 수를 합산하여 반환
        return add_case + subtract_case

    # 재귀 호출 시작
    return dfs(0, 0)</code></pre>
<hr>
<h3 id="k진수에서-소수-개수-구하기-2022-kakao-blind-recruitment">k진수에서 소수 개수 구하기 (2022 KAKAO BLIND RECRUITMENT)</h3>
<ul>
<li>양의 정수 <code>n</code>이 주어집니다. 이 숫자를 <code>k</code>진수로 바꿨을 때, 변환된 수 안에 아래 조건에 맞는 소수(Prime number)가 몇 개인지 알아보려 합니다.  <BR>
- `0P0`처럼 소수 양쪽에 0이 있는 경우
- `P0`처럼 소수 오른쪽에만 0이 있고 왼쪽에는 아무것도 없는 경우
- `0P`처럼 소수 왼쪽에만 0이 있고 오른쪽에는 아무것도 없는 경우
- `P`처럼 소수 양쪽에 아무것도 없는 경우
- 단, `P`는 각 자릿수에 0을 포함하지 않는 소수입니다.
    - 예를 들어, 101은 `P`가 될 수 없습니다.<BR>

</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;예를 들어, 437674을 3진수로 바꾸면 <code>211</code>0<code>2</code>01010<code>11</code>입니다. 여기서
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;찾을 수 있는 조건에 맞는 소수는 왼쪽부터 순서대로 211, 2, 11이
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;있으며, 총 3개입니다. (211, 2, 11을 <code>k</code>진법으로 보았을 때가 아닌,
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10진법으로 보았을 때 소수여야 한다는 점에 주의합니다.) 211은 <code>P0</code>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;형태에서 찾을 수 있으며, 2는 <code>0P0</code>에서, 11은 <code>0P</code>에서 찾을 수
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;있습니다.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;정수 <code>n</code>과 <code>k</code>가 매개변수로 주어집니다. <code>n</code>을 <code>k</code>진수로 바꿨을 때, 
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;변환된 수 안에서 찾을 수 있는 위 조건에 맞는 소수의 개수를 return
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;하도록 solution 함수를 완성해 주세요.<bR>
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 제한사항
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 1 ≤ <code>n</code> ≤ 1,000,000
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 3 ≤ <code>k</code> ≤ 10</p>
<p>제출한 코드 :</p>
<pre><code class="language-python">def is_prime(num):
    if num &lt;= 1:
        return False
    if num == 2:
        return True
    if num % 2 == 0:
        return False
    sqrt_n = int(num ** 0.5) + 1
    for divisor in range(3, sqrt_n, 2):
        if num % divisor == 0:
            return False
    return True

def convert_to_base_k(n, k):
    result = &#39;&#39;
    while n &gt; 0:
        result = str(n % k) + result
        n //= k
    return result

def solution(n, k):
    base_k_number = convert_to_base_k(n, k)
    candidates = base_k_number.split(&#39;0&#39;)

    count_primes = 0
    for candidate in candidates:
        if candidate and is_prime(int(candidate)):
            count_primes += 1

    return count_primes</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] Hacker Rank 문제 연습 6]]></title>
            <link>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-6</link>
            <guid>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-6</guid>
            <pubDate>Thu, 30 May 2024 14:07:23 GMT</pubDate>
            <description><![CDATA[<h3 id="revising-aggregations---the-sum-function-aggregation">Revising Aggregations - The Sum Function (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/ba14614d-a7fa-4e43-9cda-5541a1a36505/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT AVG(POPULATION)
FROM CITY
WHERE DISTRICT = &#39;California&#39;;</code></pre>
<hr>
<h3 id="revising-aggregations---averages-aggregation">Revising Aggregations - Averages (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/ba14614d-a7fa-4e43-9cda-5541a1a36505/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT AVG(POPULATION)
FROM CITY
WHERE DISTRICT = &#39;California&#39;;</code></pre>
<hr>
<h3 id="average-population-aggregation">Average Population (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/6c79dc6b-c27a-482a-b1b1-7169e8467990/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT FLOOR(AVG(POPULATION))
FROM CITY;</code></pre>
<blockquote>
<p><code>FLOOR</code> : 주어진 숫자보다 작거나 같은 가장 큰 정수 반환 (내림)
<code>ROUND</code> : 주어진 숫자를 소수점 이하 특정 자릿수로 반올림
<code>TRUNC</code> : 주어진 숫자를 소수점 이하 특정 자릿수로 잘라냄 (버림)
<code>CEIL</code> : 주어진 숫자보다 크거나 같은 가장 작은 정수 (올림)</p>
</blockquote>
<pre><code class="language-sql"># FLOOR
SELECT FLOOR(4.7);  # 결과 : 4
SELECT FLOOR(-4.7); # 결과 : -5</code></pre>
<pre><code class="language-sql"># ROUND
# 두 번째 인수로 반올림할 자릿수 지정 가능, 기본값 0
SELECT ROUND(4.567, 2);  # 결과 : 4.57
SELECT ROUND(4.567);     # 결과 : 5
SELECT ROUND(-4.567);    # 결과 : -5</code></pre>
<pre><code class="language-sql"># TRUNC
# 두 번째 인수로 잘라낼 자릿수 지정 가능, 기본값 0
SELECT TRUNC(4.567, 2);  # 결과 : 4.56
SELECT TRUNC(4.567);     # 결과 : 4
SELECT TRUNC(-4.567);    # 결과 : -4</code></pre>
<pre><code class="language-sql"># CEIL
SELECT CEIL(4.3);  # 결과 : 5
SELECT CEIL(-4.3); # 결과 : -4</code></pre>
<hr>
<h3 id="japan-population-aggregation">Japan Population (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/8ce12d99-50d3-4ef3-8890-4d038b503e02/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT SUM(POPULATION)
FROM CITY
WHERE COUNTRYCODE = &#39;JPN&#39;;</code></pre>
<hr>
<h3 id="population-density-difference-aggregation">Population Density Difference (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/a41ea377-d3bb-473d-97bb-98fd72a11e55/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT MAX(POPULATION) - MIN(POPULATION)
FROM CITY;</code></pre>
<hr>
<h3 id="the-blunder-aggregation">The Blunder (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/3bfdf46f-72d3-4d5c-9c31-f3a71de3c2a3/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT CEIL((AVG(SALARY)) - (AVG(REPLACE(SALARY, &#39;0&#39;, &#39;&#39;)))) AS AVG_SALARY
FROM EMPLOYEES;</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] Hacker Rank 문제 연습 5]]></title>
            <link>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-5</link>
            <guid>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-5</guid>
            <pubDate>Thu, 30 May 2024 13:46:28 GMT</pubDate>
            <description><![CDATA[<h3 id="employ-salaries-basic-select">Employ Salaries (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/f8a6e204-d416-42f0-8340-abadc21ef2c0/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT NAME
FROM EMPLOYEE
WHERE SALARY &gt; 2000
    AND MONTHS &lt; 10
ORDER BY EMPLOYEE_ID ASC;</code></pre>
<hr>
<h3 id="type-of-triangle-advanced-select">Type of Triangle (Advanced Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/15963265-f350-4c03-a28b-f42b6e3e85a9/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT CASE WHEN (A = B AND B = C) THEN &#39;Equilateral&#39;
            WHEN ((A + B &lt;= C) OR (B + C &lt;= A) OR (A + C &lt;= B)) THEN &#39;Not A Triangle&#39;
            WHEN ((A = B) OR (B = C) OR (A = C)) THEN &#39;Isosceles&#39;
       ELSE &#39;Scalene&#39;
       END AS triangle_type
FROM TRIANGLES;</code></pre>
<hr>
<h3 id="the-pads-advanced-select">The PADS (Advanced Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/474c0e6e-4135-495b-aba6-347b0641d4ed/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT CONCAT(Name, &#39;(&#39;, LEFT(Occupation, 1), &#39;)&#39;) AS Name_Occupation
FROM OCCUPATIONS
ORDER BY Name_Occupation;

SELECT  CONCAT(&#39;There are a total of &#39;, COUNT(Occupation), &#39; &#39;, LOWER(Occupation), &#39;s.&#39;) AS Occupation_Count
FROM OCCUPATIONS
GROUP BY Occupation
ORDER BY COUNT(Occupation), Occupation;</code></pre>
<hr>
<h3 id="revising-aggregations---the-count-function-aggregation">Revising Aggregations - The Count Function (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/60cae620-a026-4a4a-b3f9-483db6cca7bb/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT COUNT(NAME)
FROM CITY
WHERE POPULATION &gt; 100000</code></pre>
<hr>
<h3 id="revising-aggregations---the-sum-function-aggregation">Revising Aggregations - The Sum Function (Aggregation)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/b67cc5f1-c50d-40a0-b708-a28347b0872d/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT SUM(POPULATION)
FROM CITY
WHERE DISTRICT = &#39;California&#39;</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 알고리즘 연습 18 (프로그래머스)]]></title>
            <link>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-18-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</link>
            <guid>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-18-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</guid>
            <pubDate>Tue, 28 May 2024 15:49:22 GMT</pubDate>
            <description><![CDATA[<h3 id="h-index-정렬">H-Index (정렬)</h3>
<ul>
<li><p>H-Index는 과학자의 생산성과 영향력을 나타내는 지표입니다. 어느 과학자의 H-Index를 나타내는 값인 h를 구하려고 합니다. <a href="https://en.wikipedia.org/wiki/H-index">위키백과</a>에 따르면, H-Index는 다음과 같이 구합니다.<BR>
어떤 과학자가 발표한 논문 <code>n</code>편 중, <code>h</code>번 이상 인용된 논문이 h편 이상이고 나머지 논문이 <code>h</code>번 이하 인용되었다면 <code>h</code>의 최댓값이 이 과학자의 H-Index입니다.<BR>
어떤 과학자가 발표한 논문의 인용 횟수를 담은 배열 citations가 매개변수로 주어질 때, 이 과학자의 H-Index를 return 하도록 solution 함수를 작성해주세요.</p>
<ul>
<li>제한사항<ul>
<li>과학자가 발표한 논문의 수는 1편 이상 1,000편 이하입니다.</li>
<li>논문별 인용 횟수는 0회 이상 10,000회 이하입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(citations):
    citations.sort(reverse=True)  

    h_index = 0
    for i, citation in enumerate(citations):
        if citation &gt;= i + 1:  # 현재 논문의 인용 횟수가 현재 순위보다 크거나 같으면 h-index 갱신
            h_index = i + 1
        else:
            break

    return h_index  </code></pre>
<hr>
<h3 id="n2-배열-자르기-월간-코드-챌린지-시즌3">n^2 배열 자르기 (월간 코드 챌린지 시즌3)</h3>
<ul>
<li><p>정수 <code>n</code>, <code>left</code>, <code>right</code>가 주어집니다. 다음 과정을 거쳐서 1차원 배열을 만들고자 합니다.<br></p>
<ul>
<li><p><code>n</code>행 <code>n</code>열 크기의 비어있는 2차원 배열을 만듭니다.</p>
</li>
<li><p><code>i = 1, 2, 3, ..., n</code>에 대해서, 다음 과정을 반복합니다.</p>
</li>
<li><p>1행 1열부터 <code>i</code>행 <code>i</code>열까지의 영역 내의 모든 빈 칸을 숫자 <code>i</code>로 채웁니다.</p>
</li>
<li><p>1행, 2행, ..., <code>n</code>행을 잘라내어 모두 이어붙인 새로운 1차원 배열을 만듭니다.</p>
</li>
<li><p>새로운 1차원 배열을 <code>arr</code>이라 할 때, <code>arr[left], arr[left+1], ..., arr[right]</code>만 남기고 나머지는 지웁니다.</p>
</li>
<li><p>정수 <code>n</code>, <code>left</code>, <code>right</code>가 매개변수로 주어집니다. 주어진 과정대로 만들어진 1차원 배열을 return 하도록 solution 함수를 완성해주세요.</p>
</li>
<li><p>제한사항</p>
<ul>
<li>1 ≤ <code>n</code> ≤ 10^7</li>
<li>0 ≤ <code>left</code> ≤ <code>right</code> &lt; n^2</li>
<li><code>right</code> - <code>left</code> &lt; 10^5</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(n, left, right):
    result = []
    for i in range(left, right + 1):
        row = i // n
        col = i % n
        result.append(max(row, col) + 1)

    return result</code></pre>
<hr>
<h3 id="행렬의-곱셈-연습문제">행렬의 곱셈 (연습문제)</h3>
<ul>
<li><p>2차원 행렬 arr1과 arr2를 입력받아, arr1에 arr2를 곱한 결과를 반환하는 함수, solution을 완성해주세요.</p>
<ul>
<li>제한사항<ul>
<li>행렬 arr1, arr2의 행과 열의 길이는 2 이상 100 이하입니다.</li>
<li>행렬 arr1, arr2의 원소는 -10 이상 20 이하인 자연수입니다.</li>
<li>곱할 수 있는 배열만 주어집니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">import numpy as np

def solution(arr1, arr2):
    arr1_np = np.array(arr1)
    arr2_np = np.array(arr2)
    result = np.dot(arr1_np, arr2_np)

    return result.tolist()  </code></pre>
<hr>
<h3 id="할인행사-연습문제">할인행사 (연습문제)</h3>
<ul>
<li><p>XYZ 마트는 일정한 금액을 지불하면 10일 동안 회원 자격을 부여합니다. XYZ 마트에서는 회원을 대상으로 매일 한 가지 제품을 할인하는 행사를 합니다. 할인하는 제품은 하루에 하나씩만 구매할 수 있습니다. 알뜰한 정현이는 자신이 원하는 제품과 수량이 할인하는 날짜와 10일 연속으로 일치할 경우에 맞춰서 회원가입을 하려 합니다.<br>
예를 들어, 정현이가 원하는 제품이 바나나 3개, 사과 2개, 쌀 2개, 돼지고기 2개, 냄비 1개이며, XYZ 마트에서 14일간 회원을 대상으로 할인하는 제품이 날짜 순서대로 치킨, 사과, 사과, 바나나, 쌀, 사과, 돼지고기, 바나나, 돼지고기, 쌀, 냄비, 바나나, 사과, 바나나인 경우에 대해 알아봅시다. 첫째 날부터 열흘 간에는 냄비가 할인하지 않기 때문에 첫째 날에는 회원가입을 하지 않습니다. 둘째 날부터 열흘 간에는 바나나를 원하는 만큼 할인구매할 수 없기 때문에 둘째 날에도 회원가입을 하지 않습니다. 셋째 날, 넷째 날, 다섯째 날부터 각각 열흘은 원하는 제품과 수량이 일치하기 때문에 셋 중 하루에 회원가입을 하려 합니다.<br>
정현이가 원하는 제품을 나타내는 문자열 배열 <code>want</code>와 정현이가 원하는 제품의 수량을 나타내는 정수 배열 <code>number</code>, XYZ 마트에서 할인하는 제품을 나타내는 문자열 배열 <code>discount</code>가 주어졌을 때, 회원등록시 정현이가 원하는 제품을 모두 할인 받을 수 있는 회원등록 날짜의 총 일수를 return 하는 solution 함수를 완성하시오. 가능한 날이 없으면 0을 return 합니다.</p>
<ul>
<li>제한사항<ul>
<li>1 ≤ <code>want</code>의 길이 = <code>number</code>의 길이 ≤ 10<ul>
<li>1 ≤ <code>number</code>의 원소 ≤ 10</li>
<li><code>number[i]</code>는 <code>want[i]</code>의 수량을 의미하며, <code>number</code>의 원소의 합은 10입니다.</li>
<li>10 ≤ <code>discount</code>의 길이 ≤ 100,000</li>
<li><code>want</code>와 <code>discount</code>의 원소들은 알파벳 소문자로 이루어진 문자열입니다<ul>
<li>1 ≤ <code>want</code>의 원소의 길이, <code>discount</code>의 원소의 길이 ≤ 12</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(want, number, discount):
    answer = 0
    dict_wishlist = {}

    for i in range(len(want)):
        dict_wishlist[want[i]] = number[i]

    for i in range(len(discount) - 9):
        dict_tmp = dict_wishlist.copy()
        for j in range(i, i + 10):
            if discount[j] in dict_tmp and dict_tmp[discount[j]] != 0:
                dict_tmp[discount[j]] -= 1
            else:
                break
        if sum(dict_tmp.values()) == 0:
            answer += 1

    return answer  </code></pre>
<hr>
<h3 id="의상-해시">의상 (해시)</h3>
<ul>
<li>코니는 매일 다른 옷을 조합하여 입는것을 좋아합니다.<br>
예를 들어 코니가 가진 옷이 아래와 같고, 오늘 코니가 동그란 안경, 긴 코트, 파란색 티셔츠를 입었다면 다음날은 청바지를 추가로 입거나 동그란 안경 대신 검정 선글라스를 착용하거나 해야합니다.<br>
종류    이름
얼굴    동그란 안경, 검정 선글라스
상의    파란색 티셔츠
하의    청바지
겉옷    긴 코트<br></li>
<li>코니는 각 종류별로 최대 1가지 의상만 착용할 수 있습니다. 예를 들어 위 예시의 경우 동그란 안경과 검정 선글라스를 동시에 착용할 수는 없습니다.</li>
<li>착용한 의상의 일부가 겹치더라도, 다른 의상이 겹치지 않거나, 혹은 의상을 추가로 더 착용한 경우에는 서로 다른 방법으로 옷을 착용한 것으로 계산합니다.</li>
<li>코니는 하루에 최소 한 개의 의상은 입습니다.</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;코니가 가진 의상들이 담긴 2차원 배열 clothes가 주어질 때 서로 다른
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;옷의 조합의 수를 return 하도록 solution 함수를 작성해주세요.<br>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 제한사항
     &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- clothes의 각 행은 [의상의 이름, 의상의 종류]로 이루어져 있습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 코니가 가진 의상의 수는 1개 이상 30개 이하입니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 같은 이름을 가진 의상은 존재하지 않습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- clothes의 모든 원소는 문자열로 이루어져 있습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 모든 문자열의 길이는 1 이상 20 이하인 자연수이고 알파벳 소문자
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;또는 &#39;_&#39; 로만 이루어져 있습니다.</p>
<p>제출한 코드 :</p>
<pre><code class="language-python">from collections import defaultdict

def solution(clothes):
    clothes_dict = defaultdict(int)

    for _, category in clothes:
        clothes_dict[category] += 1

    answer = 1

    for count in clothes_dict.values():
        answer *= (count + 1)

    return answer - 1 # 모든 종류에서 아무 의상도 입지 않은 경우를 제외하고 반환  </code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] Hacker Rank 문제 연습 4]]></title>
            <link>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-4</link>
            <guid>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-4</guid>
            <pubDate>Tue, 28 May 2024 15:48:51 GMT</pubDate>
            <description><![CDATA[<h3 id="weather-observation-station-10-basic-select">Weather Observation Station 10 (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/1bf447b4-f5b2-420d-b56d-96ede4da38df/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT DISTINCT CITY
FROM STATION
WHERE RIGHT(CITY, 1) NOT IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;);</code></pre>
<hr>
<h3 id="weather-observation-station-11-basic-select">Weather Observation Station 11 (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/1f901de6-b011-4243-a831-590f861a1f4f/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT DISTINCT CITY
FROM STATION 
WHERE LEFT(CITY, 1) NOT IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;)
   OR RIGHT(CITY, 1) NOT IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;);
</code></pre>
<hr>
<h3 id="weather-observation-station-12-basic-select">Weather Observation Station 12 (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/404571d4-5c57-46ea-bb1d-0231c6f4959f/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT DISTINCT CITY
FROM STATION 
WHERE LEFT(CITY, 1) NOT IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;)
    AND RIGHT(CITY, 1)  NOT IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;);</code></pre>
<hr>
<h3 id="higher-than-75-marks-basic-select">Higher Than 75 Marks (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/6db98ef2-fc88-4d63-931e-65207a47b286/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT NAME
FROM STUDENTS
WHERE MARKS  &gt; 75
ORDER BY RIGHT(NAME, 3) ASC, ID ASC;</code></pre>
<hr>
<h3 id="employee-names-basic-select">Employee Names (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/957e02e1-2989-48be-b163-92de4eb97136/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT NAME
FROM EMPLOYEE
ORDER BY NAME ASC;
</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] Hacker Rank 문제 연습 3]]></title>
            <link>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-3</link>
            <guid>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-3</guid>
            <pubDate>Mon, 27 May 2024 15:57:38 GMT</pubDate>
            <description><![CDATA[<h3 id="weather-observation-station-5-basic-select">Weather Observation Station 5 (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/621ffdb0-71df-4db1-9b6c-02b8ad9421f4/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">(
    SELECT CITY, LENGTH(CITY) AS LEN
    FROM STATION
    ORDER BY LENGTH(CITY) ASC, CITY ASC
    LIMIT 1
)

UNION ALL

(
    SELECT CITY, LENGTH(CITY) AS LEN
    FROM STATION
    ORDER BY LENGTH(CITY) DESC, CITY ASC
    LIMIT 1
);
</code></pre>
<hr>
<h3 id="weather-observation-station-6-basic-select">Weather Observation Station 6 (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/91ad34fa-5044-47b1-aba6-fa076f403ad3/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY, 1) IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;);</code></pre>
<blockquote>
<p>LEFT 함수</p>
</blockquote>
<ul>
<li>문자열의 왼쪽에서부터 지정한 수의 문자를 반환하는 함수 <pre><code class="language-sql">LEFT(문자열, 길이)</code></pre>
</li>
<li>길이 : 반환할 문자 수(정수). 문자열의 왼쪽부터 얼마나 많은 문자를 반환할지를 나타낸다.
<br>예)<pre><code class="language-sql">SELECT LEFT(&#39;Hello, World!&#39;, 3);</code></pre>
반환값 : Hel</li>
</ul>
<blockquote>
<p>물론 </p>
</blockquote>
<pre><code class="language-sql">SELECT DISTINCT CITY
FROM STATION
WHERE CITY LIKE &#39;a%&#39; 
   OR CITY LIKE &#39;e%&#39; 
   OR CITY LIKE &#39;i%&#39; 
   OR CITY LIKE &#39;o%&#39; 
   OR CITY LIKE &#39;u%&#39;;</code></pre>
<p>이렇게 하나하나 작성하는 방법도 있다. </p>
<hr>
<h3 id="weather-observation-station-7-basic-select">Weather Observation Station 7 (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/0c6821fc-e14b-4a53-820a-16f99c04adcb/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT DISTINCT CITY
FROM STATION
WHERE RIGHT(CITY, 1) IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;);</code></pre>
<blockquote>
<p>LEFT 함수와 반대이다. 사용법은 동일</p>
</blockquote>
<hr>
<h3 id="weather-observation-station-8-basic-select">Weather Observation Station 8 (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/adf130b6-6434-4d28-b876-92f4ff8509e0/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY, 1) IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;)
  AND RIGHT(CITY, 1) IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;);</code></pre>
<hr>
<h3 id="weather-observation-station-9-basic-select">Weather Observation Station 9 (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/ee20fa87-11ae-4690-be09-63310c0f3843/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT DISTINCT CITY
FROM STATION
WHERE LEFT(CITY, 1) NOT IN (&#39;a&#39;, &#39;e&#39;, &#39;i&#39;, &#39;o&#39;, &#39;u&#39;);</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 알고리즘 연습 17 (프로그래머스)]]></title>
            <link>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-17-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</link>
            <guid>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-17-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</guid>
            <pubDate>Mon, 27 May 2024 15:53:09 GMT</pubDate>
            <description><![CDATA[<h3 id="n개의-최소공배수-연습문제">N개의 최소공배수 (연습문제)</h3>
<ul>
<li><p>두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.</p>
<ul>
<li>제한사항<ul>
<li>arr은 길이 1이상, 15이하인 배열입니다.</li>
<li>arr의 원소는 100 이하인 자연수입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">import math

def lcm(x, y):
    # 두 수의 최소공배수를 계산하는 함수
    return x * y // math.gcd(x, y)

def solution(arr):
    answer = arr[0]
    for num in arr[1:]:
        # answer와 현재 수의 최소공배수를 계산하여 answer에 저장
        answer = lcm(answer, num)
    return answer</code></pre>
<hr>
<h3 id="멀리뛰기-연습문제">멀리뛰기 (연습문제)</h3>
<ul>
<li><p>효진이는 멀리 뛰기를 연습하고 있습니다. 효진이는 한번에 1칸, 또는 2칸을 뛸 수 있습니다. 칸이 총 4개 있을 때, 효진이는
(1칸, 1칸, 1칸, 1칸)
(1칸, 2칸, 1칸)
(1칸, 1칸, 2칸)
(2칸, 1칸, 1칸)
(2칸, 2칸)
의 5가지 방법으로 맨 끝 칸에 도달할 수 있습니다. 멀리뛰기에 사용될 칸의 수 n이 주어질 때, 효진이가 끝에 도달하는 방법이 몇 가지인지 알아내, 여기에 1234567를 나눈 나머지를 리턴하는 함수, solution을 완성하세요. 예를 들어 4가 입력된다면, 5를 return하면 됩니다.</p>
<ul>
<li>제한사항<ul>
<li>n은 1 이상, 2000 이하인 정수입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(n):
    answer = 0
    a, b = 0,1

    for i in range(n) :
        a,b = b, a+b

    answer = b % 1234567
    return answer</code></pre>
<hr>
<h3 id="귤-고르기-연습문제">귤 고르기 (연습문제)</h3>
<ul>
<li><p>경화는 과수원에서 귤을 수확했습니다. 경화는 수확한 귤 중 &#39;k&#39;개를 골라 상자 하나에 담아 판매하려고 합니다. 그런데 수확한 귤의 크기가 일정하지 않아 보기에 좋지 않다고 생각한 경화는 귤을 크기별로 분류했을 때 서로 다른 종류의 수를 최소화하고 싶습니다.<br>
예를 들어, 경화가 수확한 귤 8개의 크기가 [1, 3, 2, 5, 4, 5, 2, 3] 이라고 합시다. 경화가 귤 6개를 판매하고 싶다면, 크기가 1, 4인 귤을 제외한 여섯 개의 귤을 상자에 담으면, 귤의 크기의 종류가 2, 3, 5로 총 3가지가 되며 이때가 서로 다른 종류가 최소일 때입니다.<br>
경화가 한 상자에 담으려는 귤의 개수 <code>k</code>와 귤의 크기를 담은 배열 <code>tangerine</code>이 매개변수로 주어집니다. 경화가 귤 k개를 고를 때 크기가 서로 다른 종류의 수의 최솟값을 return 하도록 solution 함수를 작성해주세요.</p>
<ul>
<li>제한사항<ul>
<li>1 ≤ k ≤ tangerine의 길이 ≤ 100,000<ul>
<li>1 ≤ tangerine의 원소 ≤ 10,000,000</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(k, tangerine):
    answer = 0
    a = {}

    for i in tangerine:
        if i in a:
            a[i] += 1
        else:
            a[i] = 1

    a = dict(sorted(a.items(), key=lambda x: x[1], reverse=True))

    for i in a:
        if k &lt;= 0:
            return answer
        k -= a[i]
        answer += 1
    return answer</code></pre>
<hr>
<h3 id="괄호-회전하기-월간-코드-챌린지-시즌2">괄호 회전하기 (월간 코드 챌린지 시즌2)</h3>
<ul>
<li><p>다음 규칙을 지키는 문자열을 올바른 괄호 문자열이라고 정의합니다.<br></p>
<ul>
<li><p><code>()</code>, <code>[]</code>, <code>{}</code> 는 모두 올바른 괄호 문자열입니다.</p>
</li>
<li><p>만약 <code>A</code>가 올바른 괄호 문자열이라면, <code>(A)</code>, <code>[A]</code>, <code>{A}</code> 도 올바른 괄호 문자열입니다. 예를 들어, <code>[]</code> 가 올바른 괄호 문자열이므로, <code>([])</code> 도 올바른 괄호 문자열입니다.</p>
</li>
<li><p>만약 <code>A</code>, <code>B</code>가 올바른 괄호 문자열이라면, <code>AB</code> 도 올바른 괄호 문자열입니다. 예를 들어, <code>{}</code> 와 <code>([])</code> 가 올바른 괄호 문자열이므로, <code>{}([])</code> 도 올바른 괄호 문자열입니다.<br>
대괄호, 중괄호, 그리고 소괄호로 이루어진 문자열 <code>s</code>가 매개변수로 주어집니다. 이 <code>s</code>를 왼쪽으로 x (0 ≤ x &lt; (<code>s</code>의 길이)) 칸만큼 회전시켰을 때 <code>s</code>가 올바른 괄호 문자열이 되게 하는 x의 개수를 return 하도록 solution 함수를 완성해주세요.</p>
</li>
<li><p>제한사항</p>
<ul>
<li>s의 길이는 1 이상 1,000 이하입니다. </li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def is_valid(s):
    stack = []
    for char in s:
        if char in [&#39;(&#39;, &#39;[&#39;, &#39;{&#39;]:
            stack.append(char)
        else:
            if not stack:
                return False
            if char == &#39;)&#39; and stack[-1] == &#39;(&#39;:
                stack.pop()
            elif char == &#39;]&#39; and stack[-1] == &#39;[&#39;:
                stack.pop()
            elif char == &#39;}&#39; and stack[-1] == &#39;{&#39;:
                stack.pop()
            else:
                return False
    return len(stack) == 0

def solution(s):
    count = 0
    for i in range(len(s)):
        rotated = s[i:] + s[:i]
        if is_valid(rotated):
            count += 1
    return count
</code></pre>
<hr>
<h3 id="연속-부분-수열-합의-개수-연습문제">연속 부분 수열 합의 개수 (연습문제)</h3>
<ul>
<li><p>철호는 수열을 가지고 놀기 좋아합니다. 어느 날 철호는 어떤 자연수로 이루어진 원형 수열의 연속하는 부분 수열의 합으로 만들 수 있는 수가 모두 몇 가지인지 알아보고 싶어졌습니다. 원형 수열이란 일반적인 수열에서 처음과 끝이 연결된 형태의 수열을 말합니다. 예를 들어 수열 [7, 9, 1, 1, 4] 로 원형 수열을 만들면 다음과 같습니다.
<img src="https://velog.velcdn.com/images/dyllis_lin/post/bd17d8a5-ff73-43d1-aa3c-74788ca20c3a/image.png" alt="">
원형 수열은 처음과 끝이 연결되어 끊기는 부분이 없기 때문에 연속하는 부분 수열도 일반적인 수열보다 많아집니다.
원형 수열의 모든 원소 <code>elements</code>가 순서대로 주어질 때, 원형 수열의 연속 부분 수열 합으로 만들 수 있는 수의 개수를 return 하도록 solution 함수를 완성해주세요.</p>
<ul>
<li>제한사항<ul>
<li>3 ≤<code>elements</code>의 길이 ≤ 1,000</li>
<li>1 ≤ <code>elements</code>의 원소 ≤ 1,000</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(elements):
    n = len(elements)
    total = set()

    for i in range(n):
        s = 0
        for j in range(n):
            s += elements[(i + j) % n]
            total.add(s)

    return len(total)</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 알고리즘 연습 16 (프로그래머스)]]></title>
            <link>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-16-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</link>
            <guid>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-16-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</guid>
            <pubDate>Mon, 27 May 2024 15:13:35 GMT</pubDate>
            <description><![CDATA[<h3 id="jadencase-문자열-만들기-연습문제">JadenCase 문자열 만들기 (연습문제)</h3>
<ul>
<li><p>JadenCase란 모든 단어의 첫 문자가 대문자이고, 그 외의 알파벳은 소문자인 문자열입니다. 단, 첫 문자가 알파벳이 아닐 때에는 이어지는 알파벳은 소문자로 쓰면 됩니다. (첫 번째 입출력 예 참고)
문자열 s가 주어졌을 때, s를 JadenCase로 바꾼 문자열을 리턴하는 함수, solution을 완성해주세요.</p>
<ul>
<li>제한사항<ul>
<li>s는 길이 1 이상 200 이하인 문자열입니다.<ul>
<li>s는 알파벳과 숫자, 공백문자(&quot; &quot;)로 이루어져 있습니다.</li>
<li>숫자는 단어의 첫 문자로만 나옵니다.</li>
<li>숫자로만 이루어진 단어는 없습니다.</li>
<li>공백문자가 연속해서 나올 수 있습니다. </li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(s):
    words = s.split(&#39; &#39;)
    jaden_case_words = []

    for word in words:
        if word:
            # 첫 문자가 알파벳이면 대문자로 변환, 나머지는 소문자로 변환
            jaden_case_words.append(word[0].upper() + word[1:].lower())
        else:
            # 공백인 경우 그대로 추가
            jaden_case_words.append(&#39;&#39;)

    return &#39; &#39;.join(jaden_case_words)</code></pre>
<hr>
<h3 id="이진-변환-반복하기-월간-코드-챌린지-시즌1">이진 변환 반복하기 (월간 코드 챌린지 시즌1)</h3>
<ul>
<li><p>0과 1로 이루어진 어떤 문자열 x에 대한 이진 변환을 다음과 같이 정의합니다.<BR></p>
<ol>
<li>x의 모든 0을 제거합니다.</li>
<li>x의 길이를 c라고 하면, x를 &quot;c를 2진법으로 표현한 문자열&quot;로 바꿉니다.<BR>
예를 들어, <code>x = &quot;0111010&quot;</code>이라면, x에 이진 변환을 가하면 <code>x = &quot;0111010&quot; -&gt; &quot;1111&quot; -&gt; &quot;100&quot;</code> 이 됩니다.<BR>
0과 1로 이루어진 문자열 s가 매개변수로 주어집니다. s가 &quot;1&quot;이 될 때까지 계속해서 s에 이진 변환을 가했을 때, 이진 변환의 횟수와 변환 과정에서 제거된 모든 0의 개수를 각각 배열에 담아 return 하도록 solution 함수를 완성해주세요.</li>
</ol>
<ul>
<li>제한사항<ul>
<li>s의 길이는 1 이상 150,000 이하입니다.</li>
<li>s에는 &#39;1&#39;이 최소 하나 이상 포함되어 있습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(s):
    answer = [0, 0]  # [이진 변환 횟수, 제거된 0의 개수]

    # s가 &quot;1&quot;이 될 때까지 반복
    while s != &quot;1&quot;:
        answer[0] += 1  # 이진 변환 횟수 증가
        answer[1] += s.count(&#39;0&#39;)  # 0의 개수를 세어 제거된 0의 개수에 추가
        s = bin(s.count(&#39;1&#39;))[2:]  # s에 이진 변환을 적용하여 다음 문자열로 업데이트

    return answer</code></pre>
<hr>
<h3 id="피보나치-수-연습문제">피보나치 수 (연습문제)</h3>
<ul>
<li><p>피보나치 수는 F(0) = 0, F(1) = 1일 때, 1 이상의 n에 대하여 F(n) = F(n-1) + F(n-2) 가 적용되는 수 입니다.<BR>
예를들어<BR></p>
<ul>
<li>F(2) = F(0) + F(1) = 0 + 1 = 1</li>
<li>F(3) = F(1) + F(2) = 1 + 1 = 2</li>
<li>F(4) = F(2) + F(3) = 1 + 2 = 3</li>
<li>F(5) = F(3) + F(4) = 2 + 3 = 5<BR>
와 같이 이어집니다.<BR>
2 이상의 n이 입력되었을 때, n번째 피보나치 수를 1234567으로 나눈 나머지를 리턴하는 함수, solution을 완성해 주세요.</li>
</ul>
<ul>
<li>제한사항<ul>
<li>n은 2 이상 100,000 이하인 자연수입니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(n):
    fibo = [0, 1]  # 초기 피보나치 수열
    MOD = 1234567  # 나머지

    # n까지 피보나치 수열 계산
    for i in range(2, n + 1):
        fibo.append((fibo[-1] + fibo[-2]) % MOD)

    return fibo[n]</code></pre>
<hr>
<h3 id="카펫-제출-내역">카펫 (제출 내역)</h3>
<ul>
<li><p>Leo는 카펫을 사러 갔다가 아래 그림과 같이 중앙에는 노란색으로 칠해져 있고 테두리 1줄은 갈색으로 칠해져 있는 격자 모양 카펫을 봤습니다.
<img src="https://velog.velcdn.com/images/dyllis_lin/post/77655877-603d-471d-8277-54b8105fbd9d/image.png" alt="">
Leo는 집으로 돌아와서 아까 본 카펫의 노란색과 갈색으로 색칠된 격자의 개수는 기억했지만, 전체 카펫의 크기는 기억하지 못했습니다.<BR>
Leo가 본 카펫에서 갈색 격자의 수 brown, 노란색 격자의 수 yellow가 매개변수로 주어질 때 카펫의 가로, 세로 크기를 순서대로 배열에 담아 return 하도록 solution 함수를 작성해주세요.</p>
<ul>
<li>제한사항<ul>
<li>갈색 격자의 수 brown은 8 이상 5,000 이하인 자연수입니다.</li>
<li>노란색 격자의 수 yellow는 1 이상 2,000,000 이하인 자연수입니다.</li>
<li>카펫의 가로 길이는 세로 길이와 같거나, 세로 길이보다 깁니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(brown, yellow):
    for i in range(1, yellow + 1):
        if yellow % i == 0:
            # yellow를 가로와 세로의 길이로 나눔
            if 2 * (i + yellow // i) + 4 == brown:
                # 갈색 격자 수와 일치하는 경우 가로와 세로의 길이 반환
                return [max(i, yellow // i) + 2, min(i, yellow // i) + 2]</code></pre>
<hr>
<h3 id="예상-대진표-2017-팁스타운">예상 대진표 (2017 팁스타운)</h3>
<ul>
<li><p>△△ 게임대회가 개최되었습니다. 이 대회는 N명이 참가하고, 토너먼트 형식으로 진행됩니다. N명의 참가자는 각각 1부터 N번을 차례대로 배정받습니다. 그리고, 1번↔2번, 3번↔4번, ... , N-1번↔N번의 참가자끼리 게임을 진행합니다. 각 게임에서 이긴 사람은 다음 라운드에 진출할 수 있습니다. 이때, 다음 라운드에 진출할 참가자의 번호는 다시 1번부터 N/2번을 차례대로 배정받습니다. 만약 1번↔2번 끼리 겨루는 게임에서 2번이 승리했다면 다음 라운드에서 1번을 부여받고, 3번↔4번에서 겨루는 게임에서 3번이 승리했다면 다음 라운드에서 2번을 부여받게 됩니다. 게임은 최종 한 명이 남을 때까지 진행됩니다.<BR>
이때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 궁금해졌습니다. 게임 참가자 수 N, 참가자 번호 A, 경쟁자 번호 B가 함수 solution의 매개변수로 주어질 때, 처음 라운드에서 A번을 가진 참가자는 경쟁자로 생각하는 B번 참가자와 몇 번째 라운드에서 만나는지 return 하는 solution 함수를 완성해 주세요. <strong>단, A번 참가자와 B번 참가자는 서로 붙게 되기 전까지 항상 이긴다고 가정합니다.</strong></p>
<ul>
<li>제한사항<ul>
<li>N : 21 이상 220 이하인 자연수 (2의 지수 승으로 주어지므로 부전승은 발생하지 않습니다.)</li>
<li>A, B : N 이하인 자연수 (단, A ≠ B 입니다.)</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(n, a, b):
    answer = 0

    # 대진이 이루어지는 참가자 번호의 범위를 정하고, 두 참가자가 만날 때까지 반복
    while a != b:
        answer += 1
        a = (a + 1) // 2  # 다음 라운드에서의 참가자 번호 계산
        b = (b + 1) // 2

    return answer</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] Hacker Rank 문제 연습 2]]></title>
            <link>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-2</link>
            <guid>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-2</guid>
            <pubDate>Mon, 27 May 2024 13:52:51 GMT</pubDate>
            <description><![CDATA[<h3 id="japanese-cities-attributes-basic-select">Japanese Cities&#39; Attributes (Basic Select)</h3>
<ul>
<li>문제
<img src="https://velog.velcdn.com/images/dyllis_lin/post/2870a059-aaae-4813-85ff-e0ea382cb6d6/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT *
FROM CITY
WHERE COUNTRYCODE = &#39;JPN&#39;;</code></pre>
<hr>
<h3 id="weather-observation-station-1-basic-select">Weather Observation Station 1 (Basic Select)</h3>
<ul>
<li>문제
<img src="https://velog.velcdn.com/images/dyllis_lin/post/52398211-4b43-4bde-9c28-b19d0cb57c85/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT CITY
       , STATE
FROM STATION</code></pre>
<hr>
<h3 id="weather-observation-station-2-aggregation">Weather Observation Station 2 (Aggregation)</h3>
<ul>
<li>문제
<img src="https://velog.velcdn.com/images/dyllis_lin/post/4ce24a91-cf85-4146-a15c-103dcdc844e0/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT ROUND(SUM(LAT_N), 2) AS LAT
       , ROUND(SUM(LONG_W), 2) AS LON
FROM STATION;
</code></pre>
<hr>
<h3 id="weather-observation-station-3-basic-select">Weather Observation Station 3 (Basic Select)</h3>
<ul>
<li>문제
<img src="https://velog.velcdn.com/images/dyllis_lin/post/5ca328e8-9c39-4fd2-96f0-b5465891b1f2/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT DISTINCT CITY
FROM STATION
WHERE ID % 2 = 0;</code></pre>
<hr>
<h3 id="weather-observation-station-4-basic-select">Weather Observation Station 4 (Basic Select)</h3>
<ul>
<li><img src="https://velog.velcdn.com/images/dyllis_lin/post/45fdf18c-2d7b-4eca-9229-f5bb7014c594/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT COUNT(*) - COUNT(DISTINCT CITY)
FROM STATION;</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 알고리즘 연습 15 (프로그래머스)]]></title>
            <link>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-15-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</link>
            <guid>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-15-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</guid>
            <pubDate>Mon, 27 May 2024 13:18:33 GMT</pubDate>
            <description><![CDATA[<h3 id="개인정보-수집-유효기간-2023-kakao-blind-recruitment">개인정보 수집 유효기간 (2023 KAKAO BLIND RECRUITMENT)</h3>
<ul>
<li><p>고객의 약관 동의를 얻어서 수집된 1~<code>n</code>번으로 분류되는 개인정보 <code>n</code>개가 있습니다. 약관 종류는 여러 가지 있으며 각 약관마다 개인정보 보관 유효기간이 정해져 있습니다. 당신은 각 개인정보가 어떤 약관으로 수집됐는지 알고 있습니다. 수집된 개인정보는 유효기간 전까지만 보관 가능하며, 유효기간이 지났다면 반드시 파기해야 합니다.<br>
예를 들어, A라는 약관의 유효기간이 12 달이고, 2021년 1월 5일에 수집된 개인정보가 A약관으로 수집되었다면 해당 개인정보는 2022년 1월 4일까지 보관 가능하며 2022년 1월 5일부터 파기해야 할 개인정보입니다.
당신은 오늘 날짜로 파기해야 할 개인정보 번호들을 구하려 합니다.<br>
모든 달은 28일까지 있다고 가정합니다.<br>
다음은 오늘 날짜가 <code>2022.05.19</code>일 때의 예시입니다.<br>
약관 종류    유효기간
A    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6 달
B    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12 달
C    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3 달<br>
번호    개인정보 수집 일자    약관 종류
1    &nbsp;&nbsp;&nbsp;&nbsp;2021.05.02    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A
2    &nbsp;&nbsp;&nbsp;&nbsp;2021.07.01    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;B
3    &nbsp;&nbsp;&nbsp;&nbsp;2022.02.19    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C
4    &nbsp;&nbsp;&nbsp;&nbsp;2022.02.20    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;C<br></p>
<ul>
<li>첫 번째 개인정보는 A약관에 의해 2021년 11월 1일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.</li>
<li>두 번째 개인정보는 B약관에 의해 2022년 6월 28일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.</li>
<li>세 번째 개인정보는 C약관에 의해 2022년 5월 18일까지 보관 가능하며, 유효기간이 지났으므로 파기해야 할 개인정보입니다.</li>
<li>네 번째 개인정보는 C약관에 의해 2022년 5월 19일까지 보관 가능하며, 유효기간이 지나지 않았으므로 아직 보관 가능합니다.<br></li>
</ul>
</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;따라서 파기해야 할 개인정보 번호는 [1, 3]입니다.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;오늘 날짜를 의미하는 문자열 <code>today</code>, 약관의 유효기간을 담은
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1차원 문자열 배열 <code>terms</code>와 수집된 개인정보의 정보를 담은
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1차원 문자열 배열 <code>privacies</code>가 매개변수로 주어집니다. 
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;이때 파기해야 할 개인정보의 번호를 오름차순으로 1차원 정수
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;배열에 담아 return 하도록 solution 함수를 완성해 주세요.</p>
<ul>
<li>제한사항<ul>
<li><code>today</code>는 &quot;<code>YYYY</code>.<code>MM</code>.<code>DD</code>&quot; 형태로 오늘 날짜를 나타냅니다.</li>
<li>1 ≤ <code>terms</code>의 길이 ≤ 20<ul>
<li><code>terms</code>의 원소는 &quot;<code>약관 종류</code> <code>유효기간</code>&quot; 형태의 <code>약관 종류</code>와 <code>유효기간</code>을 공백 하나로 구분한 문자열입니다.</li>
<li><code>약관 종류</code>는 <code>A</code>~<code>Z</code>중 알파벳 대문자 하나이며, <code>terms</code> 배열에서 <code>약관 종류</code>는 중복되지 않습니다.</li>
<li><code>유효기간</code>은 개인정보를 보관할 수 있는 달 수를 나타내는 정수이며, 1 이상 100 이하입니다.</li>
</ul>
</li>
<li>1 ≤ <code>privacies</code>의 길이 ≤ 100<ul>
<li><code>privacies[i]</code>는 <code>i+1</code>번 개인정보의 수집 일자와 약관 종류를 나타냅니다.</li>
<li><code>privacies</code>의 원소는 &quot;<code>날짜</code> <code>약관 종류</code>&quot; 형태의 날짜와 약관 종류를 공백 하나로 구분한 문자열입니다</li>
<li><code>날짜</code>는 &quot;<code>YYYY</code>.<code>MM</code>.<code>DD</code>&quot; 형태의 개인정보가 수집된 날짜를 나타내며, <code>today</code> 이전의 날짜만 주어집니다.</li>
<li><code>privacies</code>의 <code>약관 종류</code>는 항상 <code>terms</code>에 나타난 <code>약관 종류</code>만 주어집니다.</li>
</ul>
</li>
<li><code>today</code>와 <code>privacies</code>에 등장하는 <code>날짜</code>의 <code>YYYY</code>는 연도, <code>MM</code>은 월, <code>DD</code>는 일을 나타내며 점(<code>.</code>) 하나로 구분되어 있습니다.<ul>
<li>2000 ≤ <code>YYYY</code> ≤ 2022</li>
<li>1 ≤ <code>MM</code> ≤ 12</li>
<li><code>MM</code>이 한 자릿수인 경우 앞에 0이 붙습니다.</li>
<li>1 ≤ <code>DD</code> ≤ 28</li>
<li><code>DD</code>가 한 자릿수인 경우 앞에 0이 붙습니다.</li>
</ul>
</li>
<li>파기해야 할 개인정보가 하나 이상 존재하는 입력만 주어집니다.</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta

def get_date(date):
    return datetime.strptime(date, &quot;%Y.%m.%d&quot;)

def solution(today, terms, privacies):
    today = get_date(today)
    answer = []
    tm = {}

    for t in terms:
        term, mon = t.split(&quot; &quot;)
        tm[term] = int(mon)

    for i, p in enumerate(privacies):
        date, term = p.split(&quot; &quot;)
        time = tm[term]
        start_date = get_date(date)
        end_date = start_date + relativedelta(months=time)

        if end_date &lt;= today:
            answer.append(i+1)

    return answer</code></pre>
<hr>
<h3 id="달리기-경주-연습문제">달리기 경주 (연습문제)</h3>
<ul>
<li><p>얀에서는 매년 달리기 경주가 열립니다. 해설진들은 선수들이 자기 바로 앞의 선수를 추월할 때 추월한 선수의 이름을 부릅니다. 예를 들어 1등부터 3등까지 &quot;mumu&quot;, &quot;soe&quot;, &quot;poe&quot; 선수들이 순서대로 달리고 있을 때, 해설진이 &quot;soe&quot;선수를 불렀다면 2등인 &quot;soe&quot; 선수가 1등인 &quot;mumu&quot; 선수를 추월했다는 것입니다. 즉 &quot;soe&quot; 선수가 1등, &quot;mumu&quot; 선수가 2등으로 바뀝니다.<br>
선수들의 이름이 1등부터 현재 등수 순서대로 담긴 문자열 배열 <code>players</code>와 해설진이 부른 이름을 담은 문자열 배열 <code>callings</code>가 매개변수로 주어질 때, 경주가 끝났을 때 선수들의 이름을 1등부터 등수 순서대로 배열에 담아 return 하는 solution 함수를 완성해주세요.<br></p>
<ul>
<li>제한사항<ul>
<li>5 ≤ <code>players</code>의 길이 ≤ 50,000<ul>
<li><code>players[i]</code>는 i번째 선수의 이름을 의미합니다.<ul>
<li><code>players</code>의 원소들은 알파벳 소문자로만 이루어져 있습니다.</li>
<li><code>players</code>에는 중복된 값이 들어가 있지 않습니다.</li>
<li>3 ≤ <code>players[i]</code>의 길이 ≤ 10</li>
</ul>
</li>
</ul>
</li>
<li>2 ≤ <code>callings</code>의 길이 ≤ 1,000,000<ul>
<li><code>callings</code>는 <code>players</code>의 원소들로만 이루어져 있습니다.</li>
<li>경주 진행중 1등인 선수의 이름은 불리지 않습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(players, callings):
    # 선수들의 현재 위치를 기록하는 딕셔너리
    position = {player: idx for idx, player in enumerate(players)}

    for call in callings:
        # 추월한 선수의 현재 위치
        current_idx = position[call]

        if current_idx &gt; 0:  # 현재 1등은 추월하지 않기 때문에
            # 앞선 선수의 이름
            prev_player = players[current_idx - 1]

            # 선수들의 위치를 서로 교환
            players[current_idx - 1], players[current_idx] = players[current_idx], players[current_idx - 1]

            # 위치 정보 업데이트
            position[call], position[prev_player] = position[prev_player], position[call]

    return players</code></pre>
<hr>
<h3 id="공원-산책-연습문제">공원 산책 (연습문제)</h3>
<ul>
<li><p>지나다니는 길을 &#39;O&#39;, 장애물을 &#39;X&#39;로 나타낸 직사각형 격자 모양의 공원에서 로봇 강아지가 산책을 하려합니다. 산책은 로봇 강아지에 미리 입력된 명령에 따라 진행하며, 명령은 다음과 같은 형식으로 주어집니다.<br></p>
<ul>
<li>[&quot;방향 거리&quot;, &quot;방향 거리&quot; … ]<Br></li>
</ul>
</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;예를 들어 &quot;E 5&quot;는 로봇 강아지가 현재 위치에서 동쪽으로 5칸
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;이동했다는 의미입니다. 로봇 강아지는 명령을 수행하기 전에
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;다음 두 가지를 먼저 확인합니다.<br></p>
<ul>
<li><p>주어진 방향으로 이동할 때 공원을 벗어나는지 확인합니다.</p>
</li>
<li><p>주어진 방향으로 이동 중 장애물을 만나는지 확인합니다.</p>
<p>위 두 가지중 어느 하나라도 해당된다면, 로봇 강아지는 해당 명령을 무시하고 다음 명령을 수행합니다.
공원의 가로 길이가 W, 세로 길이가 H라고 할 때, 공원의 좌측 상단의 좌표는 (0, 0), 우측 하단의 좌표는 (H - 1, W - 1) 입니다.
<img src="https://velog.velcdn.com/images/dyllis_lin/post/b6824123-e314-4843-b3bc-b580f05dc1e7/image.png" alt="">공원을 나타내는 문자열 배열 <code>park</code>, 로봇 강아지가 수행할 명령이 담긴 문자열 배열 <code>routes</code>가 매개변수로 주어질 때, 로봇 강아지가 모든 명령을 수행 후 놓인 위치를 [세로 방향 좌표, 가로 방향 좌표] 순으로 배열에 담아 return 하도록 solution 함수를 완성해주세요.</p>
</li>
<li><p>제한사항</p>
<ul>
<li>3 ≤ <code>park</code>의 길이 ≤ 50<ul>
<li>3 ≤ <code>park[i]</code>의 길이 ≤ 50<ul>
<li>park[i]는 다음 문자들로 이루어져 있으며 시작지점은 하나만 주어집니다.<ul>
<li>S : 시작 지점</li>
<li>O : 이동 가능한 통로</li>
<li>X : 장애물</li>
</ul>
</li>
<li><code>park</code>는 직사각형 모양입니다.</li>
</ul>
</li>
<li>1 ≤ <code>routes</code>의 길이 ≤ 50</li>
<li><code>routes</code>의 각 원소는 로봇 강아지가 수행할 명령어를 나타냅니다.</li>
<li>로봇 강아지는 <code>routes</code>의 첫 번째 원소부터 순서대로 명령을 수행합니다.</li>
<li><code>routes</code>의 원소는 &quot;op n&quot;과 같은 구조로 이루어져 있으며, op는 이동할 방향, n은 이동할 칸의 수를 의미합니다.<ul>
<li>op는 다음 네 가지중 하나로 이루어져 있습니다.<ul>
<li>N : 북쪽으로 주어진 칸만큼 이동합니다.</li>
<li>S : 남쪽으로 주어진 칸만큼 이동합니다.</li>
<li>W : 서쪽으로 주어진 칸만큼 이동합니다.</li>
<li>E : 동쪽으로 주어진 칸만큼 이동합니다.</li>
</ul>
</li>
<li>1 ≤ n ≤ 9</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(park, routes):
    # 공원의 크기
    h = len(park)
    w = len(park[0])

    # 초기 위치 찾기
    for i in range(h):
        for j in range(w):
            if park[i][j] == &#39;S&#39;:
                start_pos = (i, j)
                break

    # 방향 설정
    directions = {
        &#39;N&#39;: (-1, 0),
        &#39;S&#39;: (1, 0),
        &#39;W&#39;: (0, -1),
        &#39;E&#39;: (0, 1)
    }

    current_pos = start_pos

    # 명령 처리
    for route in routes:
        direction, distance = route.split()
        distance = int(distance)
        new_pos = current_pos

        # 이동 가능 여부 확인
        for step in range(1, distance + 1):
            next_pos = (new_pos[0] + directions[direction][0], new_pos[1] + directions[direction][1])

            # 공원을 벗어나는지 확인
            if not (0 &lt;= next_pos[0] &lt; h and 0 &lt;= next_pos[1] &lt; w):
                break

            # 장애물인지 확인
            if park[next_pos[0]][next_pos[1]] == &#39;X&#39;:
                break

            new_pos = next_pos
        else:
            # 모두 성공한 경우 현재 위치 업데이트
            current_pos = new_pos

    return [current_pos[0], current_pos[1]]</code></pre>
<hr>
<h3 id="신고-결과-받기-2022-kakao-blind-recruitment">신고 결과 받기 (2022 KAKAO BLIND RECRUITMENT)</h3>
<ul>
<li>신입사원 무지는 게시판 불량 이용자를 신고하고 처리 결과를 메일로 발송하는 시스템을 개발하려 합니다. 무지가 개발하려는 시스템은 다음과 같습니다.<ul>
<li>각 유저는 한 번에 한 명의 유저를 신고할 수 있습니다.<ul>
<li>신고 횟수에 제한은 없습니다. 서로 다른 유저를 계속해서 신고할 수 있습니다.</li>
<li>한 유저를 여러 번 신고할 수도 있지만, 동일한 유저에 대한 신고 횟수는 1회로 처리됩니다.</li>
</ul>
</li>
<li>k번 이상 신고된 유저는 게시판 이용이 정지되며, 해당 유저를 신고한 모든 유저에게 정지 사실을 메일로 발송합니다.<ul>
<li>유저가 신고한 모든 내용을 취합하여 마지막에 한꺼번에 게시판 이용 정지를 시키면서 정지 메일을 발송합니다.<Br></li>
</ul>
</li>
</ul>
</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;다음은 전체 유저 목록이 [&quot;muzi&quot;, &quot;frodo&quot;, &quot;apeach&quot;, &quot;neo&quot;]이고,
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;k = 2(즉, 2번 이상 신고당하면 이용 정지)인 경우의 예시입니다.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;유저 ID    &nbsp;&nbsp;유저가 신고한 ID    &nbsp;&nbsp;설명
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;muzi&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;frodo&quot;    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;muzi&quot;가 &quot;frodo&quot;를 신고했습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;apeach&quot;&nbsp;&nbsp;&quot;frodo&quot;    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;apeach&quot;가 &quot;frodo&quot;를
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;신고했습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;frodo&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;neo&quot;    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;frodo&quot;가 &quot;neo&quot;를 신고했습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;muzi&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;neo&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;muzi&quot;가 &quot;neo&quot;를 신고했습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;apeach&quot;&nbsp;&nbsp;&nbsp;&quot;muzi&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;apeach&quot;가 &quot;muzi&quot;를
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;신고했습니다.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;각 유저별로 신고당한 횟수는 다음과 같습니다.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;유저 ID&nbsp;&nbsp;&nbsp;신고당한 횟수
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;muzi&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;frodo&quot;&nbsp;&nbsp;&nbsp;&nbsp;2
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;apeach&quot;&nbsp;&nbsp;0
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;neo&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;위 예시에서는 2번 이상 신고당한 &quot;frodo&quot;와 &quot;neo&quot;의 게시판
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;이용이 정지됩니다. 이때, 각 유저별로 신고한 아이디와 정지된
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;아이디를 정리하면 다음과 같습니다.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;유저 ID&nbsp;&nbsp;&nbsp;유저가 신고한 ID    정지된 ID
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;muzi&quot;&nbsp;&nbsp;&nbsp;&nbsp;[&quot;frodo&quot;, &quot;neo&quot;]    &nbsp;&nbsp;&nbsp;[&quot;frodo&quot;, &quot;neo&quot;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;frodo&quot; &nbsp;&nbsp;[&quot;neo&quot;]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[&quot;neo&quot;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;apeach&quot;&nbsp;[&quot;muzi&quot;, &quot;frodo&quot;]&nbsp;&nbsp;&nbsp;[&quot;frodo&quot;]
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;neo&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;없음&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;없음<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;따라서 &quot;muzi&quot;는 처리 결과 메일을 2회, &quot;frodo&quot;와 &quot;apeach&quot;는
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;각각 처리 결과 메일을 1회 받게 됩니다.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;이용자의 ID가 담긴 문자열 배열 <code>id_list</code>, 각 이용자가 신고한
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;이용자의 ID 정보가 담긴 문자열 배열 <code>report</code>, 정지 기준이
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;되는 신고 횟수 <code>k</code>가 매개변수로 주어질 때, 각 유저별로 처리
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;결과 메일을 받은 횟수를 배열에 담아 return 하도록 solution
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;함수를 완성해주세요.<br></p>
<ul>
<li>제한사항<ul>
<li>2 ≤ <code>id_list</code>의 길이 ≤ 1,000<ul>
<li>1 ≤ <code>id_list</code>의 원소 길이 ≤ 10</li>
<li><code>id_list</code>의 원소는 이용자의 id를 나타내는 문자열이며 알파벳 소문자로만 이루어져 있습니다.</li>
<li><code>id_list</code>에는 같은 아이디가 중복해서 들어있지 않습니다.</li>
</ul>
</li>
<li>1 ≤ <code>report</code>의 길이 ≤ 200,000<ul>
<li>3 ≤ <code>report</code>의 원소 길이 ≤ 21</li>
<li><code>report</code>의 원소는 &quot;이용자id 신고한id&quot;형태의 문자열입니다.</li>
<li>예를 들어 &quot;muzi frodo&quot;의 경우 &quot;muzi&quot;가 &quot;frodo&quot;를 신고했다는 의미입니다.</li>
<li>id는 알파벳 소문자로만 이루어져 있습니다.</li>
<li>이용자id와 신고한id는 공백(스페이스)하나로 구분되어 있습니다.</li>
<li>자기 자신을 신고하는 경우는 없습니다.</li>
<li>1 ≤ <code>k</code> ≤ 200, <code>k</code>는 자연수입니다.</li>
<li>return 하는 배열은 <code>id_list</code>에 담긴 id 순서대로 각 유저가 받은 결과 메일 수를 담으면 됩니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(id_list, report, k):
    # 중복 제거된 신고 내역을 저장할 세트
    report_set = set(report)

    # 각 유저가 신고당한 횟수를 저장할 딕셔너리
    report_count = {user: 0 for user in id_list}

    # 각 유저가 신고한 유저 목록을 저장할 딕셔너리
    user_reports = {user: [] for user in id_list}

    # 신고 내역 처리
    for rep in report_set:
        reporter, reported = rep.split()
        report_count[reported] += 1
        user_reports[reporter].append(reported)

    # 정지된 유저 리스트
    suspended_users = {user for user, count in report_count.items() if count &gt;= k}

    # 결과 메일 횟수 저장 리스트
    result = [0] * len(id_list)

    # 각 유저가 받은 메일 수 계산
    for i, user in enumerate(id_list):
        result[i] = len([reported for reported in user_reports[user] if reported in suspended_users])

    return result</code></pre>
<hr>
<h3 id="최댓값과-최솟값-연습문제">최댓값과 최솟값 (연습문제)</h3>
<ul>
<li><p>문자열 s에는 공백으로 구분된 숫자들이 저장되어 있습니다. str에 나타나는 숫자 중 최소값과 최대값을 찾아 이를 &quot;(최소값) (최대값)&quot;형태의 문자열을 반환하는 함수, solution을 완성하세요.
예를들어 s가 &quot;1 2 3 4&quot;라면 &quot;1 4&quot;를 리턴하고, &quot;-1 -2 -3 -4&quot;라면 &quot;-4 -1&quot;을 리턴하면 됩니다.</p>
<ul>
<li>제한사항<ul>
<li>s에는 둘 이상의 정수가 공백으로 구분되어 있습니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(s):
    # 문자열을 공백으로 분리하여 리스트로 만듦
    numbers = s.split()

    # 리스트의 원소들을 정수로 변환
    numbers = list(map(int, numbers))

    # 최소값과 최대값을 찾음
    min_num = min(numbers)
    max_num = max(numbers)

    # 형식에 맞게 문자열로 반환
    return f&quot;{min_num} {max_num}&quot;</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[하면 된다]]></title>
            <link>https://velog.io/@dyllis_lin/%ED%95%98%EB%A9%B4-%EB%90%9C%EB%8B%A4</link>
            <guid>https://velog.io/@dyllis_lin/%ED%95%98%EB%A9%B4-%EB%90%9C%EB%8B%A4</guid>
            <pubDate>Fri, 24 May 2024 14:26:25 GMT</pubDate>
            <description><![CDATA[<h2 id="인생이란">인생이란</h2>
<h3 id="현타">현타</h3>
<p>진짜 1일 10현타... 진짜 기본 생활(?)에 문제 있는데 공부해서 뭐하나 싶다ㅋㅋㅋ 그렇다고 안 할수는 없으니 하기는 하는데 이도저도 아닌 기분이랄까. 해결책? 실행 가능했으면 당장 했지...^^ 진짜 경제적인 문제, 가족/집안 문제에서 계속 삐그덕 대는거 이제는 놀랍지도 않지만 요즘 유독 현타가 많이 온다. 하지만 버텨야지 모. 내가 여기서 공부 손 놓는다고 문제가 해결되는것도 아니니까...... 하지만 답답한걸ㅋㅋ 오늘도 다짐한다. 빨리 취업해서 &quot;독립&quot; 해야지...</p>
<h3 id="오히려-좋아">오히려 좋아</h3>
<p>누가보면 억긍정이라고 할 수도 있겠지만 약간 스스로를 긍정 가스라이팅 오히려 좋아/원영적사고 실천 중. 어렵지만 안 하는 것보다는 낫더라. 공부? 오히려 좋아~ 머리 조금이라도 빨리빨리 돌아갈 때 많이 배워놓는게 최고! 갈등? 오히려 좋아~ 면접때 얘기 할 소재 생겼네? 이번에 경험했으니 다음에는 대비할 수 있겠다! 라고 자기최면중ㅋㅋ</p>
<h2 id="하면-된다">하면 된다</h2>
<h3 id="일단-해">일단 해</h3>
<p>누가 한 말인지는 모르겠는데 왜, &#39;하기 싫어도 해라. 감정은 사라지고 결과만 남는다.&#39;라는 말이 요즘 너무 공감돼서 일단 뭐든 하는 중. 진짜 어떻게든 하니까 뭘 해도 결과는 나오고, 이왕 시작한거 더 열심히 하게 된다. 물론 그 과정이 평탄한건 아니지만. 그래서 내일 SQLD 시험 떨어질 것 같지만 일단 벼락치기라도 한다...! 재수 하더라도 남는게 있겠지 모</p>
<h3 id="노력과-재능">노력과 재능</h3>
<p>하지만 누군가의 재능을 뛰어넘는 다는건 어쩌면 불가능한 일이라고 생각한다. 재능 하나만 믿고 아무것도 안하고 뻗대는 사람이야 넘을 수도 있겠지만, 재능 + 노력까지 하는 사람 넘으려고 하는건 너무 욕심인 것 같다. 그냥 주어진거 내 선에서 열심히 하는게 최고인듯. 긍정적으로 생각하자,,, 애매한 재능이 있을 바에는 아무런 재능이 없는게 낫다...ㅋㅋㅋ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] HackerRank 문제 연습 1]]></title>
            <link>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-1</link>
            <guid>https://velog.io/@dyllis_lin/MySQL-Hacker-Rank-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-1</guid>
            <pubDate>Thu, 23 May 2024 16:56:33 GMT</pubDate>
            <description><![CDATA[<h3 id="select-all-basic-select">Select ALL (Basic Select)</h3>
<ul>
<li>문제
<img src="https://velog.velcdn.com/images/dyllis_lin/post/8f72a907-cf35-4965-b2d3-fe73732275d6/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT *
FROM CITY</code></pre>
<hr>
<h3 id="select-by-id-basic-select">Select By ID (Basic Select)</h3>
<ul>
<li>문제
<img src="https://velog.velcdn.com/images/dyllis_lin/post/4ddd3a7c-936b-4003-8bdc-f241bee24c7b/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT * 
FROM CITY
WHERE ID = 1661;</code></pre>
<hr>
<h3 id="revising-the-select-queryi-basic-select">Revising the Select Query(I) (Basic Select)</h3>
<ul>
<li>문제
<img src="https://velog.velcdn.com/images/dyllis_lin/post/24a660f2-8933-4afa-a341-627e59dbb46b/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT *
FROM CITY
WHERE population &gt; 100000
    AND CountryCode = &#39;USA&#39;;</code></pre>
<hr>
<h3 id="revising-the-select-queryii-basic-select">Revising the Select Query(II) (Basic Select)</h3>
<ul>
<li>문제
<img src="https://velog.velcdn.com/images/dyllis_lin/post/4191efa0-8d67-4150-a3a0-f5b79f6e607a/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT NAME
FROM CITY
WHERE POPULATION &gt; 120000 
    AND COUNTRYCODE = &quot;USA&quot;;</code></pre>
<hr>
<h3 id="japanese-cities-names-basic-select">Japanese Cities&#39; Names (Basic Select)</h3>
<ul>
<li>문제
<img src="https://velog.velcdn.com/images/dyllis_lin/post/c6ce86c0-c196-4196-a04f-009e1e8c0949/image.png" alt=""></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT name
FROM CITY
WHERE COUNTRYCODE = &#39;JPN&#39;;</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Python] 알고리즘 연습 14 (프로그래머스)]]></title>
            <link>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-14-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</link>
            <guid>https://velog.io/@dyllis_lin/Python-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%97%B0%EC%8A%B5-14-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4</guid>
            <pubDate>Thu, 23 May 2024 14:03:09 GMT</pubDate>
            <description><![CDATA[<h3 id="대충-만든-자판-연습문제">대충 만든 자판 (연습문제)</h3>
<ul>
<li>휴대폰의 자판은 컴퓨터 키보드 자판과는 다르게 하나의 키에 여러 개의 문자가 할당될 수 있습니다. 키 하나에 여러 문자가 할당된 경우, 동일한 키를 연속해서 빠르게 누르면 할당된 순서대로 문자가 바뀝니다.<BR>
예를 들어, 1번 키에 &quot;A&quot;, &quot;B&quot;, &quot;C&quot; 순서대로 문자가 할당되어 있다면 1번 키를 한 번 누르면 &quot;A&quot;, 두 번 누르면 &quot;B&quot;, 세 번 누르면 &quot;C&quot;가 되는 식입니다.<bR>
같은 규칙을 적용해 아무렇게나 만든 휴대폰 자판이 있습니다. 이 휴대폰 자판은 키의 개수가 1개부터 최대 100개까지 있을 수 있으며, 특정 키를 눌렀을 때 입력되는 문자들도 무작위로 배열되어 있습니다. 또, 같은 문자가 자판 전체에 여러 번 할당된 경우도 있고, 키 하나에 같은 문자가 여러 번 할당된 경우도 있습니다. 심지어 아예 할당되지 않은 경우도 있습니다. 따라서 몇몇 문자열은 작성할 수 없을 수도 있습니다.<BR>
이 휴대폰 자판을 이용해 특정 문자열을 작성할 때, 키를 최소 몇 번 눌러야 그 문자열을 작성할 수 있는지 알아보고자 합니다.<BR>
1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열배열 <code>keymap</code>과 입력하려는 문자열들이 담긴 문자열 배열 <code>targets</code>가 주어질 때, 각 문자열을 작성하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 return 하는 solution 함수를 완성해 주세요.<BR>
단, 목표 문자열을 작성할 수 없을 때는 -1을 저장합니다.<bR>
 - 제한사항
   - 1 ≤ `keymap`의 길이 ≤ 100
     - 1 ≤ `keymap`의 원소의 길이 ≤ 100
     - `keymap[i]`는 i + 1번 키를 눌렀을 때 순서대로 바뀌는 문자를 의미합니다.
         - 예를 들어 `keymap[0]` = "ABACD" 인 경우 1번 키를 한 번 누르면 A, 두 번 누르면 B, 세 번 누르면 A 가 됩니다.
     - `keymap`의 원소의 길이는 서로 다를 수 있습니다.
     - `keymap`의 원소는 알파벳 대문자로만 이루어져 있습니다.
  - 1 ≤ `targets`의 길이 ≤ 100
     - 1 ≤ `targets`의 원소의 길이 ≤ 100
     - `targets`의 원소는 알파벳 대문자로만 이루어져 있습니다.


</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(keymap, targets):
    answer = []

    for target in targets:
        minkey = 0 

        for i in target: 
            c = 101 
            flag = False 

            for k in keymap:
                key = k.find(i)

                if key == -1: 
                    continue
                c = min(key+1, c) 
                flag = True 

            if flag: 
                minkey += c
            else: 
                answer.append(-1)
                break
        else: 
            answer.append(minkey) 

    return answer</code></pre>
<hr>
<h3 id="둘만의-암호-연습문제">둘만의 암호 (연습문제)</h3>
<ul>
<li>두 문자열 <code>s</code>와 <code>skip</code>, 그리고 자연수 <code>index</code>가 주어질 때, 다음 규칙에 따라 문자열을 만들려 합니다. 암호의 규칙은 다음과 같습니다.</li>
</ul>
<p>문자열 <code>s</code>의 각 알파벳을 <code>index</code>만큼 뒤의 알파벳으로 바꿔줍니다.
<code>index</code>만큼의 뒤의 알파벳이 <code>z</code>를 넘어갈 경우 다시 <code>a</code>로 돌아갑니다.
<code>skip</code>에 있는 알파벳은 제외하고 건너뜁니다.
예를 들어 <code>s</code> = &quot;aukks&quot;, <code>skip</code> = &quot;wbqd&quot;, <code>index</code> = 5일 때, a에서 5만큼 뒤에 있는 알파벳은 f지만 [b, c, d, e, f]에서 &#39;b&#39;와 &#39;d&#39;는 <code>skip</code>에 포함되므로 세지 않습니다. 따라서 &#39;b&#39;, &#39;d&#39;를 제외하고 &#39;a&#39;에서 5만큼 뒤에 있는 알파벳은 [c, e, f, g, h] 순서에 의해 &#39;h&#39;가 됩니다. 나머지 &quot;ukks&quot; 또한 위 규칙대로 바꾸면 &quot;appy&quot;가 되며 결과는 &quot;happy&quot;가 됩니다.</p>
<p>두 문자열 <code>s</code>와 <code>skip</code>, 그리고 자연수 <code>index</code>가 매개변수로 주어질 때 위 규칙대로 <code>s</code>를 변환한 결과를 return하도록 solution 함수를 완성해주세요.</p>
<ul>
<li>제한사항<ul>
<li>5 ≤ <code>s</code>의 길이 ≤ 50</li>
<li>1 ≤ <code>skip</code>의 길이 ≤ 10<ul>
<li><code>s</code>와 <code>skip</code>은 알파벳 소문자로만 이루어져 있습니다.<ul>
<li><code>skip</code>에 포함되는 알파벳은 <code>s</code>에 포함되지 않습니다.</li>
</ul>
</li>
</ul>
</li>
<li>1 ≤ <code>index</code> ≤ 20 </li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def rotate(aci):
    return (aci - 96) % 26 + 97

def solution(s, skip, index):
    answer = &#39;&#39;

    for c in s:        
        aci = ord(c)
        for i in range(index):
            aci = rotate(aci)
            while chr(aci) in skip:
                aci = rotate(aci)
        ret = chr(aci)
        answer += chr(aci)

    return answer</code></pre>
<hr>
<h3 id="햄버거-만들기-연습문제">햄버거 만들기 (연습문제)</h3>
<ul>
<li>햄버거 가게에서 일을 하는 상수는 햄버거를 포장하는 일을 합니다. 함께 일을 하는 다른 직원들이 햄버거에 들어갈 재료를 조리해 주면 조리된 순서대로 상수의 앞에 아래서부터 위로 쌓이게 되고, 상수는 순서에 맞게 쌓여서 완성된 햄버거를 따로 옮겨 포장을 하게 됩니다. 상수가 일하는 가게는 정해진 순서(아래서부터, 빵 – 야채 – 고기 - 빵)로 쌓인 햄버거만 포장을 합니다. 상수는 손이 굉장히 빠르기 때문에 상수가 포장하는 동안 속 재료가 추가적으로 들어오는 일은 없으며, 재료의 높이는 무시하여 재료가 높이 쌓여서 일이 힘들어지는 경우는 없습니다.<BR>
예를 들어, 상수의 앞에 쌓이는 재료의 순서가 [야채, 빵, 빵, 야채, 고기, 빵, 야채, 고기, 빵]일 때, 상수는 여섯 번째 재료가 쌓였을 때, 세 번째 재료부터 여섯 번째 재료를 이용하여 햄버거를 포장하고, 아홉 번째 재료가 쌓였을 때, 두 번째 재료와 일곱 번째 재료부터 아홉 번째 재료를 이용하여 햄버거를 포장합니다. 즉, 2개의 햄버거를 포장하게 됩니다.<BR>
상수에게 전해지는 재료의 정보를 나타내는 정수 배열 <code>ingredient</code>가 주어졌을 때, 상수가 포장하는 햄버거의 개수를 return 하도록 solution 함수를 완성하시오.  <BR>
- 제한사항
   - 1 ≤ `ingredient`의 길이 ≤ 1,000,000
   - `ingredient`의 원소는 1, 2, 3 중 하나의 값이며, 순서대로 빵, 야채, 고기를 의미합니다.

</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(ingredient):
    s = []
    cnt = 0
    for i in ingredient:
        s.append(i)
        if s[-4:] == [1, 2, 3, 1]:
            cnt += 1
            for _ in range(4):
                s.pop()
    return cnt</code></pre>
<hr>
<h3 id="성격-유형-검사하기-2022-kakao-tech-internship">성격 유형 검사하기 (2022 KAKAO TECH INTERNSHIP)</h3>
<ul>
<li>나만의 카카오 성격 유형 검사지를 만들려고 합니다.
성격 유형 검사는 다음과 같은 4개 지표로 성격 유형을 구분합니다. 성격은 각 지표에서 두 유형 중 하나로 결정됩니다.<Br>
지표 번호    성격 유형
&nbsp;1번 지표    &nbsp;라이언형(R), 튜브형(T)
&nbsp;2번 지표    &nbsp;콘형(C), 프로도형(F)
&nbsp;3번 지표    &nbsp;제이지형(J), 무지형(M)
&nbsp;4번 지표    &nbsp;어피치형(A), 네오형(N)<br>
4개의 지표가 있으므로 성격 유형은 총 16(=2 x 2 x 2 x 2)가지가 나올 수 있습니다. 예를 들어, &quot;RFMN&quot;이나 &quot;TCMA&quot;와 같은 성격 유형이 있습니다.<br>
검사지에는 총 <code>n</code>개의 질문이 있고, 각 질문에는 아래와 같은 7개의 선택지가 있습니다.<br><ul>
<li><code>매우 비동의</code> </li>
<li><code>비동의</code></li>
<li><code>약간 비동의</code></li>
<li><code>모르겠음</code></li>
<li><code>약간 동의</code></li>
<li><code>동의</code></li>
<li><code>매우 동의</code><br></li>
</ul>
</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;각 질문은 1가지 지표로 성격 유형 점수를 판단합니다.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;예를 들어, 어떤 한 질문에서 4번 지표로 아래 표처럼 점수를 매길 수 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;있습니다.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;선택지    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;성격 유형 점수
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;매우 비동의&nbsp;&nbsp;네오형 3점
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;비동의&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;네오형 2점
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;약간 비동의&nbsp;&nbsp;네오형 1점
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;모르겠음&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;어떤 성격 유형도 점수를 얻지 않습니다
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;약간 동의&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;어피치형 1점
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;동의&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 어피치형 2점
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;매우 동의&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;어피치형 3점<br>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;이때 검사자가 질문에서 <code>약간 동의</code> 선택지를 선택할 경우 어피치형(A) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;성격 유형 1점을 받게 됩니다. 만약 검사자가 <code>매우 비동의</code> 선택지를 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;선택할 경우 네오형(N) 성격 유형 3점을 받게 됩니다.</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>위 예시처럼 네오형이 비동의, 어피치형이 동의인 경우만 주어지지 않고, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;질문에 따라 네오형이 동의, 어피치형이 비동의인 경우도 주어질 수 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;있습니다.</strong>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;하지만 각 선택지는 고정적인 크기의 점수를 가지고 있습니다.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>매우 동의</code>나 <code>매우 비동의</code> 선택지를 선택하면 3점을 얻습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>동의</code>나 <code>비동의</code> 선택지를 선택하면 2점을 얻습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>약간 동의</code>나 <code>약간 비동의</code> 선택지를 선택하면 1점을 얻습니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>모르겠음</code> 선택지를 선택하면 점수를 얻지 않습니다.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;번호 순서대로 return 하도록 solution 함수를 완성해주세요.<bR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 제한사항
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 1 ≤ <code>survey</code>의 길이 ( = <code>n</code>) ≤ 1,000
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>survey</code>의 원소는 <code>&quot;RT&quot;, &quot;TR&quot;, &quot;FC&quot;, &quot;CF&quot;, &quot;MJ&quot;, &quot;JM&quot;,</code> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<code>&quot;AN&quot;,&quot;NA&quot;</code> 중 하나입니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; - <code>survey[i]</code>의 첫 번째 캐릭터는 i+1번 질문의 비동의 관련 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;선택지를 선택하면 받는 성격 유형을 의미합니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>survey[i]</code>의 두 번째 캐릭터는 i+1번 질문의 동의 관련 선택지를 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;선택하면 받는 성격 유형을 의미합니다.<bR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>choices</code>의 길이 = <code>survey</code>의 길이
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- <code>choices[i]</code>는 검사자가 선택한 i+1번째 질문의 선택지를 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;의미합니다.
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 1 ≤ <code>choices</code>의 원소 ≤ 7
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;choices    뜻
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;매우 비동의
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;비동의
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;약간 비동의
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;모르겠음
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;약간 동의
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;동의
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;매우 동의</p>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(survey, choices):
    # 유형별 목록(같은 지표에서는 알파벳 순), score = 카테고리별 획득 점수
    category = [&quot;R&quot;,&quot;T&quot;,&quot;C&quot;,&quot;F&quot;,&quot;J&quot;,&quot;M&quot;,&quot;A&quot;,&quot;N&quot;]
    score = [0 for str in category]
    answer = &quot;&quot;

    # choices에 따른 점수 부여
    for i in range(len(choices)):
        if 4 &lt; choices[i] &lt;= 7:
            score[category.index(survey[i][-1])] += choices[i]-4

        if choices[i] == 4:
            pass
        if 1 &lt;= choices[i]&lt;4:
            score[category.index(survey[i][0])] += 4 - choices[i]

    # 지표별 최종 유형 결정
    for i in range(len(score) // 2):
        if score[2 * i] &gt;= score[2 * i + 1]:
            answer += category[2 * i]
        else:
            answer += category[2 * i + 1]

    return answer</code></pre>
<hr>
<h3 id="바탕화면-정리-연습문제">바탕화면 정리 (연습문제)</h3>
<ul>
<li><p>코딩테스트를 준비하는 머쓱이는 프로그래머스에서 문제를 풀고 나중에 다시 코드를 보면서 공부하려고 작성한 코드를 컴퓨터 바탕화면에 아무 위치에나 저장해 둡니다. 저장한 코드가 많아지면서 머쓱이는 본인의 컴퓨터 바탕화면이 너무 지저분하다고 생각했습니다. 프로그래머스에서 작성했던 코드는 그 문제에 가서 다시 볼 수 있기 때문에 저장해 둔 파일들을 전부 삭제하기로 했습니다.<br>
컴퓨터 바탕화면은 각 칸이 정사각형인 격자판입니다. 이때 컴퓨터 바탕화면의 상태를 나타낸 문자열 배열 <code>wallpaper</code>가 주어집니다. 파일들은 바탕화면의 격자칸에 위치하고 바탕화면의 격자점들은 바탕화면의 가장 왼쪽 위를 (0, 0)으로 시작해 (세로 좌표, 가로 좌표)로 표현합니다. 빈칸은 &quot;.&quot;, 파일이 있는 칸은 &quot;#&quot;의 값을 가집니다. 드래그를 하면 파일들을 선택할 수 있고, 선택된 파일들을 삭제할 수 있습니다. 머쓱이는 최소한의 이동거리를 갖는 한 번의 드래그로 모든 파일을 선택해서 한 번에 지우려고 하며 드래그로 파일들을 선택하는 방법은 다음과 같습니다.<br></p>
<ul>
<li>드래그는 바탕화면의 격자점 S(<code>lux</code>, <code>luy</code>)를 마우스 왼쪽 버튼으로 클릭한 상태로 격자점 E(<code>rdx</code>, <code>rdy</code>)로 이동한 뒤 마우스 왼쪽 버튼을 떼는 행동입니다. 이때, &quot;<strong>점 S에서 점 E로 드래그한다</strong>&quot;고 표현하고 점 S와 점 E를 각각 드래그의 시작점, 끝점이라고 표현합니다.</li>
<li>점 S(<code>lux</code>, <code>luy</code>)에서 점 E(<code>rdx</code>, <code>rdy</code>)로 드래그를 할 때, &quot;드래그 한 거리&quot;는 |<code>rdx</code> - <code>lux</code>| + |<code>rdy</code> - <code>luy</code>|로 정의합니다.</li>
<li>점 S에서 점 E로 드래그를 하면 바탕화면에서 두 격자점을 각각 왼쪽 위, 오른쪽 아래로 하는 직사각형 내부에 있는 모든 파일이 선택됩니다.</li>
</ul>
<p>예를 들어 <code>wallpaper</code> = [&quot;.#...&quot;, &quot;..#..&quot;, &quot;...#.&quot;]인 바탕화면을 그림으로 나타내면 다음과 같습니다.
<img src="https://velog.velcdn.com/images/dyllis_lin/post/6bf6061e-9417-44a2-9e63-93ee77180ab6/image.png" alt="">
이러한 바탕화면에서 다음 그림과 같이 S(0, 1)에서 E(3, 4)로 드래그하면 세 개의 파일이 모두 선택되므로 드래그 한 거리 (3 - 0) + (4 - 1) = 6을 최솟값으로 모든 파일을 선택 가능합니다.
<img src="https://velog.velcdn.com/images/dyllis_lin/post/648e8fc6-e7db-4592-89d9-79f18597f408/image.png" alt="">
(0, 0)에서 (3, 5)로 드래그해도 모든 파일을 선택할 수 있지만 이때 드래그 한 거리는 (3 - 0) + (5 - 0) = 8이고 이전의 방법보다 거리가 늘어납니다.<br>
머쓱이의 컴퓨터 바탕화면의 상태를 나타내는 문자열 배열 <code>wallpaper</code>가 매개변수로 주어질 때 바탕화면의 파일들을 한 번에 삭제하기 위해 최소한의 이동거리를 갖는 드래그의 시작점과 끝점을 담은 정수 배열을 return하는 <code>solution</code> 함수를 작성해 주세요. 드래그의 시작점이 (<code>lux</code>, <code>luy</code>), 끝점이 (<code>rdx</code>, <code>rdy</code>)라면 정수 배열 [<code>lux</code>, <code>luy</code>, <code>rdx</code>, <code>rdy</code>]를 return하면 됩니다.</p>
<ul>
<li>제한사항<ul>
<li>1 ≤ <code>wallpaper</code>의 길이 ≤ 50</li>
<li>1 ≤ <code>wallpaper[i]</code>의 길이 ≤ 50<ul>
<li><code>wallpaper</code>의 모든 원소의 길이는 동일합니다.</li>
</ul>
</li>
<li><code>wallpaper[i][j]</code>는 바탕화면에서 <code>i + 1</code>행 <code>j + 1</code>열에 해당하는 칸의 상태를 나타냅니다.<ul>
<li><code>wallpaper[i][j]</code>는 &quot;#&quot; 또는 &quot;.&quot;의 값만 가집니다.</li>
<li>바탕화면에는 적어도 하나의 파일이 있습니다.</li>
<li>드래그 시작점 (<code>lux</code>, <code>luy</code>)와 끝점 (<code>rdx</code>, <code>rdy</code>)는 <code>lux</code> &lt; <code>rdx</code>, <code>luy</code> &lt; <code>rdy</code>를 만족해야 합니다.</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>제출한 코드 :</p>
<pre><code class="language-python">def solution(wallpaper):
    answer = []
    maxx, minx, maxy, miny = 0, 100, 0, 100

    r = len(wallpaper)
    c = len(wallpaper[0])

    for x in range(r):
        for y in range(c):
            if wallpaper[x][y] == &quot;#&quot;:
                minx = min(minx, x)
                miny = min(miny, y)
                maxx = max(maxx, x)
                maxy = max(maxy, y)


    return [minx, miny, maxx+1, maxy+1]</code></pre>
<hr>
]]></description>
        </item>
        <item>
            <title><![CDATA[[MySQL] LeetCode 문제 연습 10]]></title>
            <link>https://velog.io/@dyllis_lin/MySQL-LeetCode-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-10</link>
            <guid>https://velog.io/@dyllis_lin/MySQL-LeetCode-%EB%AC%B8%EC%A0%9C-%EC%97%B0%EC%8A%B5-10</guid>
            <pubDate>Thu, 23 May 2024 12:16:58 GMT</pubDate>
            <description><![CDATA[<h3 id="196-delete-duplicate-emails-easy"><a href="https://leetcode.com/problems/delete-duplicate-emails/description/">196. Delete Duplicate Emails (Easy)</a></h3>
<ul>
<li>Table: <code>Person</code></li>
<li>-------------+---------+
| Column Name | Type    |</li>
<li>-------------+---------+
| id          | int     |
| email       | varchar |</li>
<li>-------------+---------+
id is the primary key (column with unique values) for this table.
Each row of this table contains an email. The emails will not contain uppercase letters.<BR>
Write a solution to <strong>delete</strong> all duplicate emails, keeping only one unique email with the smallest <code>id</code>.<BR>
 For SQL users, please note that you are supposed to write a <code>DELETE</code> statement and not a <code>SELECT</code> one.<BR>
For Pandas users, please note that you are supposed to modify <code>Person</code> in place.<BR>
After running your script, the answer shown is the <code>Person</code> table. The driver will first compile and run your piece of code and then show the <code>Person</code> table. The final order of the <code>Person</code> table <strong>does not matter</strong>.<BR></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">DELETE p1
FROM Person p1
JOIN Person p2
ON p1.email = p2.email AND p1.id &gt; p2.id;</code></pre>
<hr>
<h3 id="176-second-highest-salary-medium"><a href="https://leetcode.com/problems/second-highest-salary/description/">176. Second Highest Salary (Medium)</a></h3>
<ul>
<li>Table: <code>Employee</code></li>
<li>-------------+------+
| Column Name | Type |</li>
<li>-------------+------+
| id          | int  |
| salary      | int  |</li>
<li>-------------+------+
id is the primary key (column with unique values) for this table.
Each row of this table contains information about the salary of an employee.<BR>
Write a solution to find the second highest salary from the <code>Employee</code> table. If there is no second highest salary, return <code>null (return None in Pandas)</code>.<BR></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT (SELECT DISTINCT salary
        FROM Employee
        ORDER BY salary DESC
        LIMIT 1 OFFSET 1
       ) AS SecondHighestSalary;</code></pre>
<hr>
<h3 id="1484-group-sold-products-by-the-date-easy"><a href="https://leetcode.com/problems/group-sold-products-by-the-date/description/">1484. Group Sold Products By The Date (Easy)</a></h3>
<ul>
<li>Table <code>Activities</code>:</li>
<li>-------------+---------+
| Column Name | Type    |</li>
<li>-------------+---------+
| sell_date   | date    |
| product     | varchar |</li>
<li>-------------+---------+
There is no primary key (column with unique values) for this table. It may contain duplicates.
Each row of this table contains the product name and the date it was sold in a market.<BR>
Write a solution to find for each date the number of different products sold and their names.<BR>
The sold products names for each date should be sorted lexicographically.<BR>
 Return the result table ordered by <code>sell_date</code>.<BR></li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT sell_date
       , COUNT(DISTINCT product) AS num_sold
       , GROUP_CONCAT(DISTINCT product ORDER BY product SEPARATOR &#39;,&#39;) AS products
FROM Activities
GROUP BY sell_date
ORDER BY sell_date;</code></pre>
<hr>
<h3 id="1327-list-the-products-ordered-in-a-period-easy"><a href="https://leetcode.com/problems/list-the-products-ordered-in-a-period/description/">1327. List the Products Ordered in a Period (Easy)</a></h3>
<ul>
<li>Table: <code>Products</code></li>
<li>------------------+---------+
| Column Name      | Type    |</li>
<li>------------------+---------+
| product_id       | int     |
| product_name     | varchar |
| product_category | varchar |</li>
<li>------------------+---------+
product_id is the primary key (column with unique values) for this table.
This table contains data about the company&#39;s products.<BR>
Table: <code>Orders</code></li>
<li>---------------+---------+
| Column Name   | Type    |</li>
<li>---------------+---------+
| product_id    | int     |
| order_date    | date    |
| unit          | int     |</li>
<li>---------------+---------+
This table may have duplicate rows.
product_id is a foreign key (reference column) to the Products table.
unit is the number of products ordered in order_date.<BR>
Write a solution to get the names of products that have at least 100 units ordered in <strong>February 2020</strong> and their amount.<BR>
Return the result table in <strong>any order</strong>.<BR>  </li>
</ul>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT p.product_name
       , SUM(o.unit) AS unit
FROM Orders o
JOIN Products p ON o.product_id = p.product_id
WHERE o.order_date &gt;= &#39;2020-02-01&#39; 
    AND o.order_date &lt; &#39;2020-03-01&#39;
GROUP BY p.product_name
HAVING SUM(o.unit) &gt;= 100;</code></pre>
<hr>
<h3 id="1517-find-users-with-valid-e-mails-easy">1517. Find Users With Valid E-Mails (Easy)</h3>
<ul>
<li>Table: <code>Users</code></li>
<li>---------------+---------+
| Column Name   | Type    |</li>
<li>---------------+---------+
| user_id       | int     |
| name          | varchar |
| mail          | varchar |</li>
<li>---------------+---------+
user_id is the primary key (column with unique values) for this table.
This table contains information of the users signed up in a website. Some e-mails are invalid.<BR>
Write a solution to find the users who have <strong>valid emails</strong>.<BR>
A valid e-mail has a prefix name and a domain where:<ul>
<li><strong>The prefix name</strong> is a string that may contain letters (upper or lower case), digits, underscore <code>&#39;_&#39;</code>, period <code>&#39;.&#39;</code>, and/or dash <code>&#39;-&#39;</code>. The prefix name <strong>must</strong> start with a letter.</li>
<li>The domain is <code>&#39;@leetcode.com&#39;</code></li>
</ul>
</li>
</ul>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Return the result table in <strong>any order</strong>.</p>
<p>제출한 쿼리 :</p>
<pre><code class="language-sql">SELECT *
FROM Users
WHERE mail REGEXP &#39;^[A-Za-z][A-Za-z0-9_\.\-]*@leetcode(\\?com)?\\.com$&#39;;</code></pre>
<hr>
]]></description>
        </item>
    </channel>
</rss>