<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>ULISIA's Developer Life</title>
    <link>https://tjsgnrla.tistory.com/</link>
    <description>SSAFY 7기 수료생
프론트 개발자 취업준비생
풀스택 공부과정 진행중
게임 토이프로젝트 진행중</description>
    <language>ko</language>
    <pubDate>Sat, 9 May 2026 19:44:02 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>ULISIA</managingEditor>
    <item>
      <title>[Backjoon] 1697 숨바꼭질 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/25</link>
      <description>&lt;p&gt;출처 : &lt;a href=&quot;https://www.acmicpc.net/problem/1697&quot;&gt;숨바꼭질&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/9f9b50bb-613d-4c28-83b5-e5d91eb95334/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;문제해석&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;BFS를 탐색을 통해서 큐에 들어갈 분기를 세가지로 나눈다.&lt;/p&gt;
&lt;p&gt;현재좌표+1, 현재좌표-1, 현재좌표*2&lt;/p&gt;
&lt;p&gt;다음좌표가 경계체크를 벗어나지 않고 한번도 방문한적이 없다면 이전좌표까지의 방문시간+1을 다음좌표까지의 방문시간에 갱신한다.&lt;/p&gt;
&lt;p&gt;현재좌표가 K가 될때까지 걸리는 시간의 최적해를 구한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해답코드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;#숨바꼭질
from collections import deque

n, k = map(int, input().split())
MAX = 10 ** 5
isVisited = [0] * (MAX+1)

def bfs(startX):
    q = deque()
    q.append(startX)
    while q:
        x = q.popleft()
        if x==k:
            return isVisited[x]
        for nx in (x-1, x+1, x*2):
            if 0 &amp;lt;= nx &amp;lt;= MAX and not isVisited[nx]:
                isVisited[nx] = isVisited[x]+1
                q.append(nx)
print(bfs(n))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Backjoon</category>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>BFS</category>
      <category>python</category>
      <category>그래프</category>
      <category>너비우선탐색</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/25</guid>
      <comments>https://tjsgnrla.tistory.com/25#entry25comment</comments>
      <pubDate>Tue, 25 Jul 2023 15:01:12 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 1520 내리막 길 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/24</link>
      <description>&lt;p&gt;출처 : &lt;a href=&quot;https://www.acmicpc.net/problem/1520&quot;&gt;내리막 길&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/1524c02d-5329-4c4f-8e6d-d4e57d981ced/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;문제해석&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;입력받은 맵을 (0,0)좌표에서 DFS탐색을 시작한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;4방탐색을 통해 다음에 이동할 좌표의 인덱스가 경계를 벗어나지 않으면서 현재좌표값보다 높이가 더 낮을때만 dfs 함수를 재귀 호출한다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;최종적으로 (n-1,m-1)좌표에 도달했을때마다 ans값을 1씩 더해준다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;모든 dfs 탐색이 끝난 이후 최종적으로 나온 ans값을 출력한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;처음엔 여기까지 해서 풀어본 결과 시간초과가 나왔다.&lt;/h3&gt;
&lt;p&gt;(0,0)에서 시작해 dfs로 가능한 곳을 모두 탐색하였기에 너무 많은 경우의 수가 있기때문에 시간초과라는 결과가 나왔다.&lt;/p&gt;
&lt;p&gt;따라서 시간초과를 줄이기 위한 핵심은 DFS에 DP 방식을 결합하는 것이다.&lt;/p&gt;
&lt;p&gt;isVisited 리스트에 -1, 0, n으로 구분하여 각각 미방문,방문한경우,경로완성수로 구분해준다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;미방문(-1)에 대하여 조건을 만족하는 좌표(현재좌표보다 작은 값)으로 이동하며 이동(방문)하였다는 의미로 0으로 초기화해준다.&lt;/li&gt;
&lt;li&gt;목표지점(n-1,m-1)에 도달하면 시작점에서 도착점까지 성공적으로 방문한 한 가지 경로가 되므로 1을 반환해주고, 해당 값을 지금까지 이동해온 경로 내의 모든 리스트 값에 더해준다.&lt;/li&gt;
&lt;li&gt;만약에 현재 방문중인 경로를 이미 다른 경로에서 방문하여 -1이 아닌 다른 값으로 갱신되어져 있다면(0 or n) 더 이상의 탐색은 진행하지 않고 해당 값을 반환해준다.(만약 현재 방문한 좌표가 0이라고 한다면, 해당 좌표를 경로로 그 어떤 경우에도 목표지점으로 도달할 수 없다는 뜻이고, n이라면 해당 좌표를 통해 목표지점으로 가는 경우의 수를 지금까지 n개를 찾았다는 것이다.)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;이런식으로 이미 완성된 경로의 수를 방문한 좌표에서 총 몇개인지를 굳이 탐색을 끝까지 하지 않고 바로 반환해주므로써 수행시간을 줄일 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해답코드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;실패한 코드(시간초과)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#내리막 길
import sys
sys.setrecursionlimit(10 ** 9)

