<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>esssun.log</title>
    <link>https://esssun.tistory.com/</link>
    <description>꾸준하게 성장하는 개발자  &amp;zwj; </description>
    <language>ko</language>
    <pubDate>Thu, 23 Jul 2026 18:06:57 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>_은선_</managingEditor>
    <image>
      <title>esssun.log</title>
      <url>https://tistory1.daumcdn.net/tistory/5917994/attach/65938c5c6aca49adadc0440e14d28c6f</url>
      <link>https://esssun.tistory.com</link>
    </image>
    <item>
      <title>[프로그래머스] 쿼드 압축 후 개수 세기 (파이썬)</title>
      <link>https://esssun.tistory.com/176</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;분할 정복 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/68936&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/68936&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1783840515952&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/68936&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/wig2z/dJMb8RR32Ut/MeEC8UFukUo8jQ9UccFWyk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/PDTMN/dJMb887kPWx/wkXAaGFtfTNYn429UWbqW0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/68936&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/68936&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/wig2z/dJMb8RR32Ut/MeEC8UFukUo8jQ9UccFWyk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/PDTMN/dJMb887kPWx/wkXAaGFtfTNYn429UWbqW0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; 풀이코드 (성공)&lt;/h3&gt;
&lt;pre id=&quot;code_1783840579930&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(arr):
    # answer[0]은 0의 개수, answer[1]은 1의 개수
    answer = [0, 0]
    
    def solve(size, r, c):
        # 1. 현재 영역이 모두 같은 숫자인지 체크
        first_val = arr[r][c]
        is_same = True
        
        for i in range(r, r + size):
            for j in range(c, c + size):
                if arr[i][j] != first_val:
                    is_same = False
                    break
            if not is_same:
                break
        
        # 2. 모두 같은 숫자라면 압축 가능! 해당 숫자 카운트를 1 증가시키고 종료
        if is_same:
            answer[first_val] += 1
            return
        
        # 3. 다른 숫자가 섞여 있다면 4분할하여 재귀 호출
        half = size // 2
        solve(half, r, c)                  # 왼쪽 위
        solve(half, r, c + half)           # 오른쪽 위
        solve(half, r + half, c)           # 왼쪽 아래
        solve(half, r + half, c + half)    # 오른쪽 아래

    # 전체 배열 크기부터 시작
    solve(len(arr), 0, 0)
    
    return answer&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Graph</category>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/176</guid>
      <comments>https://esssun.tistory.com/176#entry176comment</comments>
      <pubDate>Sun, 12 Jul 2026 16:19:12 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 17090 : 미로 탈출하기 (파이썬)</title>
      <link>https://esssun.tistory.com/175</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Memorization 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17090&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/17090&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1776590979100&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;17090번: 미로 탈출하기&quot; data-og-description=&quot;크기가 N&amp;times;M인 미로가 있고, 미로는 크기가 1&amp;times;1인 칸으로 나누어져 있다. 미로의 각 칸에는 문자가 하나 적혀있는데, 적혀있는 문자에 따라서 다른 칸으로 이동할 수 있다. 어떤 칸(r, c)에 적힌 문&quot; data-og-host=&quot;www.acmicpc.net&quot; data-og-source-url=&quot;https://www.acmicpc.net/problem/17090&quot; data-og-url=&quot;https://www.acmicpc.net/problem/17090&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/c5V5iS/dJMb8Qen5CU/xgb2Q438xjy7kqi2Py7EKk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/17090&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.acmicpc.net/problem/17090&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/c5V5iS/dJMb8Qen5CU/xgb2Q438xjy7kqi2Py7EKk/img.png?width=2834&amp;amp;height=1480&amp;amp;face=0_0_2834_1480');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;17090번: 미로 탈출하기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;크기가 N&amp;times;M인 미로가 있고, 미로는 크기가 1&amp;times;1인 칸으로 나누어져 있다. 미로의 각 칸에는 문자가 하나 적혀있는데, 적혀있는 문자에 따라서 다른 칸으로 이동할 수 있다. 어떤 칸(r, c)에 적힌 문&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.acmicpc.net&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; &amp;nbsp;풀이코드&amp;nbsp;(성공)&lt;/h3&gt;
&lt;pre id=&quot;code_1776591044756&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
sys.setrecursionlimit(10**6)

r, c = map(int, sys.stdin.readline().split())
graph = [list(sys.stdin.readline().strip()) for _ in range(r)]

# -1: 아직 방문 안 함
# 0: 탈출 불가
# 1: 탈출 가능
memo = [[-1] * c for _ in range(r)]
visited = [[False] * c for _ in range(r)]  # 현재 dfs 경로에서 방문 중인지 체크

def dfs(y, x):
    # 격자 밖으로 나가면 탈출 성공
    if not (0 &amp;lt;= y &amp;lt; r and 0 &amp;lt;= x &amp;lt; c):
        return 1

    # 이미 결과를 구한 칸이면 그대로 반환
    if memo[y][x] != -1:
        return memo[y][x]

    # 현재 탐색 경로에서 다시 만났다면 사이클 &amp;rarr; 탈출 불가
    if visited[y][x]: # 방향 그래프에서 사이클 처리
        return 0

    visited[y][x] = True

    if graph[y][x] == 'D':
        ny, nx = y + 1, x
    elif graph[y][x] == 'U':
        ny, nx = y - 1, x
    elif graph[y][x] == 'L':
        ny, nx = y, x - 1
    else:  # 'R'
        ny, nx = y, x + 1

    memo[y][x] = dfs(ny, nx)
    visited[y][x] = False # 한번 방문한 노드라도 해당 재귀가 끝나면 재방문 가능해야함
    return memo[y][x]

answer = 0
for i in range(r):
    for j in range(c):
        answer += dfs(i, j)

print(answer)&lt;/code&gt;&lt;/pre&gt;</description>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/175</guid>
      <comments>https://esssun.tistory.com/175#entry175comment</comments>
      <pubDate>Sun, 19 Apr 2026 18:31:05 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 3055 : 탈출 (파이썬)</title>
      <link>https://esssun.tistory.com/174</link>
      <description>&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;BFS 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/3055&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/3055&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; 풀이코드 (성공 - BFS)&lt;/h2&gt;
&lt;pre id=&quot;code_1775382770988&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'''
.: 비어있는곳 (물 O, 고슴도치 O)
*: 물 (물 O, 고슴도치 X)
X: 돌 (물 X, 고슴도치 X)
D: 비버의 굴 (물 X, 고슴도치 O)
S: 고슴도치 위치 (물 O, 고슴도치 O)
'''

