์ถ์ฒ : https://www.youtube.com/watch?v=7C9RgOcvkvo&list=PLRx0vPvlEmdAghTr5mXQxGpHjWqSz0dgC&index=3
์ ์
ํ์ถ
์ ์๋ฃ๊ตฌ์กฐํ๋ง๊ธ์ค ํต์ ํ๋ง๊ธ์ค ๋ฃ๊ธฐ ๐ช ๊ฐ์ ๋๋
python
stack = [] # ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ์ฌ์ฉ # ์ฝ์ (5) - ์ฝ์ (2) - ์ฝ์ (3) - ์ฝ์ (7) - ์ญ์ () - ์ฝ์ (1) - ์ฝ์ (4) - ์ญ์ () # append(), pop()์ ์๊ฐ๋ณต์ก๋๋ O(1) stack.append(5) stack.append(2) stack.append(3) stack.append(7) stack.pop() stack.append(1) stack.append(4) stack.pop() print(stackl::-1]) # ์ต์๋จ ์์๋ถํฐ ์ถ๋ ฅ print(stack) # ์ตํ๋จ ์์๋ถํฐ ์ถ๋ ฅ
Java
import java.util.*; public class Main { public static void main(String[] args) { Stack<Integer> s = new Stack<>(); //์ฝ์ (5) - ์ฝ์ (2) - ์ฝ์ (3) - ์ฝ์ (7) - ์ญ์ () - ์ฝ์ (1) - ์ฝ์ (4) - ์ญ์ () s.push(5); s.push(2); s.push(3); s.push(7); s.pop(); s.push(1); s.push(4); s.pop(); //์คํ์ ์ต์๋จ ์์๋ถํฐ ์ถ๋ ฅ while(!s.empty()) { System.out.print(s.peek() + " "); s.pop (); } } }
์ ์
์ ์ถ
์ ์๋ฃ๊ตฌ์กฐ์ ๊ตฌ์ ์ถ๊ตฌ๊ฐ ๋ชจ๋ ๋ซ๋ ค ์๋ ํฐ๋๊ณผ ๊ฐ์ ํํ ๐จ
์์ ) ์ํ์ฐฝ๊ตฌ์์ ๋ฒํธํ ๋ฝ๊ณ ๊ธฐ๋ค๋ฆฌ๊ธฐ
python
# ๋ฆฌ์คํธ๋ก ํ๋ฅผ ๊ตฌํํ ์ ์์ง๋ง ์๊ฐ๋ณต์ก๋๊ฐ ๋์ ๋นํจ์จ์ from collections import deque # ํ(Queue) ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ queue = deque() # ์ฝ์ (5) - ์ฝ์ (2) - ์ฝ์ (3) - ์ฝ์ (7) - ์ญ์ () - ์ฝ์ (1) - ์ฝ์ (4) - ์ญ์ () queue.append(5) queue.append(2) queue.append(3) queue.append(7) queue.popleft() queue.append(1) queue.append(4) queue.popleft() print(queue) # ๋จผ์ ๋ค์ด์จ ์์๋๋ก ์ถ๋ ฅ queue.reverse() # ์ญ์์ผ๋ก ๋ฐ๊พธ๊ธฐ print(queue) # ๋์ค์ ๋ค์ด์จ ์์๋ถํฐ ์ถ๋ ฅ
Java
import java.util.*; public class Main { public static void main(String[] args) { Queue<Integer> q = new LinkedList<>(); // ์ฝ์ (5) - ์ฝ์ (2) - ์ฝ์ (3) - ์ฝ์ (7) - ์ญ์ () - ์ฝ์ (1) - ์ฝ์ (4) - ์ญ์ () q.offer(5); q.offer(2); q.offer(3); q.offer(7); q.poll(); q.offer(1); q.offer(4); q.poll(); // ๋จผ์ ๋ค์ด์จ ์์๋ถํฐ ์ถ์ถ while (!q.isEmpty()) { System.out.print(q.poll() + " "); } } }
1๏ธโฃ ๋จ์ํ ํํ์ ์ฌ๊ท ํจ์ ์์
- '์ฌ๊ท ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.' ๋ผ๋ ๋ฌธ์์ด์ ๋ฌดํํ ์ถ๋ ฅ
def recursive function(): print('์ฌ๊ท ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.') recursive_function () recursive function()
- ์ด๋ ์ ๋ ์ถ๋ ฅํ๋ค๊ฐ ์ต๋ ์ฌ๊ท ๊น์ด ์ด๊ณผ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋๋ค.
2๏ธโฃ ํฉํ ๋ฆฌ์ผ๋ก ๊ตฌํํ ์ฌ๊ทํจ์ ์์
- n! = 1 x 2 x 3 x ... x (n-1) x n
- 0!๊ณผ 1!์ 1์ด๋ค
# ๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํํ n! def factorial_iterative(n): result = 1 # 1๋ถํฐ n๊น์ง์ ์๋ฅผ ์ฐจ๋ก๋๋ก ๊ณฑํ๊ธฐ for i in range (1, n + 1): result *= i return result # ์ฌ๊ท์ ์ผ๋ก ๊ตฌํํ n! def factorial_recursive(n): if n <= 1: # n์ด 1 ์ดํ์ธ ๊ฒฝ์ฐ 1์ ๋ฐํ return 1 # n! = n * (n - 1)!๋ฅผ ๊ทธ๋๋ก ์ฝ๋๋ก ์์ฑํ๊ธฐ return n * factorial_recursive(n - 1) # ๊ฐ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํํ n! ์ถ๋ ฅ(n = 5) print('๋ฐ๋ณต์ ์ผ๋ก ๊ตฌํ:', factorial_iterative(5)) print('์ฌ๊ท์ ์ผ๋ก ๊ตฌํ:', factorial_recursive(5))
3๏ธโฃ ์ต๋๊ณต์ฝ์ ๊ณ์ฐ(์ ํด๋ฆฌ๋ ํธ์ ๋ฒ) ์์
๋๊ฐ์ ์์ฐ์์ ๋ํ ์ต๋๊ณต์ฝ์๋ฅผ ๊ตฌํ๋ ๋ํ์ ์ธ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก
์ ํด๋ฆฌ๋ ํธ์ ๋ฒ
์ด ์๋ค.์ ํด๋ฆฌ๋ ํธ์ ๋ฒ
- ๋ ์์ฐ์ A, B์ ๋ํ์ฌ (A > B) A๋ฅผ B๋ก ๋๋ ๋๋จธ์ง๋ฅผ R์ด๋ผ๊ณ ํ์.
- ์ด๋ A์ B์ ์ต๋๊ณต์ฝ์๋ B์ R์ ์ต๋๊ณต์ฝ์์ ๊ฐ๋ค.
๐๐ป ์ ํด๋ฆฌ๋ ํธ์ ๋ฒ์ ์์ด๋์ด๋ฅผ ๊ทธ๋๋ก ์ฌ๊ท ํจ์๋ก ์์ฑํ ์ ์๋ค. ๋ฐ๋ผ์
์ต๋๊ณต์ฝ์
๋ 6์ด๋ค.
๐๐ป ์์ ๋ก์ง์ ์ฝ๋๋ก ๊ตฌํํ๋ฉด? ๐ ๊ผญ A > B ์๋์ด๋ ๋์ํ๋ค
def gcd(a, b): # a๊ฐ b์ ๋ฐฐ์๋ผ๋ฉด b ๋ฐํ if a % b == 0: return b # a๊ฐ b์ ๋ฐฐ์๊ฐ ์๋๋ผ๋ฉด b๊ฐ a๋ก ๊ฐ๊ณ # a % b๊ฐ b๋ก ๊ฐ๋ฉด์ ์ฌ๊ทํจ์ ํธ์ถ else: return gcd(b, a % b) print(gcd(192, 162))
์ข
๋ฃ ์กฐ๊ฑด์ ์ ๋๋ก ๋ช
์ํ์ง ์์ผ๋ฉด ํจ์๊ฐ ๋ฌดํํ ํธ์ถ
์ข ๋ฃ ์กฐ๊ฑด์ ํฌํจํ ์ฌ๊ท ํจ์ ์์
def recursive function(i): # 100๋ฒ์งธ ํธ์ถ์ ํ์ ๋ ์ข ๋ฃ๋๋๋ก ์ข ๋ฃ ์กฐ๊ฑด ๋ช ์ if 1 == 100: return print(i, '๋ฒ์งธ ์ฌ๊ทํจ์์์', i + 1, ' ๋ฒ์งธ ์ฌ๊ทํจ์๋ฅผ ํธ์ถํฉ๋๋ค.') recursive function(i + 1) print(i, '๋ฒ์งธ ์ฌ๊ทํจ์๋ฅผ ์ข ๋ฃํฉ๋๋ค.') recursive function(1)
๊ฒฐ๊ณผ : ์ ์ผ ์ฒ์ ํธ์ถํ ํจ์๊ฐ ์ ์ผ ๋ง์ง๋ง์ ํธ์ถ๋จ ๐๐ป ์คํ๊ณผ ๋น์ทํ๋ค!
์ฌ๊ท ํจ์๊ฐ ๋ฐ๋ณต๋ฌธ๋ณด๋ค ์ ๋ฆฌํ ๊ฒฝ์ฐ
๋ ์๊ณ ๋ถ๋ฆฌํ ๊ฒฝ์ฐ
๋ ์๋ค.
์ปดํจํฐ๊ฐ ํจ์๋ฅผ ์ฐ์์ ์ผ๋ก ํธ์ถํ๋ฉด ์ปดํจํฐ ๋ฉ๋ชจ๋ฆฌ ๋ด๋ถ์ ์คํ ํ๋ ์์ ์์ด๋ฏ๋ก ์คํ์ ์ฌ์ฉํด์ผ ํ ๋ ๊ตฌํ์ ์คํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋์ ์ ์ฌ๊ท ํจ์๋ฅผ ์ด์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค. ์ฌ๊ท ํจ์๋ฅผ ์ ํ์ฉํ๋ฉด ๋ณต์กํ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ๊ฒฐํ๊ฒ ์์ฑํ ์ ์์ง๋ง ์คํ๋ ค ๋ค๋ฅธ ์ฌ๋์ด ์ดํดํ๊ธฐ ์ด๋ ค์ด ํํ์ ์ฝ๋๊ฐ ๋ ์๋ ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ์ฌ์ฉํ๋ค.
๊น์ด ์ฐ์ ํ์
์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ ๊ทธ๋ํ์์ ๊น์ ๋ถ๋ถ
์ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.์คํ ์๋ฃ๊ตฌ์กฐ(or ์ฌ๊ท ํจ์)
๋ฅผ ์ด์ฉํ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.1. ํ์ ์์ ๋ ธ๋๋ฅผ ์คํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
2. ์คํ์ ์ต์๋จ ๋ ธ๋์ ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ํ ๋ ธ๋๊ฐ ํ๋๋ผ๋ ์์ผ๋ฉด ๊ทธ ๋ ธ๋๋ฅผ ์คํ์ ๋ฃ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ. ๋ฐฉ๋ฌธํ์ง ์์ ์ธ์ ๋ ธ๋๊ฐ ์์ผ๋ฉด ์คํ์์ ์ต์๋จ ๋ ธ๋๋ฅผ ๊บผ๋ธ๋ค.
3. ๋ ์ด์ 2๋ฒ์ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณต
๋ฒํธ๊ฐ ๋ฎ์ ์ธ์ ๋
ธ๋
๋ถํฐ๋ฌด๋ฐฉํฅ ๊ฐ์
๋ฐฉ๋ฌธ์ฒ๋ฆฌ
๋ฅผ ํ๋ค.๋ฐฉ๋ฌธ์ฒ๋ฆฌ
๋ฅผ ํ๋ค. ์ด์ ์คํ์ ์ต์๋จ ๋
ธ๋๋ 2๋ก ๋ณ๊ฒฝ๋์๋ค!๋ฐฉ๋ฌธ์ฒ๋ฆฌ
๋ฅผ ํ๋ค. ์ธ์ ๋
ธ๋ ์ค 7๋ณด๋ค ๋ฒํธ๊ฐ ๋ ๋ฎ์ 1์ด ์์ง๋ง, ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ผ๋ฏ๋ก PASS ๋ค์ ์คํ์ ์ต์๋จ ๋
ธ๋๋ 7๋ก ๋ณ๊ฒฝ๋์๋ค!๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
๋ฅผ ํ๋ค.๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
ํ๋ค.
python
# DFS ๋ฉ์๋ ์ ์ def dfs(graph, v, visited): # ํ์ฌ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ visited[v] = True print(v, end=' ") # ํ์ฌ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋ ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ for i in graph[v]: if not visited[i]: dfs(graph, i, visited) # ๊ฐ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ํํ (2์ฐจ์ ๋ฆฌ์คํธ) # ๊ฐ ๋ ธ๋๋ณ ์ธ์ ํ ๋ ธ๋๋ ๋ฌด์์ธ์ง graph = [ [], # ๋ ธ๋์ ๋ฒํธ๊ฐ 1๋ถํฐ ์์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ์ 0์ ๋น์๋ [2, 3, 8], # ๋ ธ๋ 1 [1, 7], # ๋ ธ๋ 2 [1, 4, 5], # ๋ ธ๋ 3 [3, 5], # ๋ ธ๋ 4 [3, 4], # ๋ ธ๋ 5 [7], # ๋ ธ๋ 6 [2, 6, 8], # ๋ ธ๋ 7 [1, 7] # ๋ ธ๋ 8 ] # ๊ฐ ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ํํ (1์ฐจ์ ๋ฆฌ์คํธ) visited = [False] * 9 # ์ธ๋ฑ์ค 0์ ์ฌ์ฉํ์ง ์๊ธฐ ์ํด 1 ๋ ํฌ๊ฒ ์์ฑ # ์ ์๋ DFS ํจ์ ํธ์ถ dfs(graph, 1, visited)
Java
import java.util.*; public class Main { public static boolean[] visited = new boolean[9]; public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>(); // DFS ํจ์ ์ ์ public static void dfs(int x) { // ํ์ฌ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ visited[x] = true; System.out.print(x + " "); // ํ์ฌ ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ๋ ธ๋๋ฅผ ์ฌ๊ท์ ์ผ๋ก ๋ฐฉ๋ฌธ for (int i = 0; i < graph.get(x).size(); i++) { int y = graph.get(x).get(i); if (!visited[y]) dfs(y); } } public static void main(String[] args) { // ๊ทธ๋ํ ์ด๊ธฐํ for (int i = 0; i < 9; i++) { graph.add(new ArrayList<Integer>()); } // ๋ ธ๋ 1์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(1).add(2); graph.get(1).add(3); graph.get(1).add(8); // ๋ ธ๋ 2์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(2).add(1); graph.get(2).add(7); // ๋ ธ๋ 3์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(3).add(1); graph.get(3).add(4); graph.get(3).add(5); // ๋ ธ๋ 4์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(4).add(3); graph.get(4).add(5); // ๋ ธ๋ 5์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(5).add(3); graph.get(5).add(4); // ๋ ธ๋ 6์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(6).add(7); // ๋ ธ๋ 7์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(7).add(2); graph.get(7).add(6); graph.get(7).add(8); // ๋ ธ๋ 8์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(8).add(1); graph.get(8).add(7); dfs(1); } }
๋๋น ์ฐ์ ํ์
์ด๋ผ๊ณ ๋ ๋ถ๋ฅด๋ฉฐ, ๊ทธ๋ํ์์ ๊ฐ๊น์ด ๋
ธ๋
๋ถํฐ ์ฐ์ ์ ์ผ๋ก ํ์ํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.์ต๋จ๊ฒฝ๋ก
์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ก ๋ง์ด ์ถ์ ํ ์๋ฃ๊ตฌ์กฐ
๋ฅผ ์ด์ฉํ๋ฉฐ, ๊ตฌ์ฒด์ ์ธ ๋์ ๊ณผ์ ์ ์๋์ ๊ฐ๋ค.1. ํ์ ์์ ๋ ธ๋๋ฅผ ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
2. ํ์์ ๋ ธ๋๋ฅผ ๊บผ๋ธ ๋ค์ ํด๋น ๋ ธ๋์ ์ธ์ ๋ ธ๋ ์ค์์ ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋๋ฅผ
๋ชจ๋
ํ์ ์ฝ์ ํ๊ณ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ3. ๋ ์ด์ 2๋ฒ์ ๊ณผ์ ์ ์ํํ ์ ์์ ๋๊น์ง ๋ฐ๋ณต
๋ฒํธ๊ฐ ๋ฎ์ ์ธ์ ๋
ธ๋
๋ถํฐ๋ฌด๋ฐฉํฅ ๊ฐ์
๋ฐฉ๋ฌธ์ฒ๋ฆฌ
๋ฅผ ํ๋ค.๋ฐฉ๋ฌธ์ฒ๋ฆฌ
๋ฅผ ํ๋ค. ์ด๋, ํ์ ๋ฃ๋ ์์๋ ๋ฐฉ๋ฌธํ ์์๋๋ก์ด๋ฏ๋ก ๋ฒํธ๊ฐ ๋ฎ์ ์ธ์ ๋
ธ๋
๋ถํฐ์ด๋ค.๋ฐฉ๋ฌธ์ฒ๋ฆฌ
๋ฅผ ํ๋ค.๋ฐฉ๋ฌธ์ฒ๋ฆฌ
๋ฅผ ํ๋ค.1
ย ย 7, 4, 5์ ๊ฑฐ๋ฆฌ๋ 2
ย ย 6์ ๊ฑฐ๋ฆฌ๋ 3
์ด๋ค.
python
from collections import deque # BFS ํจ์ ์ ์ def bfs(graph, start, visited): # ํ(Queue) ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ queue = deque([start]) # ํ์ฌ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ visited[start] = True # ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต while queue: # ํ์์ ํ๋์ ์์๋ฅผ ๋ฝ์ ์ถ๋ ฅ v = queue.popleft() print(v, end=' ') # ํด๋น ์์์ ์ฐ๊ฒฐ๋, ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์์๋ค์ ํ์ ์ฝ์ for i in graph[v]: if not visited[i]: queue.append(i) visited[i] = True # ๊ฐ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์คํธ ์๋ฃํ์ผ๋ก ํํ(2์ฐจ์ ๋ฆฌ์คํธ) # ๊ฐ ๋ ธ๋๋ณ ์ธ์ ํ ๋ ธ๋๋ ๋ฌด์์ธ์ง graph = [ [], # ๋ ธ๋์ ๋ฒํธ๊ฐ 1๋ถํฐ ์์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๊ธฐ์ 0์ ๋น์๋ [2, 3, 8], # ๋ ธ๋ 1 [1, 7], # ๋ ธ๋ 2 [1, 4, 5], # ๋ ธ๋ 3 [3, 5], # ๋ ธ๋ 4 [3, 4], # ๋ ธ๋ 5 [7], # ๋ ธ๋ 6 [2, 6, 8], # ๋ ธ๋ 7 [1, 7] # ๋ ธ๋ 8 ] # ๊ฐ ๋ ธ๋๊ฐ ๋ฐฉ๋ฌธ๋ ์ ๋ณด๋ฅผ ํํ (1์ฐจ์ ๋ฆฌ์คํธ) visited = [False] * 9 # ์ธ๋ฑ์ค 0์ ์ฌ์ฉํ์ง ์๊ธฐ ์ํด 1 ๋ ํฌ๊ฒ ์์ฑ # ์ ์๋ BFS ํจ์ ํธ์ถ bfs(graph, 1, visited)
Java
import java.util.*; public class Main { public static boolean[] visited = new boolean[9]; public static ArrayList<ArrayList<Integer>> graph = new ArrayList<ArrayList<Integer>>(); // BFS ํจ์ ์ ์ public static void bfs(int start) { Queue<Integer> q = new LinkedList<>(); q.offer(start); // ํ์ฌ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ visited[start] = true; // ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณต while(!q.isEmpty()) { // ํ์์ ํ๋์ ์์๋ฅผ ๋ฝ์ ์ถ๋ ฅ int x = q.poll(); System.out.print(x + " "); // ํด๋น ์์์ ์ฐ๊ฒฐ๋, ์์ง ๋ฐฉ๋ฌธํ์ง ์์ ์์๋ค์ ํ์ ์ฝ์ for(int i = 0; i < graph.get(x).size(); i++) { int y = graph.get(x).get(i); if(!visited[y]) { q.offer(y); visited[y] = true; } } } } public static void main(String[] args) { // ๊ทธ๋ํ ์ด๊ธฐํ for (int i = 0; i < 9; i++) { graph.add(new ArrayList<Integer>()); } // ๋ ธ๋ 1์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(1).add(2); graph.get(1).add(3); graph.get(1).add(8); // ๋ ธ๋ 2์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(2).add(1); graph.get(2).add(7); // ๋ ธ๋ 3์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(3).add(1); graph.get(3).add(4); graph.get(3).add(5); // ๋ ธ๋ 4์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(4).add(3); graph.get(4).add(5); // ๋ ธ๋ 5์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(5).add(3); graph.get(5).add(4); // ๋ ธ๋ 6์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(6).add(7); // ๋ ธ๋ 7์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(7).add(2); graph.get(7).add(6); graph.get(7).add(8); // ๋ ธ๋ 8์ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ ๋ณด ์ ์ฅ graph.get(8).add(1); graph.get(8).add(7); bfs(1); } }
python
# N, M์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ ฅ ๋ฐ๊ธฐ n, m = map(int, input().split()) # 2์ฐจ์ ๋ฆฌ์คํธ์ ๋งต ์ ๋ณด ์ ๋ ฅ ๋ฐ๊ธฐ graph = [] for i in range(n): graph.append(list(map(int, input()))) # DFS๋ก ํน์ ํ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ ๋ค์ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ ธ๋๋ค๋ ๋ฐฉ๋ฌธ def dfs(x, y): # ์ฃผ์ด์ง ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์๋ ์ฆ์ ์ข ๋ฃ if x <= -1 or x >= n or y <= -1 or y >= m: return False # ํ์ฌ ๋ ธ๋๋ฅผ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด if graph[x][y] == 0: # ํด๋น ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ graph[x][y] = 1 # ์, ํ, ์ข, ์ฐ์ ์์น๋ค๋ ๋ชจ๋ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ dfs(x - 1, y) dfs(x, y - 1) dfs(x + 1, y) dfs(x, y + 1) return True return False # ๋ชจ๋ ๋ ธ๋(์์น)์ ๋ํ์ฌ ์๋ฃ์ ์ฑ์ฐ๊ธฐ result = 0 for i in range(n): for j in range(m): # ํ์ฌ ์์น์์ DFS ์ํ if dfs(i, j) == True: result += 1 print(result) # ์ ๋ต ์ถ๋ ฅ
Java
import java.util.*; public class Main { public static int n, m; public static int[][] graph = new int[1000][1000]; // DFS๋ก ํน์ ๋ ธ๋๋ฅผ ๋ฐฉ๋ฌธํ๊ณ ์ฐ๊ฒฐ๋ ๋ชจ๋ ๋ ธ๋๋ค๋ ๋ฐฉ๋ฌธ public static boolean dfs(int x, int y) { // ์ฃผ์ด์ง ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ์๋ ์ฆ์ ์ข ๋ฃ if (x <= -1 || x >=n || y <= -1 || y >= m) { return false; } // ํ์ฌ ๋ ธ๋๋ฅผ ์์ง ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด if (graph[x][y] == 0) { // ํด๋น ๋ ธ๋ ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ graph[x][y] = 1; // ์, ํ, ์ข, ์ฐ์ ์์น๋ค๋ ๋ชจ๋ ์ฌ๊ท์ ์ผ๋ก ํธ์ถ dfs(x - 1, y); dfs(x, y - 1); dfs(x + 1, y); dfs(x, y + 1); return true; } return false; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); // N, M์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ ฅ ๋ฐ๊ธฐ n = sc.nextInt(); m = sc.nextInt(); sc.nextLine(); // ๋ฒํผ ์ง์ฐ๊ธฐ // 2์ฐจ์ ๋ฆฌ์คํธ์ ๋งต ์ ๋ณด ์ ๋ ฅ ๋ฐ๊ธฐ for (int i = 0; i < n; i++) { String str = sc.nextLine(); for (int j = 0; j < m; j++) { graph[i][j] = str.charAt(j) - '0'; } } // ๋ชจ๋ ๋ ธ๋(์์น)์ ๋ํ์ฌ ์๋ฃ์ ์ฑ์ฐ๊ธฐ int result = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < m; j++) { // ํ์ฌ ์์น์์ DFS ์ํ if (dfs(i, j)) { result += 1; } } } System.out.println(result); // ์ ๋ต ์ถ๋ ฅ } }
python
from collections import deque # N, M์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ ฅ ๋ฐ๊ธฐ n, m = map(int, input().split()) # 2์ฐจ์ ๋ฆฌ์คํธ์ ๋งต ์ ๋ณด ์ ๋ ฅ ๋ฐ๊ธฐ graph = [] for i in range(n): graph.append(list(map(int, input()))) # ์ด๋ํ ๋ค ๊ฐ์ง ๋ฐฉํฅ ์ ์ (์, ํ, ์ข, ์ฐ) dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] # BFS ์์ค์ฝ๋ ๊ตฌํ def bfs(x, y): # ํ(Queue) ๊ตฌํ์ ์ํด deque ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ queue = deque() queue.append((x, y)) # ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๊ธฐ while queue: x, y = queue.popleft() # ํ์ฌ ์์น์์ 4๊ฐ์ง ๋ฐฉํฅ์ผ๋ก์ ์์น ํ์ธ for i in range(4): nx = x + dx[i] ny = y + dy[i] # ๋ฏธ๋ก ์ฐพ๊ธฐ ๊ณต๊ฐ์ ๋ฒ์ด๋ ๊ฒฝ์ฐ ๋ฌด์ if nx < 0 or nx >= n or ny < 0 or ny >= m: continue # ๋ฒฝ์ธ ๊ฒฝ์ฐ ๋ฌด์ if graph[nx][ny] == 0: continue # ํด๋น ๋ ธ๋๋ฅผ ์ฒ์ ๋ฐฉ๋ฌธํ๋ ๊ฒฝ์ฐ์๋ง ์ต๋จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก if graph[nx][ny] == 1: graph[nx][ny] = graph[x][y] + 1 queue.append((nx, ny)) # ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐํ return graph[n - 1][m - 1] # BFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ ์ถ๋ ฅ print(bfs(0, 0))
Java
import java.util.*; class Node { private int x; private int y; public Node(int x, int y) { this.x = x; this.y = y; } public int getX() { return this.x; } public int getY() { return this.y; } } public class Main { public static int n, m; public static int[][] graph = new int[201][201]; // ์ด๋ํ ๋ค ๊ฐ์ง ๋ฐฉํฅ ์ ์ (์, ํ, ์ข, ์ฐ) public static int dx[] = {-1, 1, 0, 0}; public static int dy[] = {0, 0, -1, 1}; public static int bfs(int x, int y) { // ํ(Queue) ๊ตฌํ์ ์ํด queue ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ Queue<Node> q = new LinkedList<>(); q.offer(new Node(x, y)); // ํ๊ฐ ๋น ๋๊น์ง ๋ฐ๋ณตํ๊ธฐ while(!q.isEmpty()) { Node node = q.poll(); x = node.getX(); y = node.getY(); // ํ์ฌ ์์น์์ 4๊ฐ์ง ๋ฐฉํฅ์ผ๋ก์ ์์น ํ์ธ for (int i = 0; i < 4; i++) { int nx = x + dx[i]; int ny = y + dy[i]; // ๋ฏธ๋ก ์ฐพ๊ธฐ ๊ณต๊ฐ์ ๋ฒ์ด๋ ๊ฒฝ์ฐ ๋ฌด์ if (nx < 0 || nx >= n || ny < 0 || ny >= m) continue; // ๋ฒฝ์ธ ๊ฒฝ์ฐ ๋ฌด์ if (graph[nx][ny] == 0) continue; // ํด๋น ๋ ธ๋๋ฅผ ์ฒ์ ๋ฐฉ๋ฌธํ๋ ๊ฒฝ์ฐ์๋ง ์ต๋จ ๊ฑฐ๋ฆฌ ๊ธฐ๋ก if (graph[nx][ny] == 1) { graph[nx][ny] = graph[x][y] + 1; q.offer(new Node(nx, ny)); } } } // ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐํ return graph[n - 1][m - 1]; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); // N, M์ ๊ณต๋ฐฑ์ ๊ธฐ์ค์ผ๋ก ๊ตฌ๋ถํ์ฌ ์ ๋ ฅ ๋ฐ๊ธฐ n = sc.nextInt(); m = sc.nextInt(); sc.nextLine(); // ๋ฒํผ ์ง์ฐ๊ธฐ // 2์ฐจ์ ๋ฆฌ์คํธ์ ๋งต ์ ๋ณด ์ ๋ ฅ ๋ฐ๊ธฐ for (int i = 0; i < n; i++) { String str = sc.nextLine(); for (int j = 0; j < m; j++) { graph[i][j] = str.charAt(j) - '0'; } } // BFS๋ฅผ ์ํํ ๊ฒฐ๊ณผ ์ถ๋ ฅ System.out.println(bfs(0, 0)); } }