input = sys.stdin.readline

n,m = map(int,input().split())
maps = [[0] * m for _ in range(n)]
isVisited = [[False]*m for _ in range(n)]
for y in range(n):
    maps[y] = list(map(int,input().split()))

ans=0

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


def dfs(startY,startX):
    global ans
    if startY==n-1 and startX==m-1:
        ans += 1
    for d in range(4):
        ny, nx = startY+dy[d], startX+dx[d]
        if 0&amp;lt;=ny&amp;lt;n and 0&amp;lt;=nx&amp;lt;m and maps[startY][startX]&amp;gt;maps[ny][nx] and not isVisited[ny][nx]:
            isVisited[ny][nx]=True
            dfs(ny,nx)
            isVisited[ny][nx]=False

dfs(0,0)
print(ans)&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;DFS+DP(정답코드)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#내리막 길
import sys
sys.setrecursionlimit(10 ** 9)

input = sys.stdin.readline

n,m = map(int,input().split())
maps = [list(map(int,input().split())) for _ in range(n)]
isVisited = [[-1]*m for _ in range(n)]

ans=0

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

def dfs(startY,startX):
    #목적지 도착시 해당경로 내 모든 배열값 추가
    if startY==n-1 and startX==m-1:
        return 1
    #이미 방문한 곳이면 해당 좌표에서 도착 가능한 모든 경로의 수 추가
    if isVisited[startY][startX] != -1:
        return isVisited[startY][startX]

    #방문하지 않은 곳이면 방문했지만 아직 경로완성을 찾지 못했다는 의미로 0으로 초기화
    isVisited[startY][startX]=0

    #4방탐색
    for d in range(4):
        ny, nx = startY+dy[d], startX+dx[d]
        if 0&amp;lt;=ny&amp;lt;n and 0&amp;lt;=nx&amp;lt;m and maps[startY][startX]&amp;gt;maps[ny][nx]:
            isVisited[startY][startX] += dfs(ny,nx)

    return isVisited[startY][startX]
print(dfs(0,0))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Backjoon</category>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>dfs</category>
      <category>dp</category>
      <category>python</category>
      <category>그래프</category>
      <category>깊이우선탐색</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/24</guid>
      <comments>https://tjsgnrla.tistory.com/24#entry24comment</comments>
      <pubDate>Mon, 24 Jul 2023 22:11:16 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 2583 영역 구하기 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/23</link>
      <description>&lt;p&gt;출처 : &lt;a href=&quot;https://www.acmicpc.net/problem/2583&quot;&gt;영역 구하기&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/184d12a9-02fb-4c78-b332-1521b45fcc03/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;문제해석&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ul&gt;
&lt;li&gt;&lt;p&gt;모눈종이 전체 눈금을 0으로 초기화 한 뒤 사각형을 이루고 있는 부분을 1로 초기화해준다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;모눈종이 전체 눈금 한칸한칸을 탐색하는 기준으로 (0,0)부터 시작해서 흰색(0)을 이루고 있는 부분을 만나면 BFS/DFS 탐색을 시작함과 동시에 영역개수를 증가시킨다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;해당영역내에서 흰칸을 이루고 있는 부분만큼 영역넓이를 구해서 반환해준뒤 해당 넓이를 저장하는 리스트에 추가해준다.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;최종적으로 구해진 영역 개수와 영역 넓이 리스트의 값들을 출력한다.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해답코드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;import sys
from collections import deque

input = sys.stdin.readline

n, m, k = map(int, input().split())

maps = [[0]*m for _ in range(n)]

for _ in range(k):
    x1,y1,x2,y2 = map(int,input().split())
    for y in range(y1,y2):
        for x in range(x1,x2):
            maps[y][x] = 1

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

ans=1
area=[]