# 9:30 ~
import sys 
from collections import deque
r, c = map(int, sys.stdin.readline().split())
visited = [[False] * c for _ in range(r)]
visitedW = [[False] * c for _ in range(r)]
graph = []
S = None # 2) 좌표 사용 시 튜플 처음 선언
D = None
water = deque()

dy = [0, 1, 0, -1]
dx = [1, 0, -1, 0]

for i in range(r):
    l = list(map(str, sys.stdin.readline().strip())) # 1) split: 공백기준 / strip: 문자열 양쪽 공백 제거
    for j, s in enumerate(l):
        if s == 'S':
            S = (i, j)
        elif s == 'D':
            D = (i, j)
        elif s == '*':
            water.append((i, j))
    graph.append(l)


def water_spread():
    global water
    size = len(water)

    for i in range(size):
        wy, wx = water.popleft()

        for j in range(4):
            ny = wy + dy[j]
            nx = wx + dx[j]

            if 0 &amp;lt;= ny &amp;lt; r and 0 &amp;lt;= nx &amp;lt; c:
                if visitedW[ny][nx] == False:
                    visitedW[ny][nx] = True

                    if graph[ny][nx] == &quot;.&quot;:
                        water.append((ny, nx))
                        graph[ny][nx] = &quot;*&quot;     
        
def bfs():
    global r, c, S

    is_possible = False
    queue = deque()
    cnt = 1
    queue.append((S[0], S[1], cnt))
    last = 0
    while queue:
        y, x, cnt = queue.popleft()

        if last != cnt:
            last = cnt
            water_spread() # 물 먼저 확장

        for i in range(4):
            ny = y + dy[i]
            nx = x + dx[i]
    
            if 0 &amp;lt;= ny &amp;lt; r and 0 &amp;lt;= nx &amp;lt; c:
                if visited[ny][nx] == False:
                    visited[ny][nx] = True
                    if graph[ny][nx] == &quot;.&quot;:
                        queue.append((ny, nx, cnt + 1))
                    elif graph[ny][nx] == &quot;D&quot;:
                        is_possible = True
                        print(cnt)

    if is_possible == False:
        print(&quot;KAKTUS&quot;)
        return
        

bfs()&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; 주요 로직&lt;/h2&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 물을 먼저 상, 하, 좌, 우로 확장시키기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, for문을 현재 queue의 크기만큼 돈다. (현재 시간에 존재하는 물의 갯수만큼)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 다음에 이동할 칸이 빈칸이라면 graph의 칸이 물임을 기록해준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 고슴도치 이동시키기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 다음에 이동할 칸이 빈칸이라면 고슴도치를 이동시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;만약 다음에 이동할 칸이 물이라면 리턴시키는 코드는 작성할 필요가 없다.&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약 현재 분에 고슴도치가 상, 하, 좌, 우로 이동시키려는 칸이 전부 물이라면 리턴시키는 코드는 작성할 필요가 없다.&lt;/li&gt;
&lt;li&gt;어차피, queue에 좌표를 못넣으므로 while queue:문이 종료될 것이기 때문이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한, &lt;b&gt;매분마다 물처럼 고슴도치의 좌표를 graph에 기록하며 이동시킬 필요도 없다&lt;/b&gt;. (pop, add 등으로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 물을 확장시키는 함수를 매번 호출하지 않고, 분이 지났으면 확장시킨다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, cnt을 통해 현재 분을 판단한 후 물을 확장시키는 함수는 매 분마다 한번만 호출한다.&lt;/p&gt;</description>
      <category>Algorithm/Graph</category>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/174</guid>
      <comments>https://esssun.tistory.com/174#entry174comment</comments>
      <pubDate>Sun, 5 Apr 2026 19:18:22 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 1593 : 문자 해독 (파이썬)</title>
      <link>https://esssun.tistory.com/171</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;슬라이딩 윈도우 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1593&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1593&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; 풀이코드 (성공 - 슬라이딩 윈도우)&lt;/h2&gt;
&lt;pre id=&quot;code_1763891303719&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys

lenW, lenS = map(int, sys.stdin.readline().split())
w = list(str(sys.stdin.readline().strip()))
s = str(sys.stdin.readline().strip())

wl = [0] * 58
sl = [0] * 58

answer = 0

for i in w:
    wl[ord(i)-65] += 1


def solution():
    global answer 
    length = 0

    for i in range(lenS):
        sl[ord(s[i])-65] += 1
        length += 1

        if length == lenW:
            if wl == sl:
                answer += 1

            length -= 1
            sl[ord(s[i+1-lenW])-65] -= 1


solution()
print(answer)&lt;/code&gt;&lt;/pre&gt;</description>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/171</guid>
      <comments>https://esssun.tistory.com/171#entry171comment</comments>
      <pubDate>Sun, 23 Nov 2025 18:51:33 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] Level2 : 주차 요금 계산 (파이썬, C++)</title>
      <link>https://esssun.tistory.com/170</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;구현, 해시 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92341&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/92341&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760873803330&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92341&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bATy5m/hyZLrK3Oyg/KpkHtvTBpCvvarlZxkGOg0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/Ev8oh/hyZL9Pykgm/xmLixh211jFxqBQkCIsyc1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92341&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92341&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bATy5m/hyZLrK3Oyg/KpkHtvTBpCvvarlZxkGOg0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/Ev8oh/hyZL9Pykgm/xmLixh211jFxqBQkCIsyc1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 풀이코드 (성공 - Python)&lt;/h2&gt;
&lt;pre id=&quot;code_1760873827897&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import heapq
import math

