알고리즘
-
💡문제 💁🏻♀️How to Solve 처음에 풀었던 방법은 시간초과가 났다.. 시간복잡도를 다시 생각해보니 내가 짠 로직은 O(n^2)가 발생하여 시간초과가 난다. import java.io.BufferedReader import java.io.InputStreamReader import java.util.Stack fun main() = with(BufferedReader(InputStreamReader(System.`in`))){ val input = readLine().toInt() val st = readLine().split(" ") val stack = Stack() val sb = StringBuffer() for (i in st){ stack.add(i.toInt()) } repeat(i..
[백준 문제풀기] #2493번 - 탑 with Kotlin💡문제 💁🏻♀️How to Solve 처음에 풀었던 방법은 시간초과가 났다.. 시간복잡도를 다시 생각해보니 내가 짠 로직은 O(n^2)가 발생하여 시간초과가 난다. import java.io.BufferedReader import java.io.InputStreamReader import java.util.Stack fun main() = with(BufferedReader(InputStreamReader(System.`in`))){ val input = readLine().toInt() val st = readLine().split(" ") val stack = Stack() val sb = StringBuffer() for (i in st){ stack.add(i.toInt()) } repeat(i..
2023.10.13 -
💡문제 설명 🙆🏻♀️ How I solve 33 -> 33 + 3 + 3 = 39 -> 33은 39의 생성자 1 -> 1 + 0 + 1 = 2 -> 1은 2의 생성자 1,3,5...을 만들어주는 숫자는 없다 -> 셀프넘버 1에서부터 시작하여 01 + 0 + 1 = 2, 02 + 0 +2 =4 이런식으로 생성자의 값을 하나씩 늘려가면서 생성자가 있는 숫자들을 찾을 수 있다. 내가 생각한 방법은 배열에 1부터 10000까지의 숫자를 넣고, 생성자를 하나씩 늘려가면서 생성자가 있는 숫자들을 리스트에서 제거하는 것이였다. result = [] for i in range(10000): result.append(i) # a가 9972이면 9999 for i in range(9973): sum = 0 if i < ..
[백준 알고리즘] #4673번 - 셀프넘버 with Python💡문제 설명 🙆🏻♀️ How I solve 33 -> 33 + 3 + 3 = 39 -> 33은 39의 생성자 1 -> 1 + 0 + 1 = 2 -> 1은 2의 생성자 1,3,5...을 만들어주는 숫자는 없다 -> 셀프넘버 1에서부터 시작하여 01 + 0 + 1 = 2, 02 + 0 +2 =4 이런식으로 생성자의 값을 하나씩 늘려가면서 생성자가 있는 숫자들을 찾을 수 있다. 내가 생각한 방법은 배열에 1부터 10000까지의 숫자를 넣고, 생성자를 하나씩 늘려가면서 생성자가 있는 숫자들을 리스트에서 제거하는 것이였다. result = [] for i in range(10000): result.append(i) # a가 9972이면 9999 for i in range(9973): sum = 0 if i < ..
2023.06.11 -
🙆🏻♀️ How to solve 다이나믹 프로그래밍 문제이다. 길이가 1인 계단 수 = 1,2,3,4,5,6,7,8,9 9개 길이가 2인 계단 수 = 10, 21,(12,32),(23,43),(34, 54), (45, 65), (56,76), (67,87), (78,98) , 89 17개 길이가 3인 계단 수 = 210, (321, 121), (212,312,232,432), (123, 323, 343, 543) .... 문제를 풀 때 일의 자리수에 올 수 있는 숫자는 0~9까지이다. 가장 뒤에 오는 숫자 = 0 dp[자릿수][0] = dp[자릿수 - 1][1] 가장 뒤에 오는 숫자 = 1~8 dp[자릿수][가장 뒤에 오는 숫자] = dp[자릿수 - 1][가장 뒤에 오는 숫자 - 1] + dp[자릿수 ..
[백준 문제풀기] #10844번 - 쉬운 계단 수 with Python🙆🏻♀️ How to solve 다이나믹 프로그래밍 문제이다. 길이가 1인 계단 수 = 1,2,3,4,5,6,7,8,9 9개 길이가 2인 계단 수 = 10, 21,(12,32),(23,43),(34, 54), (45, 65), (56,76), (67,87), (78,98) , 89 17개 길이가 3인 계단 수 = 210, (321, 121), (212,312,232,432), (123, 323, 343, 543) .... 문제를 풀 때 일의 자리수에 올 수 있는 숫자는 0~9까지이다. 가장 뒤에 오는 숫자 = 0 dp[자릿수][0] = dp[자릿수 - 1][1] 가장 뒤에 오는 숫자 = 1~8 dp[자릿수][가장 뒤에 오는 숫자] = dp[자릿수 - 1][가장 뒤에 오는 숫자 - 1] + dp[자릿수 ..
2023.06.06 -
💁🏻♀️ How do I thought dfs나 bfs로 풀어야할 것 같다는 느낌은 직감적으로 들었다. 하지만 각 x,y를 입력받아 2차원 배열에 양방향으로 넣어서 풀어야한다는 생각까지밖에 그치지 않았다. 🙆🏻♀️ How to solve Dfs 방식으로 구현하였다. 촌수를 계산해야하는 서로 다른 번호를 c,d라고 한다. 먼저 graph에 부모 자식관계를 양방향으로 넣어주고, 자식(c)에서 부모 노드(d)로 가는 방법으로 재귀탐색을 해준다. dfs를 재귀적으로 탐색하여 재귀 깊이가 깊어질때마다 num의 값을 +1씩 해주고, 현재 노드의 번호가 부모노드의 번호와 같아질 때 num 값을 출력해준다. 💻 Code import sys from collections import deque n = int(sys...
[백준 문제풀기] #2644번 - 촌수계산 문제 with Python💁🏻♀️ How do I thought dfs나 bfs로 풀어야할 것 같다는 느낌은 직감적으로 들었다. 하지만 각 x,y를 입력받아 2차원 배열에 양방향으로 넣어서 풀어야한다는 생각까지밖에 그치지 않았다. 🙆🏻♀️ How to solve Dfs 방식으로 구현하였다. 촌수를 계산해야하는 서로 다른 번호를 c,d라고 한다. 먼저 graph에 부모 자식관계를 양방향으로 넣어주고, 자식(c)에서 부모 노드(d)로 가는 방법으로 재귀탐색을 해준다. dfs를 재귀적으로 탐색하여 재귀 깊이가 깊어질때마다 num의 값을 +1씩 해주고, 현재 노드의 번호가 부모노드의 번호와 같아질 때 num 값을 출력해준다. 💻 Code import sys from collections import deque n = int(sys...
2023.06.03 -
이 문제는 bfs를 활용하여 풀었다. 👩🏻💻 코드 구현 from collections import deque m, n = map(int, input().split()) graph = [list(map(int, input().split())) for _ in range(n)] queue = deque([]) dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] day = 0 for i in range(n): for j in range(m): if graph[i][j] == 1: queue.append([i, j]) def bfs(): while queue: x, y = queue.popleft() for i in range(4): nx, ny = dx[i] + x, dy[i] + y if 0
[백준 문제풀기] #7576번 - 토마토 with Python이 문제는 bfs를 활용하여 풀었다. 👩🏻💻 코드 구현 from collections import deque m, n = map(int, input().split()) graph = [list(map(int, input().split())) for _ in range(n)] queue = deque([]) dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] day = 0 for i in range(n): for j in range(m): if graph[i][j] == 1: queue.append([i, j]) def bfs(): while queue: x, y = queue.popleft() for i in range(4): nx, ny = dx[i] + x, dy[i] + y if 0
2023.05.23 -
💡 다익스트라 알고리즘 그래프에서 특정 노드에서 출발하여 다른 모든 노드로 가는 각각의 최단 경로를 구해주는 문제 매번 최단 경로의 정점을 선택하여 탐색 반복 🌱 다익스트라 알고리즘 특징 도착노드는 해당 노드를 거쳐 다른 노드로 가는 길을 찾을 필요가 없다. 다익스트라 알고리즘은 가중치가 양수일 때만 사용 가능하다. ☝ 동작 단계 1. 출발노드와 동작노드 설정해주고 최단 거리 테이블을 초기화해준다. 2. 현재 위치에서의 인접한 노드들 중에서 방문하지 않은 노드 중 거리가 가장 짧은 노드를 선택한 뒤, 방문 처리 해준다. 3. 해당 노드에서 다른 노드로 넘어가는 간선 비용(가중치)를 계산하여 최단 거리 테이블을 업데이트 해준다. 4. 3~4번 과정 반복 - 최단 거리 테이블 : 1차원 배열로 N개 노드까지..
[알고리즘] 다익스트라(dijkjstra) 알고리즘이란? with Python💡 다익스트라 알고리즘 그래프에서 특정 노드에서 출발하여 다른 모든 노드로 가는 각각의 최단 경로를 구해주는 문제 매번 최단 경로의 정점을 선택하여 탐색 반복 🌱 다익스트라 알고리즘 특징 도착노드는 해당 노드를 거쳐 다른 노드로 가는 길을 찾을 필요가 없다. 다익스트라 알고리즘은 가중치가 양수일 때만 사용 가능하다. ☝ 동작 단계 1. 출발노드와 동작노드 설정해주고 최단 거리 테이블을 초기화해준다. 2. 현재 위치에서의 인접한 노드들 중에서 방문하지 않은 노드 중 거리가 가장 짧은 노드를 선택한 뒤, 방문 처리 해준다. 3. 해당 노드에서 다른 노드로 넘어가는 간선 비용(가중치)를 계산하여 최단 거리 테이블을 업데이트 해준다. 4. 3~4번 과정 반복 - 최단 거리 테이블 : 1차원 배열로 N개 노드까지..
2023.05.22 -
https://www.acmicpc.net/problem/5639 5639번: 이진 검색 트리 트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다 www.acmicpc.net ⚠️ 문제 ✍ 풀이 전위 순회순으로 입력된다. ( 루트 노드 -> 왼쪽 자식노드 -> 오른쪽 자식 노드 ) 전위 순회는 첫 번째 입력되는 값은 항상 최상단의 루트 노드일 것이다. 그 후 두번째 값부턴 최상단 루트 노드를 기준으로 왼쪽 자식 노드일 것이다. 이때 문제에서 주어진 이진 트리는 왼쪽 서브 트리가 루트 노드보다 작고, 오른쪽 서브 트리는 루트 노드보다 크다는 것이다. 즉, 최..
백준 문제풀기 [#5639번] - 이진 검색 트리 with Pythonhttps://www.acmicpc.net/problem/5639 5639번: 이진 검색 트리 트리를 전위 순회한 결과가 주어진다. 노드에 들어있는 키의 값은 106보다 작은 양의 정수이다. 모든 값은 한 줄에 하나씩 주어지며, 노드의 수는 10,000개 이하이다. 같은 키를 가지는 노드는 없다 www.acmicpc.net ⚠️ 문제 ✍ 풀이 전위 순회순으로 입력된다. ( 루트 노드 -> 왼쪽 자식노드 -> 오른쪽 자식 노드 ) 전위 순회는 첫 번째 입력되는 값은 항상 최상단의 루트 노드일 것이다. 그 후 두번째 값부턴 최상단 루트 노드를 기준으로 왼쪽 자식 노드일 것이다. 이때 문제에서 주어진 이진 트리는 왼쪽 서브 트리가 루트 노드보다 작고, 오른쪽 서브 트리는 루트 노드보다 크다는 것이다. 즉, 최..
2023.05.17 -
이 문제는 그리디 알고리즘을 이용하여 푸는 문제이다. 그리디 알고리즘 👇 [알고리즘] 그리디 알고리즘이란?(Greedy Algorithms) 💡그리디 알고리즘(Greedy Algorithm) 그리디 알고리즘이란 탐욕적인 알고리즘이라고도 하며, 선택의 순간마다 당장 눈앞에 보이는 최적인 상황만을 쫓아 최종적인 해답에 도달하는 방법 - 문제를 dvlpseo.tistory.com 그리디 알고리즘이란 선택의 순간마다 당장 눈앞에 보이는 최적인 상황만을 쫓아 최종적인 해답에 도달하는 방법이다. 회의실이 가장 많이 이용되려면 현재 사용하고 있는 회의의 종료시간이 빨라야한다. 그리고 한가지 더 고려해야 할 점은 만약 종료시간이 같은 경우이다. 예를 들어 [시작 시간, 끝나는시간] 이 [2,2] [1,2]가 있는 경우..
[백준 문제풀기 with Python] #1931번 - 회의실 배정이 문제는 그리디 알고리즘을 이용하여 푸는 문제이다. 그리디 알고리즘 👇 [알고리즘] 그리디 알고리즘이란?(Greedy Algorithms) 💡그리디 알고리즘(Greedy Algorithm) 그리디 알고리즘이란 탐욕적인 알고리즘이라고도 하며, 선택의 순간마다 당장 눈앞에 보이는 최적인 상황만을 쫓아 최종적인 해답에 도달하는 방법 - 문제를 dvlpseo.tistory.com 그리디 알고리즘이란 선택의 순간마다 당장 눈앞에 보이는 최적인 상황만을 쫓아 최종적인 해답에 도달하는 방법이다. 회의실이 가장 많이 이용되려면 현재 사용하고 있는 회의의 종료시간이 빨라야한다. 그리고 한가지 더 고려해야 할 점은 만약 종료시간이 같은 경우이다. 예를 들어 [시작 시간, 끝나는시간] 이 [2,2] [1,2]가 있는 경우..
2023.05.11