def bfs(startY,startX):
    global ans
    q = deque()
    q.append([startY,startX])
    maps[startY][startX]=2
    while q:
        y,x = q.popleft()
        for d in range(4):
            ny,nx = y+dy[d], x+dx[d]
            if 0&amp;lt;=ny&amp;lt;n and 0&amp;lt;=nx&amp;lt;m and maps[ny][nx]==0:
                ans+=1
                maps[ny][nx]=2
                q.append([ny,nx])
    return ans

for y in range(n):
    for x in range(m):
        if maps[y][x]==0:
            ans=bfs(y,x)
            area.append(ans)
            ans=1

area.sort()
print(len(area))
for result in area:
    print(result, end=&amp;quot; &amp;quot;)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Backjoon</category>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>BFS</category>
      <category>dfs</category>
      <category>python</category>
      <category>그래프</category>
      <category>깊이우선탐색</category>
      <category>너비우선탐색</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/23</guid>
      <comments>https://tjsgnrla.tistory.com/23#entry23comment</comments>
      <pubDate>Mon, 24 Jul 2023 13:38:31 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 2178 미로 탐색 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/22</link>
      <description>&lt;p&gt;출처 : &lt;a href=&quot;https://www.acmicpc.net/problem/2178&quot;&gt;미로 탐색&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/87d8d358-f7f3-4aa7-873f-d980d18bd9c1/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;문제해석&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;대표적인 미로 탐색 유형의 쉬운 난이도 문제&lt;/p&gt;
&lt;p&gt;미로 문제는 기본적으로 이동방향을 제어할 수 있는 배열이 자주 쓰인다.&lt;br&gt;(2차원 기준 2방,4방,8방 등)&lt;/p&gt;
&lt;p&gt;y와 x좌표에 대한 변화량을 나타내는 dy,dx를 선언하여 각 방향별 인접배열 값을 탐색할 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;dy = [-1,1,0,0]
dx = [0,0,-1,1]&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;주의할 점은 이동조건이 있는 미로탐색 등의 문제에서 항상 경계체크와 이동조건을 잊지 말아야 한다.&lt;/p&gt;
&lt;p&gt;다음으로 탐색할 인덱스가 전체 맵 배열의 최소와 최대 인덱스 범위를 벗어나지 않는지,&lt;br&gt;해당 문제에서는 배열값이 1로 되어 있는곳에서만 이동이 가능하므로 해당 조건 또한 동시에 만족해야 한다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;for d in range(4):
    ny, nx = y+dy[d], x+dx[d]
    if 0 &amp;lt;= ny &amp;lt; y좌표최대범위 and 0 &amp;lt;= nx &amp;lt; x좌표최대범위 and mapping[ny][nx]==1:
    경계체크 및 이동조건 만족시 수행&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;이 문제는 미로를 탐색하면서 목적지까지의 최단 경로를 구하는 문제이다.&lt;/p&gt;
&lt;p&gt;최단 경로를 구하기 위해서 DFS와 BFS 중 어떤 탐색방식이 더 유리한가의 예시는 다음처럼 들 수 있다.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;DFS
- 재귀적 특징과 백트래킹을 이용한 모든 경우를 하나씩 전부 탐색하는 경우
- 그래프(맵)의 크기가 클 경우
- 최적의 답을 찾는 것이 아닌 경우
- 경로의 특징을 저장해야 하는 경우 ex)가중치, 이동과정 제약 등