def solution(fees, records):
    answer = []
    
    # 기본시간(분), 기본요금(원), 단위시간(분), 단위요금(원)
    
    bTime = fees[0]
    bFee = fees[1]
    pTime = fees[2]
    pFee = fees[3]
    
    dic = {}
    
    for str in records:
        arr = str.split(' ')
        time = arr[0].split(':')
        time = int(time[0]) * 60 + int(time[1])
        
        if arr[1] not in dic:
            dic[arr[1]] = [time, 0]
        else:
            if arr[2] == &quot;IN&quot;:
                dic[arr[1]][0] = time
            else:
                dic[arr[1]][1] += (time - dic[arr[1]][0])
                dic[arr[1]][0] = -1
    print(dic)
    
    heap = []
    for k, (enter, time) in dic.items():
        if enter != -1:
            time = (60 * 23) + 59
            dic[k][1] += (time - dic[k][0])
            dic[k][0] = -1
            
        if dic[k][1] &amp;lt; bTime:
            heapq.heappush(heap, (k, bFee))
        else:
            tmp = 0
            dic[k][1] -= bTime
            tmp += bFee
            tmp += math.ceil(dic[k][1] / pTime) * pFee
            
            heapq.heappush(heap, (k, tmp))
    print(heap)
    
    while heap:
        car, fee = heapq.heappop(heap)
        answer.append(fee)
            
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; 풀이코드 (성공 - C++)&lt;/h2&gt;
&lt;pre id=&quot;code_1760881799587&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;cmath&amp;gt;
#include &amp;lt;iostream&amp;gt;
#include &amp;lt;sstream&amp;gt;
#include &amp;lt;string&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;algorithm&amp;gt;
#include &amp;lt;queue&amp;gt;
#include &amp;lt;tuple&amp;gt;
#include &amp;lt;map&amp;gt;

using namespace std;

vector&amp;lt;int&amp;gt; solution(vector&amp;lt;int&amp;gt; fees, vector&amp;lt;string&amp;gt; records) {
    vector&amp;lt;int&amp;gt; answer;
    map&amp;lt;string, pair&amp;lt;int,int&amp;gt;&amp;gt; dic;
    
    
    for (auto &amp;amp;s : records){
        stringstream ss(s);
        string token;
        vector&amp;lt;string&amp;gt; result;
        
        string time;
        int minute;
        string car;
        string inout;
        
        
        while (getline(ss, token, ' ')) // stringstream ss을 이용해 : 기준으로 split해 token에 저장
        {
            result.push_back(token);
        }
        
        time = result[0];
        car = result[1];
        inout = result[2];
        
        minute = stoi(time.substr(0, 2)) * 60 + stoi(time.substr(3, 2));
        
        // cout &amp;lt;&amp;lt; minute &amp;lt;&amp;lt;&quot; &quot; &amp;lt;&amp;lt; car &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; inout;
        
        
        if (dic.find(car) != dic.end()){
            if(inout == &quot;IN&quot;)
            {
                dic[car].first = minute;
            }
            else{
                dic[car].second += (minute - dic[car].first);
                dic[car].first = -1;
            }
        }
        else{
            dic[car] = {minute, 0};
        }        
        
    }
    
    
    priority_queue&amp;lt;pair&amp;lt;string, int&amp;gt;, vector&amp;lt;pair&amp;lt;string, int&amp;gt;&amp;gt;, greater&amp;lt;pair&amp;lt;string, int&amp;gt;&amp;gt;&amp;gt; heap;


    for (auto &amp;amp;d : dic) {
        if (d.second.first != -1){
            d.second.second += (23 * 60 + 59) - d.second.first;
            d.second.first = -1;
        }
        
        int tmp = 0;
        cout &amp;lt;&amp;lt; d.first &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; d.second.first &amp;lt;&amp;lt; &quot; &quot; &amp;lt;&amp;lt; d.second.second &amp;lt;&amp;lt; endl;
        if (d.second.second &amp;lt;= fees[0]){
            heap.push({d.first, fees[1]});
        } 
        else{
            d.second.second -= fees[0];
            tmp = fees[1];
            
            tmp += (ceil((double)d.second.second / fees[2])) * fees[3]; // double로 캐스팅한 후 계산
            heap.push({d.first, tmp});
        }
    }
    
   while (heap.empty() == false){
       auto [c, sums] = heap.top();
       heap.pop();
       
       answer.push_back(sums);
      
   }
    
    for (auto&amp;amp; a : answer){
        cout &amp;lt;&amp;lt; a &amp;lt;&amp;lt; endl;
    }
        
    return answer;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Dictionary</category>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/170</guid>
      <comments>https://esssun.tistory.com/170#entry170comment</comments>
      <pubDate>Sun, 19 Oct 2025 20:37:18 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] Level3 : 섬 연결하기 (파이썬)</title>
      <link>https://esssun.tistory.com/169</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;MST 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42861&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/42861&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760807091023&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42861&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/biXHGm/hyZLqd778c/r6827soFejka7etKH8cD00/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bBkxST/hyZL4AyA5f/BCzoI15A9B9Fk3tkgSgLy0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42861&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/42861&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/biXHGm/hyZLqd778c/r6827soFejka7etKH8cD00/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/bBkxST/hyZL4AyA5f/BCzoI15A9B9Fk3tkgSgLy0/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt; 풀이코드 (성공 - MST Kruskal)&lt;/h2&gt;
&lt;pre id=&quot;code_1760807182236&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(n, costs):
    answer = []
    graph = []
    ans = 0
    
    for n1, n2, w in costs:
        graph.append((w, n1, n2))
    parent = [0] * (n + 1)
    
    def init():
        for i in range(1, n + 1):
            parent[i] = i
    
    def find(i):
        while parent[i] != i:
            parent[i] = parent[parent[i]]
            i = parent[i]
        return i
    
    def merge(i, j):
        ii = find(i)
        jj = find(j)
        
        if ii != jj:
            parent[ii] = jj
    
    graph.sort()
    
    init()
    for w, u, v in graph:
        p = find(u)
        q = find(v)
        
        if find(p) != find(q):
            merge(p, q)
            answer.append(w)
    
    ans = sum(answer[:n-1]) # 노드의 갯수 : n-1
    print(answer)
    print(ans)
    
    
    return ans&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt; 풀이코드 (성공 - MST Prim)&lt;/h2&gt;
&lt;pre id=&quot;code_1760852690172&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import heapq