BFS
- 최단 거리 or 최단 횟수
- 최적의 답을 찾는 경우, BFS는 가장 처음 발견되는 해답이 최적해
- 탐색의 횟수를 구해야 하는 경우&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;1. 그래프의 모든 정점을 방문하는 것이 주요한 문제&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;단순히 모든 정점을 방문하는 것이 중요한 문제는 DFS,BFS 어느 것을 사용해도 무관.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 경로의 특징을 저장해둬야 하는 문제.&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;각 정점마다 숫자가 주어지고 a~b까지의 경로중 같은 숫자가 있으면 안된다는 식의 이동과정 제약 등의 문제 등, 각각의 경로마다 특징, 가중치 등을 저장해둬야 할 때는 DFS를 사용한다.(BFS는 경로의 특징을 가지지 못한다)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;3. 최단거리&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;미로 찾기 등 최단거리 문제에서 BFS가 유리.&lt;br&gt;DFS로 경로를 탐색할 경우 최초의 해답이 최적해(최단거리)가 아닐 수 있지만, BFS는 현재 노드부터 가장 가까운 곳부터 찾기 때문에 경로 탐색 시 가장 먼저 찾아지는 해답이 곧 최적해(최단거리)이기 때문.&lt;/li&gt;
&lt;li&gt;따라서 최단 거리를 구하는 해당 문제는 BFS로 풀고자 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;입력값으로 주어진 맵을 저장.&lt;/li&gt;
&lt;li&gt;(1,1)좌표를 기준으로 bfs 시작.&lt;/li&gt;
&lt;li&gt;4방탐색으로 이동 가능한 인접노드 탐색.&lt;/li&gt;
&lt;li&gt;(y,x)좌표가 n,m이 될때까지 인접노드 값을 증가하며 bfs 탐색.&lt;/li&gt;
&lt;li&gt;(n,m)좌표에서 완성된 배열값 출력&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해답코드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;#미로 탐색
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int,input().split())
mapping = []

for _ in range(n):
    #readline 맨 뒤 &amp;#39;\n&amp;#39;까지 입력받으므로 제거해줘야함
    mapping.append(list(map(int,input().rstrip())))

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

def bfs(startY,startX):
    q = deque()
    q.append((startY,startX))
    while q:
        y,x = q.popleft()
        for d in range(4):
            ny = y+dy[d]
            nx = x+dx[d]
            if 0&amp;lt;=ny&amp;lt;n and 0&amp;lt;=nx&amp;lt;m and mapping[ny][nx]==1:
                q.append((ny,nx))
                mapping[ny][nx]=mapping[y][x]+1
    return mapping[n-1][m-1]

print(bfs(0,0))&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Backjoon</category>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>BFS</category>
      <category>python</category>
      <category>그래프</category>
      <category>너비우선탐색</category>
      <category>최단거리</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/22</guid>
      <comments>https://tjsgnrla.tistory.com/22#entry22comment</comments>
      <pubDate>Sun, 23 Jul 2023 19:55:49 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 1068 트리 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/21</link>
      <description>&lt;p&gt;출처 : &lt;a href=&quot;https://www.acmicpc.net/problem/1068&quot;&gt;트리&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/d574994c-18fc-4f30-848a-4075d07ea1a1/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;문제해석&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ol&gt;
&lt;li&gt;제거하고자 하는 입력값을 dfs 함수에 넘겨준다.&lt;/li&gt;
&lt;li&gt;넘겨준 입력값을 인덱스로 하는 배열값을 제거한다는 의미로 -2로 변경한다.(-1은 루트 노드이므로)&lt;/li&gt;
&lt;li&gt;제거한 인덱스를 부모노드로 가지고 있는 노드를 찾아 제거하기 위해 dfs함수를 재귀 호출한다.&lt;/li&gt;
&lt;li&gt;재귀가 종료되고 삭제될 노드들은 전부 -2를 배열값으로 지니고 있다.&lt;/li&gt;
&lt;li&gt;-2가 아니면서, 다른 노드의 부모노드도 아닌 원소(초기 배열 초기화 단계에서 포함되지 않은)를 찾을 때마다 ans를 1씩 늘린다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해답코드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;#트리
import sys
input = sys.stdin.readline

n=int(input())
vList = list(map(int,input().split()))
delete = int(input())

ans=0

def dfs(num):
    vList[num] = -2
    for i in range(n):
        if num == vList[i]:
            dfs(i)

dfs(delete)

for i in range(n):
    if vList[i] != -2 and i not in vList:
        ans += 1

print(ans)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Backjoon</category>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>dfs</category>
      <category>python</category>
      <category>그래프</category>
      <category>깊이우선탐색</category>
      <category>트리</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/21</guid>
      <comments>https://tjsgnrla.tistory.com/21#entry21comment</comments>
      <pubDate>Sat, 22 Jul 2023 15:49:32 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 5639 이진 검색 트리 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/20</link>
      <description>&lt;p&gt;출처 : &lt;a href=&quot;https://www.acmicpc.net/problem/5639&quot;&gt;5639번 이진 검색 트리&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/ba658d26-3f6a-4623-b0a6-ee98726c2414/image.png&quot; alt=&quot;&quot;&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/309fb62c-d574-4897-a227-19dd11dcab22/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;문제해석&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;전위 순회 결과&lt;/p&gt;