def solution(n, costs):
    answer = 0
    
    graph = [[] for _ in range(n)]
    
    for u, v, w in costs:
        graph[u].append((v, w))
        graph[v].append((u, w))
    
    visited = [False] * n
    print(visited)
    heap = []
    heapq.heappush(heap, (0, 0))
    ans = []
    
    while heap:
        w, u = heapq.heappop(heap)
        
        if visited[u] == False:
            visited[u] = True
            ans.append(w)
        
            for i, weight in graph[u]:
                if visited[i] == False:
                    heapq.heappush(heap, (weight, i))
    answer=  sum(ans)
        
        
        
    
    
    return answer&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Graph</category>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/169</guid>
      <comments>https://esssun.tistory.com/169#entry169comment</comments>
      <pubDate>Sun, 19 Oct 2025 02:06:56 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] Level3 : 양과 늑대(파이썬)</title>
      <link>https://esssun.tistory.com/168</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;백트래킹 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/92343&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760802127525&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bcmsBY/hyZLfWNEZC/BvjpZfbFLchs0pnxlKbbOK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/2QorV/hyZLizdKpv/88V0gAPDvaiGhYpDbEUUzk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bcmsBY/hyZLfWNEZC/BvjpZfbFLchs0pnxlKbbOK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/2QorV/hyZLizdKpv/88V0gAPDvaiGhYpDbEUUzk/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  풀이코드1(Python 성공-DFS)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;양방향 그래프일 필요 X&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;단방향 그래프를 통하여, 재귀호출을 구현할 수 있는 방법을 찾을 필요가 존재합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #ffffff; color: #263747; text-align: left;&quot;&gt;바로 그 답은, 다음 차례에 이동 가능한 정점을 따로 담아서 재귀호출을 하는 것입니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1760801736544&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def dfs(idx, sheep, wolf, possible):
    global g_info, answer, graph
    print(idx, possible, sheep)
    
    if g_info[idx] == 0:
        sheep += 1
        answer = max(answer, sheep)
    else:
        wolf += 1
    if wolf &amp;gt;= sheep:
        return 
    
    possible.extend(graph[idx])
    for p in possible:
        dfs(p, sheep, wolf, [i for i in possible if i != p])

def solution(info, edges):
    global answer, g_info, visited, graph
    answer = 0
    g_info = info
    n = len(info)
    graph = [[] for _ in range(n)]
    
    for a, b in edges:
        graph[a].append(b)
    
    dfs(0, 0, 0, [])
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이코드2(Python 성공-DFS)&lt;/h2&gt;
&lt;pre id=&quot;code_1760802097576&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(info, edges):
    answer = []
    visited = [False] * len(info)
    
    
    def dfs(sheeps, wolves):
        if sheeps &amp;gt; wolves:
            answer.append(sheeps)
        else:
            return
        
        for p, c in edges:
            # 부모는 방문하였지만 자식은 방문 안한 경우만 진행
            if visited[p] and not visited[c]:
                visited[c] = True
                if info[c] == 0:
                    dfs(sheeps + 1, wolves)
                else:
                    dfs(sheeps, wolves + 1)
                # 만약 다른 곳을 들렸다 방문 시 조건에 충족할 수 있어 false 처리
                visited[c] = False
                
    visited[0] = True
    dfs(1, 0)
    
    return max(answer)&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이코드(Python 실패-DFS)&lt;/h2&gt;
&lt;h2 id=&quot;%F0%9F%92%A1%C2%A0%ED%92%80%EC%9D%B4%EC%BD%94%EB%93%9C%C2%A0(Pypy3%C2%A0%EC%84%B1%EA%B3%B5%C2%A0-%20DFS)-1&quot; style=&quot;background-color: #ffffff; color: #000000; text-align: left;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;pre id=&quot;code_1760794998874&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(info, edges):
    global sheep, wolf
    answer = 0
    graph = [[] for _ in range(len(info))]
    
    for a,b in edges:
        graph[a].append(b)
        
    
    sheep = 1
    wolf = 0
    def dfs(n, s, w):
        global sheep, wolf
        
        visited[n] = True
        
        if all(visited) or 0 not in info:
            return
        
        for i in graph[n]:
            if info[i] == 0:
                
                if sheep + 1 &amp;gt; w:
                    info[i] = 2 # 데려옴
                    sheep += 1
                    wolf = w
                    dfs(i, s+1, w)
            
            elif info[i] == 2:
                if sheep &amp;gt; w:
                    dfs(i, s, w)
            else:
                if sheep &amp;gt; w + 1:
                    dfs(i, s, w+1)
        return w
                    


    visited = [False for _ in range(len(info))]
    
    while True:
        if all(visited) or 0 not in info:
            break
        
        dfs(0, sheep, wolf)
    
    dfs(0, 1, 0)
    answer = sheep
        
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/questions/25736?question=25736&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/questions/25736?question=25736&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760800744748&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/questions/25736?question=25736&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bomUk8/hyZLlCIA1y/NEMkTRBlnKnfz9K8rpJgq1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/dfS03X/hyZLX9gpwD/KxzN5kQUGygoSm01uqFHN1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/questions/25736?question=25736&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/questions/25736?question=25736&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bomUk8/hyZLlCIA1y/NEMkTRBlnKnfz9K8rpJgq1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/dfS03X/hyZLX9gpwD/KxzN5kQUGygoSm01uqFHN1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://tight-sleep.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://tight-sleep.tistory.com/34&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760802029086&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[프로그래머스] 양과 늑대 - python&quot; data-og-description=&quot;문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92343 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁&quot; data-og-host=&quot;tight-sleep.tistory.com&quot; data-og-source-url=&quot;https://tight-sleep.tistory.com/34&quot; data-og-url=&quot;https://tight-sleep.tistory.com/34&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bH9hSz/hyZLsQCiIz/EwxDg37EclcbkTK0AhjXNK/img.png?width=741&amp;amp;height=669&amp;amp;face=0_0_741_669,https://scrap.kakaocdn.net/dn/dtm1Gc/hyZL9PoRaK/NvxHJZDmoWoaH1fkKaLmT1/img.png?width=741&amp;amp;height=669&amp;amp;face=0_0_741_669,https://scrap.kakaocdn.net/dn/cKSs2s/hyZL6ynXpK/LFUiisNc1WT8RSOxdBtYF0/img.png?width=741&amp;amp;height=669&amp;amp;face=0_0_741_669&quot;&gt;&lt;a href=&quot;https://tight-sleep.tistory.com/34&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://tight-sleep.tistory.com/34&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bH9hSz/hyZLsQCiIz/EwxDg37EclcbkTK0AhjXNK/img.png?width=741&amp;amp;height=669&amp;amp;face=0_0_741_669,https://scrap.kakaocdn.net/dn/dtm1Gc/hyZL9PoRaK/NvxHJZDmoWoaH1fkKaLmT1/img.png?width=741&amp;amp;height=669&amp;amp;face=0_0_741_669,https://scrap.kakaocdn.net/dn/cKSs2s/hyZL6ynXpK/LFUiisNc1WT8RSOxdBtYF0/img.png?width=741&amp;amp;height=669&amp;amp;face=0_0_741_669');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[프로그래머스] 양과 늑대 - python&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;문제 링크: https://school.programmers.co.kr/learn/courses/30/lessons/92343 프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;tight-sleep.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://talktato.tistory.com/62&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://talktato.tistory.com/62&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760802040132&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[programmers] 양과 늑대 (python)&quot; data-og-description=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/92343&amp;nbsp;프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는&quot; data-og-host=&quot;talktato.tistory.com&quot; data-og-source-url=&quot;https://talktato.tistory.com/62&quot; data-og-url=&quot;https://talktato.tistory.com/62&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bMvpsP/hyZLeKlMJr/GXXhIfmVUpfiB8EhaPSOf1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bHxUkm/hyZLZzfnOp/kc39gaKZb0sRV3lYwpUAeK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://talktato.tistory.com/62&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://talktato.tistory.com/62&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bMvpsP/hyZLeKlMJr/GXXhIfmVUpfiB8EhaPSOf1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/bHxUkm/hyZLZzfnOp/kc39gaKZb0sRV3lYwpUAeK/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[programmers] 양과 늑대 (python)&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/92343&amp;nbsp;프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;talktato.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/168</guid>
      <comments>https://esssun.tistory.com/168#entry168comment</comments>
      <pubDate>Sun, 19 Oct 2025 00:41:50 +0900</pubDate>
    </item>
    <item>
      <title>[백준] 1987 : 알파벳 (파이썬)</title>
      <link>https://esssun.tistory.com/167</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;그리디, 백트래킹 문제&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.acmicpc.net/problem/1987&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.acmicpc.net/problem/1987&lt;/a&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt;접근 방식&amp;nbsp;&lt;/span&gt;&lt;/h2&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;백트래킹&lt;/h4&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;풀이코드&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(Pypy3&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;성공&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-&lt;span&gt; DFS&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1760193087499&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys 