&lt;p&gt;50 30 24 5 28 45 98 52 60&lt;/p&gt;
&lt;p&gt;첫 원소가 루트 노드(전위 순회)&lt;br&gt;왼쪽 서브 트리는 루트 노드보다 작은 원소&lt;br&gt;오른쪽 서브 트리는 루트 노드보다 큰 원소&lt;/p&gt;
&lt;p&gt;전위 순회이므로 루트 노드보다 큰 원소가 나오는 지점이 왼쪽 서브 트리와 오른쪽 서브 트리를 나누는 지점과 같다.&lt;/p&gt;
&lt;p&gt;50 /30 24 5 28 45/ 98 52 60&lt;/p&gt;
&lt;p&gt;50=루트 노드, 30&lt;del&gt;45=왼쪽 서브트리, 98&lt;/del&gt;60= 오른쪽 서브트리&lt;/p&gt;
&lt;p&gt;위 결과를 활용하여 후위 순회를 해주면 된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해답코드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;#이진 검색 트리
import sys
sys.setrecursionlimit(10**9)
input = sys.stdin.readline

pre = []
while True:
    try:
        pre.append(int(input()))
    except:
        break

def post(start,end):
    if start&amp;gt; end:
        return
    mid = end+1
    for i in range(start+1,end+1):
        if pre[i] &amp;gt; pre[start]:
            mid = i
            break
    post(start+1,mid-1) #왼쪽 트리
    post(mid,end) #오른쪽 트리
    print(pre[start]) #루트 노드

post(0, len(pre)-1)&lt;/code&gt;&lt;/pre&gt;&lt;h3&gt;mid를 end + 1로 초기화하는 이유&lt;/h3&gt;
&lt;p&gt;만약 모든 원소가 루트 노드보다 작은 경우&lt;/p&gt;
&lt;p&gt;post(start + 1, mid - 1) : start + 1, end 가 삽입, 즉 루트 노드를 제외한 트리&lt;/p&gt;
&lt;p&gt;post(mid, end) : end + 1, end 가 삽입되어 if start &amp;gt; end: return에 의해 리턴됨 이는 오른쪽 노드가 없음을 의미&lt;/p&gt;</description>
      <category>Algorithm/Backjoon</category>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>python</category>
      <category>그래프</category>
      <category>전위순회</category>
      <category>후위순회</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/20</guid>
      <comments>https://tjsgnrla.tistory.com/20#entry20comment</comments>
      <pubDate>Fri, 21 Jul 2023 16:26:54 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 13549 숨바꼭질 3 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/19</link>
      <description>&lt;p&gt;출처 : &lt;a href=&quot;https://www.acmicpc.net/problem/13549&quot;&gt;링크텍스트&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/8545d7e4-1da7-43fe-9433-d753ae948ceb/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;문제해석&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;시간 가중치가 0과 1 둘로 나누어진다.&lt;br&gt;걷기 : x+1, x-1은 1초가 걸리고&lt;br&gt;순간이동 : 2*x는 0초가 걸린다.&lt;/p&gt;
&lt;p&gt;단계가 이루어진다는 점으로 큐를 2개로 나눠 구현하는 방법이나&lt;/p&gt;
&lt;p&gt;양방향 큐인 deque를 활용하여 2개를 별도로 만들지 않고, 순간이동할 경우 맨 앞에 추가, 걷기를 할 경우엔 뒤에 추가한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해답코드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;#숨바꼭질 3
import sys
from collections import deque

MAX = 100001
isVisited = [False] * MAX
time = [-1] * MAX

input = sys.stdin.readline

n, k = map(int,input().split())
q = deque()
q.append(n)
isVisited[n] = True
time[n]=0

while q:
    now = q.popleft()
    if now == k:
        print(time[k])
        break
    if now-1&amp;gt;=0 and isVisited[now-1]==False: #x-1
        q.append(now-1)
        isVisited[now-1]=True
        time[now-1]=time[now]+1
    if now * 2 &amp;lt; MAX and isVisited[now*2]==False: #순간이동
        q.appendleft(now*2) #순간이동은 0초이므로 최우선순위
        isVisited[now*2] = True
        time[now*2]=time[now] #순간이동은 시간변동 x
    if now+1 &amp;lt; MAX and isVisited[now+1]==False: # x+1 이동
        q.append(now+1)
        isVisited[now+1]=True
        time[now+1] = time[now]+1