r, c = map(int, sys.stdin.readline().split())
graph = []
dy = [1, 0, -1, 0]
dx = [0, 1, 0, -1]
visited= [[False] * c for _ in range(r)]
ans = 0
alpha = set()

# print(visited)

for _ in range(r):
    l = list(map(str, sys.stdin.readline().strip())) # 문자열 하나하나씩 저장
    alpha.update(l) # ['H', 'M', 'C', 'H', 'H']를 한번에 각각의 요소별로 set에 추가
    graph.append(l)

# used = [graph[0][0]] # (0,0)은 시작좌표이므로 무조건 지남
used = set()
used.add(graph[0][0])

def dfs(level, x, y):
    global used, ans
    
    ans = max(ans, level)

    if level == len(alpha):
        return
    
    for i in range(4):
        ny = y + dy[i]
        nx = x + dx[i]

        if 0 &amp;lt;= ny &amp;lt; r and 0 &amp;lt;= nx &amp;lt; c:
            if visited[ny][nx] == False:
                # if graph[ny][nx] not in used:
                #     visited[ny][nx] = True
                #     used.append(graph[ny][nx])
                #     dfs(level + 1, nx, ny)
                #     used.pop()
                #     visited[ny][nx] = False
                if graph[ny][nx] not in used:
                    visited[ny][nx] = True
                    used.add(graph[ny][nx])
                    dfs(level + 1, nx, ny)
                    used.remove(graph[ny][nx])
                    visited[ny][nx] = False

dfs(1, 0, 0)
print(ans)&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 코드에서 주석을 풀고, 주석 아래 코드를 주석하면 시간초과가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, 알파벳을 썼는지를 기록하는 used를 set이 아닌 list 자료구조를 쓰면 시간초과가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러므로, dfs나 알고리즘 문제를 풀 때 해당 원소를 썼는지/안썼는지를 확인하기 위한 자료구조로는 왠만하면 set을 사용하자.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;참고문헌&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://codinghejow.tistory.com/215&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://codinghejow.tistory.com/215&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1760193054485&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;[Python] 백준 1987번 : 알파벳&quot; data-og-description=&quot;https://www.acmicpc.net/problem/1987 1987번: 알파벳 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. &quot; data-og-host=&quot;codinghejow.tistory.com&quot; data-og-source-url=&quot;https://codinghejow.tistory.com/215&quot; data-og-url=&quot;https://codinghejow.tistory.com/215&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/AFMii/hyZLe365fW/K3OU8FppkPKEj4CoBLzCk0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/br9Tif/hyZLulqFez/pNVx9sPg2TAcPc1o5rXko1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800&quot;&gt;&lt;a href=&quot;https://codinghejow.tistory.com/215&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://codinghejow.tistory.com/215&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/AFMii/hyZLe365fW/K3OU8FppkPKEj4CoBLzCk0/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800,https://scrap.kakaocdn.net/dn/br9Tif/hyZLulqFez/pNVx9sPg2TAcPc1o5rXko1/img.png?width=800&amp;amp;height=800&amp;amp;face=0_0_800_800');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;[Python] 백준 1987번 : 알파벳&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;https://www.acmicpc.net/problem/1987 1987번: 알파벳 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다.&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;codinghejow.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Back Tracking</category>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/167</guid>
      <comments>https://esssun.tistory.com/167#entry167comment</comments>
      <pubDate>Sat, 11 Oct 2025 23:40:14 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] Lv.2 충돌위험 방지 (파이썬)</title>
      <link>https://esssun.tistory.com/164</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;구현, 시뮬레이션 문제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/340211&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/340211&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738231768736&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/340211&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/cWT7JI/hyX71TAgZl/KB7vCYUdxYpwXfCjZ4ioG1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/sXTNo/hyX70mPw4w/Scj4FLutlQIc9308ehypG1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/340211&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/340211&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/cWT7JI/hyX71TAgZl/KB7vCYUdxYpwXfCjZ4ioG1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/sXTNo/hyX70mPw4w/Scj4FLutlQIc9308ehypG1/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;문제 설명&amp;nbsp;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;routes = []에 몇번 point가 몇번 point로 이동할 것인지의 정보가 주어진다.&lt;/li&gt;
&lt;li&gt;우리는 routes의 정보를 가지고, point -&amp;gt; point로 이동할 때 최단 경로만을 사용해서 이동하고 싶다.&lt;/li&gt;
&lt;li&gt;이때, r좌표의 이동을 c좌표의 이동보다 우선시한다.&lt;/li&gt;
&lt;li&gt;최종적으로는 routes에 있는 point -&amp;gt; point로 동시에 이동시킬 때, 몇 번 충돌하는지 알고 싶다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;접근 방식&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;초기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS를 통해 각각의 point에서 목표 point로 이동하는 최단경로를 싹 구한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, BFS를 돌리는 과정에서 queue에 이동한 현재 좌표를 리스트에 추가함으로써 이동 경로를 기록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;BFS를 다 돌린 후에는 zip, Counter를 활용해 i번째 초에서 각각 몇번 겹쳤는지를 기록한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;변경 후&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;BFS를 돌릴 필요가 없다&lt;/b&gt; !!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(우리는 보통 그래프에서 벽으로 막혀져있거나, 지나갈 수 없는 한계상황을 피해 최단경로를 구하기 위해 BFS를 사용했다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그 이유는 좌표 -&amp;gt; 좌표로 이동하는 최단경로를 구하는 것이므로, &lt;b&gt;단순히 while문&lt;/b&gt;만 돌려주면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또, 굳이 &lt;b&gt;4방향을 돌면서 BFS의 queue에 다음 좌표를 추가해줄 필요 없이, 현재 좌표에서 목표 좌표로 가기 위한 중간 좌표값만 기록&lt;/b&gt;해주면 된다. &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;(r, c 우선순위도 정해져있음)&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✏️&amp;nbsp;짚고&amp;nbsp;넘어갈&amp;nbsp;Point&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. BFS에서 지나온 경로 기록하기&lt;/h3&gt;
&lt;pre id=&quot;code_1738234455985&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while queue:
	if (nx, ny) not in visited:
    	   queue.append((nx, ny, path + [(x, y)]))&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. zip, zip_longest&lt;/h3&gt;
&lt;pre id=&quot;code_1738234567793&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for pair in zip_longest(*pairs, fillvalue=None):&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fillvalue를 사용하면 비교할 리스트의 길이가 짧을 경우, 해당 요소를 원하는 값으로 채울 수 있다.&lt;/li&gt;
&lt;li&gt;*pairs는 pairs(이중 리스트)에 들어간 리스트들을 비교하기 위해 *를 사용했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738234685474&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import itertools

students = ['한민서', '황지민', '이영철', '이광수', '김승민']
rewards = ['사탕', '초컬릿', '젤리']

result = itertools.zip_longest(students, rewards, fillvalue='None')
print(list(result))

'''
출력 결과:
[('한민서', '사탕'), 
('황지민', '초콜릿'), 
('이영철', '젤리'), 
('이광수', 'None'), 
('김승민', 'None')]
'''&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. Counter 모듈 사용&lt;/h3&gt;
&lt;pre id=&quot;code_1738234904665&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cnt = Counter(filtered_pair)

for k, v in cnt.items():
	...&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;counter에서 각각의 key와 value에 접근하기 위해선 items()를 사용하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;사용 예시&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1738235321055&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Counter([&quot;hi&quot;, &quot;hey&quot;, &quot;hi&quot;, &quot;hi&quot;, &quot;hello&quot;, &quot;hey&quot;])
Counter({'hi': 3, 'hey': 2, 'hello': 1})&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  풀이코드 (시간초과 - BFS)&lt;/h2&gt;
&lt;pre id=&quot;code_1738224313684&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;from collections import deque, Counter
from itertools import zip_longest

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]

pairs = []

def solution(points, routes):
    answer = 0

    def bfs(startX, startY, targetX, targetY, path):
        queue = deque()
        queue.append((startX, startY, path))
        visited = set()
        visited.add((startX, startY))
        
        while queue:
            x, y, path = queue.popleft()
            
            # new_path = path + [(x, y)]  
            
            if x == targetX and y == targetY:
                return path
            
            for ii in range(4):
                ny = dy[ii] + y
                nx = dx[ii] + x
                
                if (nx, ny) not in visited:
                    visited.add((nx, ny))
                    queue.append((nx, ny, path + [(x, y)]))
        return [] 

    for r in routes:
        j = deque(r)
        
        path = []
        
        while len(j) &amp;gt;= 2:
            s = j.popleft()
            n = j[0]
            
            startX = points[s-1][0]-1
            startY = points[s-1][1]-1
           
            targetX = points[n-1][0]-1
            targetY = points[n-1][1]-1

            path = bfs(startX, startY, targetX, targetY, path)       
            
        path = path + [(points[j[0]-1][0]-1, points[j[0]-1][1]-1)]
            
        if path:  
            pairs.append(path)
    

    for pair in zip_longest(*pairs, fillvalue=None):
        filtered_pair = [p for p in pair if p is not None] 
        cnt = Counter(filtered_pair)

        for k, v in cnt.items():
            if v &amp;gt; 1:
                answer += 1

    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;시간 복잡도&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. bfs 함수의 시간 복잡도&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #dddddd;&quot;&gt;bfs(startX, startY, targetX, targetY, path)&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;BFS의 최악의 경우는 2차원 격자(100x100)에서 모든 칸을 탐색하는 경우이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;최악의 경우 O(R x C) = O(100 x 100) = O(10000)&lt;/li&gt;