&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;주의할 점&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;분명 제대로 풀었다고 생각했는데 계속 99%에서 틀림이 나오길래 내가 대체 어디서 잘못한 걸까 헤매는 시간이 길었다.&lt;/li&gt;
&lt;li&gt;99%에서 틀린 이유는 처음에 if 조건문의 순서를 +1이 -1보다 앞에 있었다. 해당 경우의 반례로서는 이러한 경우가 있었다.&lt;/li&gt;
&lt;li&gt;input 4 6 output 1&lt;/li&gt;
&lt;li&gt;(4-3-6) 1초&lt;/li&gt;
&lt;li&gt;만약 +1이 앞에 있으면 2초로 나온다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>BFS</category>
      <category>python</category>
      <category>너비우선탐색</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/19</guid>
      <comments>https://tjsgnrla.tistory.com/19#entry19comment</comments>
      <pubDate>Thu, 20 Jul 2023 13:17:33 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 1916 최소비용 구하기 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/18</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;출처 : &lt;a href=&quot;https://www.acmicpc.net/problem/1916&quot;&gt;링크텍스트&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/7c8139c3-771d-43b5-b073-a7f7f66eeb95/image.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제해석&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;버스 비용을 '거리'(dist)라고 생각하면, 최단 경로를 구하는 문제로 환원된다. 즐 최단경로를 구하는 문제이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 지점으로부터의 최단 거리 계산은 &lt;b&gt;다익스트라 알고리즘&lt;/b&gt;으로 구할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해답코드&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;#최소비용
import sys
#우선순위 큐 구현을 위함
import heapq

input = sys.stdin.readline

# 입력
n = int(input()) #정점 개수
m = int(input()) #간선 개수
graph = [[] for _ in range(n+1)]
for _ in range(m):
    parent, child, gain = map(int, input().split())
    graph[parent].append((child,gain)) #도착지, 가중치

start, end = map(int, input().split()) #출발지, 목적지

# 다익스트라 최적경로 탐색
def dijkstra(graph, start):
    distances = [int(1e9)]*(n+1) #처음 초기값은 무한대
    distances[start] = 0 #시작 노드까지의 거리는 0
    q = []
    heapq.heappush(q, [distances[start],start]) #시작노드부터 탐색 시작

    while q:
        dist, node = heapq.heappop(q) #탐색할 노드거리, 노드

        #기존 최단거리보다 멀다면 무시
        if distances[node] &amp;lt; dist:
            continue

        #노드와 연결된 인접노드 탐색
        for child, gain in graph[node]:
            distance = dist + gain #인접노드까지의 거리
            if distance &amp;lt; distances[child]: #기존 거리보다 짧으면 갱신
                distances[child] = distance
                heapq.heappush(q,[distance,child]) #다음 인접 거리를 계산하기 위해 큐에 삽입

    return distances

dist_start = dijkstra(graph,start)
print(dist_start[end])&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Backjoon</category>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>python</category>
      <category>그래프</category>
      <category>다익스트라</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/18</guid>
      <comments>https://tjsgnrla.tistory.com/18#entry18comment</comments>
      <pubDate>Wed, 19 Jul 2023 17:47:58 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 1197 최소 스패닝 트리 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/17</link>
      <description>&lt;p&gt;출처:&lt;a href=&quot;https://www.acmicpc.net/problem/1197&quot;&gt;1197번 최소 스패닝 트리&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/9bbd5bbb-17b9-46fc-9803-861e9d3a337a/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;문제해석&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;최소 신장 트리 (minimum spanning tree)&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;전체 요소들을 연결&lt;/strong&gt;할때 사용한다. Kruskal 알고리즘, Prim 알고리즘이 있다.&lt;/p&gt;