&lt;li&gt;하지만 BFS는 시작점에서 최단 거리만 탐색하므로, 평균적으로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;O(D)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(목표 지점까지의 거리) 정도만 탐색된다.&lt;/li&gt;
&lt;li&gt;최악의 경우, D는 격자의 크기만큼(100) 될 수 있어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;O(100) = O(10&amp;sup2;)&lt;/b&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. bfs 함수 호출 횟수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes의 최대 길이 = 100&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes[i]의 최대 길이 = 100&lt;/p&gt;
&lt;pre id=&quot;code_1738237957793&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for r in routes:
    j = deque(r)

    while len(j) &amp;gt;= 2:
        ...
        path = bfs(startX, startY, targetX, targetY, path)&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;총합 = O(100 ~ 10000) X O(100) X O(100) = O(1000000) ~ O(100000000)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;즉, BFS 함수의 시간 복잡도에 따라 최소 &lt;b&gt;백만번 ~ 억번&lt;/b&gt; 실행될 수 있다. -&amp;gt; 시간 초과&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;고친 코드&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;routes = [[2, 3, 4, 5], [1, 3, 4, 5]]처럼 시작점이 끝점까지 도달하는 과정에서 거쳐야 하는 점들이 여러 개 있는 경우도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예로 들면 2번 point에서 5번 point로 도달하는 과정에서 3번 point와 4번 point도 거쳐가야 하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 위해 처음에는 아래와 같이 구현했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 아래처럼 구현할 경우에는 시작점(2)에서 끝점(5)로 가는 최단 경로를 구해버린다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(혹은 시작점(2)에서 중간점(3) / 중간점(4)로 각각 가는 최단 경로를 구해버린다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시작점(2)에서 중간점(3, 4)를 거쳐&amp;nbsp; 끝점(5)로 가는 경로가 아니다.&lt;/p&gt;
&lt;pre id=&quot;code_1738232491317&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if x == points[tarList[0]-1][0]-1 and y == points[tarList[0]-1][1]-1:
    print(tarList, points[tarList[0]-1][0]-1, points[tarList[0]-1][0]-1)
    tarList.pop(0)
    print(new_path)
    if len(tarList) == 0:
        return new_path  # 최단 경로 반환&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  풀이코드 (성공- 시뮬레이션)&lt;/h2&gt;
&lt;pre id=&quot;code_1738231428486&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# bfs 돌릴 필요가 없음 (장애물이 있는 것도 아니고, 최단 거리만 찾으면 됨 (r, c) 조건에 따라 )

from collections import deque, Counter
from itertools import zip_longest

pairs = []

def solution(points, routes):
    answer = 0

    def sol(startX, startY, targetX, targetY, path):
    
        while startX != targetX:
            if startX &amp;lt; targetX:
                startX += 1
            else:
                startX -= 1
            path.append((startX, startY))
        
            
        while startY != targetY:
            if startY &amp;lt; targetY:
                startY += 1
            else:
                startY -= 1
            path.append((startX, startY))
        
        return path 

    for r in routes:
        j = deque(r)
        
        path = []
        path = path + [(points[j[0]-1][0]-1, points[j[0]-1][1]-1)]
        
        while len(j) &amp;gt;= 2:
            s = j.popleft()
            n = j[0]
            
            startX = points[s-1][0]-1
            startY = points[s-1][1]-1
            
            targetX = points[n-1][0]-1
            targetY = points[n-1][1]-1

            path = sol(startX, startY, targetX, targetY, path)
            
        pairs.append(path)
    
    for pair in zip_longest(*pairs, fillvalue=None):
        cnt = Counter(pair)

        for k, v in cnt.items():
            if v &amp;gt; 1 and k != None:
                answer += 1

    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;주요 로직&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 x좌표와 목표 x좌표를 비교해서 x좌표가 가까워질수 있도록 좌표값을 1씩 증가 / 감소해준다. &lt;br /&gt;그리고, 이동 경로를 기록하기 위해 현재 x좌표와 y좌표를 path 리스트에 추가해준다.&lt;/li&gt;
&lt;li&gt;현재 y좌표와 목표 y좌표를 비교해서 y좌표가 가까워질수 있도록 좌표값을 1씩 증가 / 감소해준다.&lt;br /&gt;그리고, 이동 경로를 기록하기 위해 현재 x좌표와 y좌표를 path 리스트에 추가해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1738236355085&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while startX != targetX:
    if startX &amp;lt; targetX:
        startX += 1
    else:
        startX -= 1
    path.append((startX, startY))


while startY != targetY:
    if startY &amp;lt; targetY:
        startY += 1
    else:
        startY -= 1
    path.append((startX, startY))&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;* 참고문헌&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://windy7271.tistory.com/entry/PythonLV2-PCCP-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-3%EB%B2%88-%EC%B6%A9%EB%8F%8C%EC%9C%84%ED%97%98-%EC%B0%BE%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://windy7271.tistory.com/entry/PythonLV2-PCCP-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-3%EB%B2%88-%EC%B6%A9%EB%8F%8C%EC%9C%84%ED%97%98-%EC%B0%BE%EA%B8%B0&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738246915792&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;article&quot; data-og-title=&quot;(Python/LV2) [PCCP 기출문제] 3번 / 충돌위험 찾기&quot; data-og-description=&quot;어떤&amp;nbsp;물류&amp;nbsp;센터는&amp;nbsp;로봇을&amp;nbsp;이용한&amp;nbsp;자동&amp;nbsp;운송&amp;nbsp;시스템을&amp;nbsp;운영합니다.&amp;nbsp;운송&amp;nbsp;시스템이&amp;nbsp;작동하는&amp;nbsp;규칙은&amp;nbsp;다음과&amp;nbsp;같습니다.&amp;nbsp;물류&amp;nbsp;센터에는&amp;nbsp;(r,&amp;nbsp;c)와&amp;nbsp;같이&amp;nbsp;2차원&amp;nbsp;좌표로&amp;nbsp;나타낼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;&quot; data-og-host=&quot;windy7271.tistory.com&quot; data-og-source-url=&quot;https://windy7271.tistory.com/entry/PythonLV2-PCCP-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-3%EB%B2%88-%EC%B6%A9%EB%8F%8C%EC%9C%84%ED%97%98-%EC%B0%BE%EA%B8%B0&quot; data-og-url=&quot;https://windy7271.tistory.com/entry/PythonLV2-PCCP-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-3%EB%B2%88-%EC%B6%A9%EB%8F%8C%EC%9C%84%ED%97%98-%EC%B0%BE%EA%B8%B0&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/n0Li2/hyX7Y3HllK/bjYMlHSBjaugqr60qXSdiK/img.png?width=800&amp;amp;height=795&amp;amp;face=0_0_800_795,https://scrap.kakaocdn.net/dn/bOuU6P/hyX7SvCdSU/oMKyQXm3HNY2K5bpkuZf8K/img.png?width=800&amp;amp;height=795&amp;amp;face=0_0_800_795,https://scrap.kakaocdn.net/dn/bxMRIB/hyX7WY7iO5/mDQUjYPImzHKENJKxUKIO0/img.png?width=1112&amp;amp;height=1106&amp;amp;face=0_0_1112_1106&quot;&gt;&lt;a href=&quot;https://windy7271.tistory.com/entry/PythonLV2-PCCP-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-3%EB%B2%88-%EC%B6%A9%EB%8F%8C%EC%9C%84%ED%97%98-%EC%B0%BE%EA%B8%B0&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://windy7271.tistory.com/entry/PythonLV2-PCCP-%EA%B8%B0%EC%B6%9C%EB%AC%B8%EC%A0%9C-3%EB%B2%88-%EC%B6%A9%EB%8F%8C%EC%9C%84%ED%97%98-%EC%B0%BE%EA%B8%B0&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/n0Li2/hyX7Y3HllK/bjYMlHSBjaugqr60qXSdiK/img.png?width=800&amp;amp;height=795&amp;amp;face=0_0_800_795,https://scrap.kakaocdn.net/dn/bOuU6P/hyX7SvCdSU/oMKyQXm3HNY2K5bpkuZf8K/img.png?width=800&amp;amp;height=795&amp;amp;face=0_0_800_795,https://scrap.kakaocdn.net/dn/bxMRIB/hyX7WY7iO5/mDQUjYPImzHKENJKxUKIO0/img.png?width=1112&amp;amp;height=1106&amp;amp;face=0_0_1112_1106');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;(Python/LV2) [PCCP 기출문제] 3번 / 충돌위험 찾기&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;어떤&amp;nbsp;물류&amp;nbsp;센터는&amp;nbsp;로봇을&amp;nbsp;이용한&amp;nbsp;자동&amp;nbsp;운송&amp;nbsp;시스템을&amp;nbsp;운영합니다.&amp;nbsp;운송&amp;nbsp;시스템이&amp;nbsp;작동하는&amp;nbsp;규칙은&amp;nbsp;다음과&amp;nbsp;같습니다.&amp;nbsp;물류&amp;nbsp;센터에는&amp;nbsp;(r,&amp;nbsp;c)와&amp;nbsp;같이&amp;nbsp;2차원&amp;nbsp;좌표로&amp;nbsp;나타낼&amp;nbsp;수&amp;nbsp;있는&amp;nbsp;&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;windy7271.tistory.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Algorithm/Simulation</category>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/164</guid>
      <comments>https://esssun.tistory.com/164#entry164comment</comments>
      <pubDate>Thu, 30 Jan 2025 15:38:45 +0900</pubDate>
    </item>
    <item>
      <title>[프로그래머스] Lv.1 최소 직사각형 (파이썬)</title>
      <link>https://esssun.tistory.com/163</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;완전 탐색 문제&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/86491&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://school.programmers.co.kr/learn/courses/30/lessons/86491&lt;/a&gt;&lt;/b&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1738133271896&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;프로그래머스&quot; data-og-description=&quot;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&quot; data-og-host=&quot;programmers.co.kr&quot; data-og-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/86491&quot; data-og-url=&quot;https://programmers.co.kr/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/fCtFk/hyX7Z82CZV/10XiWAftA2YzTKmHJ9SNiK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/cAA4KV/hyX7YChEAd/8aiMgUQjOkFdwjQb78iWgK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960&quot;&gt;&lt;a href=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/86491&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://school.programmers.co.kr/learn/courses/30/lessons/86491&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/fCtFk/hyX7Z82CZV/10XiWAftA2YzTKmHJ9SNiK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960,https://scrap.kakaocdn.net/dn/cAA4KV/hyX7YChEAd/8aiMgUQjOkFdwjQb78iWgK/img.png?width=1920&amp;amp;height=960&amp;amp;face=0_0_1920_960');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;프로그래머스&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;programmers.co.kr&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  풀이코드 (실패 - 시간초과)&lt;/h2&gt;
&lt;pre id=&quot;code_1738133329964&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import sys
sys.setrecursionlimit(10000000)

result = sys.maxsize

def solution(sizes):
    
    def dfs(idx, w_max, h_max):
        global result
        
        if idx == len(sizes):
            result = min(result, w_max * h_max)
            return
        
        for i in range(2):
            n_w_max = max(w_max, sizes[idx][i]) # 0, 1
            n_h_max = max(h_max, sizes[idx][1-i]) # 1, 0
            
            if n_w_max * n_h_max &amp;lt; result:
                dfs(idx + 1, n_w_max, n_h_max)
    dfs(0, 0, 0)
    answer = result
        
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시간 복잡도&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;시간 복잡도 계산 (카세르트의 곱)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 명함 번호에서 2가지(1. w, h 2. h, w) 의 경우의 수를 만들 수 있고, 이러한 명함 번호를 조합하여 모든 경우의 수를 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 최악의 경우 N = 10,000일 때, 호출 횟수는 O(2**10000)이 되므로 시간 초과가 발생한다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이코드 (실패)&lt;/h2&gt;
&lt;pre id=&quot;code_1746938874272&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(sizes):
    answer = 0
    
    arr = [x for s in sizes for x in s]
    arr.sort(reverse=True)
    answer = arr[0] * arr[len(arr) // 2]
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;명함 번호&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;가로 길이&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;세로 길이&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;1&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;60&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;2&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;30&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;3&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;60&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;4&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;80&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%;&quot;&gt;70&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위의 예시에서 4번 명함의 세로 길이에 있는 70이 두번째로 큰 수 이지만, 가로 길이로 바꿀 수가 없다 (80이 더 크므로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서, 이러한 경우로 인해 오답이 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;잘못된 답 :&amp;nbsp;arr = [80, 70, 70, 60, 60, 50, 30, 30] -&amp;gt; 4800&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;올바른 답 : 가로 = [60, 70, 60, 80] 세로 = [50, 30, 30, 70] -&amp;gt; 5600&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-style=&quot;style6&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;  풀이코드 (성공)&lt;/h2&gt;
&lt;pre id=&quot;code_1738135502565&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;def solution(sizes):
    answer = 0
    
    w_max = max(sizes, key = lambda x: x[0])[0]
    h_max = max(sizes, key = lambda x: x[1])[1]

    if max(w_max, h_max) == w_max: 
        for i in range(len(sizes)):
            if sizes[i][0] &amp;lt; sizes[i][1]:
                sizes[i][1] = sizes[i][0]
        h_max = max(sizes, key = lambda x: x[1])[1]
    else:
        for i in range(len(sizes)):
            if sizes[i][0] &amp;gt; sizes[i][1]:
                sizes[i][0] = sizes[i][1]
        w_max = max(sizes, key = lambda x: x[0])[0]
        
    answer = w_max * h_max
                
        
    return answer&lt;/code&gt;&lt;/pre&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;느낀점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시간복잡도를 미리 계산하고 문제를 풀자 ..!&lt;/p&gt;</description>
      <author>_은선_</author>
      <guid isPermaLink="true">https://esssun.tistory.com/163</guid>
      <comments>https://esssun.tistory.com/163#entry163comment</comments>
      <pubDate>Wed, 29 Jan 2025 15:50:38 +0900</pubDate>
    </item>
  </channel>
</rss>