&lt;h3&gt;Kruskal&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;간선들을 정렬&lt;/li&gt;
&lt;li&gt;간선이 잇는 두 정점의 root를 찾는다.&lt;/li&gt;
&lt;li&gt;다르다면 하나의 root를 바꾸어 연결 시켜준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Prim&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;임의의 정점을 선택&lt;/li&gt;
&lt;li&gt;해당 정점에서 갈 수 있는 간선을 minheap(최소힙)에 넣는다.&lt;/li&gt;
&lt;li&gt;최소값을 뽑아 해당 정점을 방문하지 않았다면 선택한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kruskal 알고리즘은 간선들을 정렬해야하기 때문에 간선이 적다면 Kruskal, 많다면 Prim을 선택한다.&lt;/p&gt;
&lt;p&gt;비슷한 알고리즘으로 다익스트라 알고리즘이 있다.&lt;br&gt;다익스트라는 전체 요소를 연결하는 것이 아닌 &lt;strong&gt;한 정점에서 다른 정점으로 가는 가장 짧은 방법&lt;/strong&gt;을 구할 때 사용한다.&lt;/p&gt;
&lt;h3&gt;다익스트라&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;최단 거리 배열을 무한대로 초기화한다. 방문여부 배열은 False로 초기화 한다.&lt;/li&gt;
&lt;li&gt;출발 노드는 방문했다고 체크 후 heap에 넣는다.&lt;/li&gt;
&lt;li&gt;아직 방문하지 않은 노드들 중, 최단 거리 테이블 값이 가장 작은 노드를 선택한다.&lt;/li&gt;
&lt;li&gt;저장된 최단거리 값과 현재노드에 가중치를 더한 거리 값 중 더 작은 값으로 update한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해답코드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;1. Kruskal&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;root를 저장하는 vRoot 배열 생성. (여기서 root는 연결요소 중 가장 작은 값, 처음에는 자기 자신을 저장)&lt;/li&gt;
&lt;li&gt;간선들(eList)를 가중치(gain) 기준으로 정렬.&lt;/li&gt;
&lt;li&gt;간선들이 이은 두 정점을 find 함수를 통해 두 root(sRoot, eRoot)를 찾는다.&lt;/li&gt;
&lt;li&gt;두 root가 다르다면 큰 root값을 작은 root값으로 만들어 연결되게 해준다.&lt;/li&gt;
&lt;li&gt;가중치를 더한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;pre&gt;&lt;code&gt;# 최소 스패닝 트리

#1. Kruskal
import sys
input = sys.stdin.readline

v, e = map(int, input().split())
vRoot = [i for i in range(v+1)]
eList = []
for _ in range(e):
    eList.append(list(map(int,input().split())))

eList.sort(key=lambda x: x[2])

def find(x):
    if x != vRoot[x]:
        vRoot[x] = find(vRoot[x])
    return vRoot[x]

ans=0

for start, end, gain in eList:
    startRoot = find(start)
    endRoot = find(end)
    if startRoot != endRoot:
        if startRoot&amp;gt;endRoot:
            vRoot[startRoot] = endRoot
        else:
            vRoot[endRoot] = startRoot
        ans += gain

print(ans)&lt;/code&gt;&lt;/pre&gt;&lt;h2&gt;2. Prim&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;isVisited : 방문여부 확인&lt;/li&gt;
&lt;li&gt;eList : 간선 저장&lt;/li&gt;
&lt;li&gt;heap : 현재 그래프에서 짧은 경로를 선택&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;현재 그래프에서 가장 짧은 간선을 골라 방문하지 않은 정점이라면 선택한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;#2. Prim
import sys
import heapq
input = sys.stdin.readline

v, e = map(int, input().split())
isVisited = [False]*(v+1)
eList = [[] for _ in range(v+1)]
heap = [[0, 1]]

for _ in range(e):
    start, end, gain = map(int, input().split())
    eList[start].append([gain,end])
    eList[end].append([gain,start])

ans = 0
cnt = 0
while heap:
    if cnt == v:
        break
    gain, start = heapq.heappop(heap)
    if not isVisited[start]:
        isVisited[start] = True
        ans += gain
        cnt += 1
        for i in eList[start]:
            heapq.heappush(heap, i)

print(ans)&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Backjoon</category>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>MST</category>
      <category>python</category>
      <category>그래프</category>
      <category>최소신장트리</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/17</guid>
      <comments>https://tjsgnrla.tistory.com/17#entry17comment</comments>
      <pubDate>Tue, 18 Jul 2023 16:45:29 +0900</pubDate>
    </item>
    <item>
      <title>[Backjoon] 24479 알고리즘 수업 - 깊이 우선 탐색 1 Python 문제 풀이</title>
      <link>https://tjsgnrla.tistory.com/16</link>
      <description>&lt;p&gt;출처:&lt;a href=&quot;https://www.acmicpc.net/problem/24479&quot;&gt;알고리즘 수업 - 깊이 우선 탐색 1&lt;/a&gt;&lt;br&gt;&lt;img src=&quot;https://velog.velcdn.com/images/tjsgnrla97/post/89b3f29a-e562-4cd1-a429-e86bd78862e0/image.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;문제해석&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;ol&gt;
&lt;li&gt;1번 노드를 처음 시작하므로 첫번째 방문으로 visited 되었다고 표현하기 위해 isVisited[1]을 1로 바꿈&lt;/li&gt;
&lt;li&gt;1번 노드와 연결된 2번, 4번 노드 중에서 2번 노드가 더 작으므로 2번 노드 방문 -&amp;gt; 2번 노드를 2번째로 방문하였으므로 isVisited[2]를 2로 변경&lt;/li&gt;
&lt;li&gt;2번 노드와 연결된 1번, 3번, 4번 노드 중 방문하지 않은 노드 중에서 작은 값인 3번 노드 방문 -&amp;gt; 3번 노드를 3번째로 방문하였으므로 isVisited[3]을 3으로 변경&lt;/li&gt;
&lt;li&gt;4번 노드와 연결된 1번, 3번, 4번 노드 중 방문하지 않은 노드들이 더 이상 없으므로 재귀 종료. 따라서 5번 노드는 시작 노드 1번으로부터 방문하지 못하는 노드이므로 0으로 명시&lt;/li&gt;
&lt;li&gt;출력은 isVisited에 몇번째로 출력되는지를 구한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;주의할 점&lt;/strong&gt; 방문하는 순서대로가 아니라 몇 번째로 출력되는지(dfs하면서 출력하면 안됨)&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;n(정점의 수), m(간선의 수), r(시작 정점 노드), graph(연결 노드 그래프), isVisited(방문 순서 입력 그래프)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;n, m, r 입력 받기&lt;/li&gt;
&lt;li&gt;m만큼 graph로 입력받은 후 graph의 배열마다 하나씩 오름차순 sort 정렬&lt;/li&gt;
&lt;li&gt;dfs 함수 선언 및 재귀 반복, dfs 시작할 때 마다 isVisited에 ans 값 변경 + dfs 실행 후에는 ans 값 1 증가하여 순서대로 값 변경하기&lt;/li&gt;
&lt;li&gt;isVisted 인덱스 값이 0인 값은 빼고 출력하기&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;해답코드&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;pre&gt;&lt;code&gt;#알고리즘 수업 - 깊이 우선 탐색 1

import sys
sys.setrecursionlimit(10**6) #재귀 허용 깊이를 수동으로 늘려주는 코드

#정점의 수, 간선의 수, 시작 정점
n, m, r = map(int,sys.stdin.readline().split())
#연결노드 그래프 초기화(1번노드와 인덱스 값이 같게 하기 위해서 n+1)
#[[],[],[],[],[]]
graph = [[] for _ in range(n+1)]
#방문 순서 그래프 (위와 같이 인덱스 값과 노드의 값이 동일하게 만들기 위해서 n+1)
isVisited = [0]*(n+1)
#순서 입력
ans = 1

def dfs(graph,start,isVisited):
    #함수 밖의 ans 값을 사용하기 위해서 global 명시
    global ans
    #방문할 떄마다 순서 값 변경
    isVisited[start]=ans
    #연결노드 방문
    for i in graph[start]:
        #방문 안한 노드일 경우
        if not isVisited[i]:
            #순서 증가
            ans+=1
            #dfs 실행
            dfs(graph,i,isVisited)

#연결된 노드 입력 받기
for _ in range(m):
    start, end = map(int, sys.stdin.readline().split())
    graph[start].append(end)
    graph[end].append(start)

#오름차순 정리
for i in range(n+1):
    graph[i].sort()

dfs(graph,r,isVisited)

#순서 출력
for i in range(n+1):
    if i:
        print(isVisited[i])
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>Algorithm/Backjoon</category>
      <category>algorithm</category>
      <category>Backjoon</category>
      <category>dfs</category>
      <category>python</category>
      <category>그래프</category>
      <category>깊이우선탐색</category>
      <author>ULISIA</author>
      <guid isPermaLink="true">https://tjsgnrla.tistory.com/16</guid>
      <comments>https://tjsgnrla.tistory.com/16#entry16comment</comments>
      <pubDate>Mon, 17 Jul 2023 12:23:34 +0900</pubDate>
    </item>
  </channel>
</rss>