알고리즘
-
알고스팟 : 게임판 덮기 (완전탐색, 경우의 수)알고리즘 2022. 7. 3. 16:22
이 문제는 경우의 수를 모두 구하는 문제로 완전탐색을 이용한다. 여기서 주의할 점은 중복되는 경우의 수를 제외하기 위해서 맨 위쪽 부터 탐색하여 채워지지 않은 부분을 찾아내는 것이다. 제일 먼저 coverType을 만드는데 [dy][dx]타입으로 세 점을 작성하였으며 나중에 적용할 때는 행, 열의 순서에 맞춰 board[y + dy][x + dx]를 적용해야 하는 점에 유의하자. c = int(input()) coverType = [ [[0,0], [0,1], [1, 0]], [[0,0], [0, 1], [1, 1]], [[0,0], [1, 0], [1,1]], [[0,0], [1,0], [1,-1]] ] def isCoverable(x, y, type, board): for dy, dx in type:..
-
알고스팟 : 소풍 (완전탐색, 조합)알고리즘 2022. 7. 3. 14:02
탐색가능한 모든 조합의 수를 계산 하는 문제로 완전탐색 을 이용해서 문제를 해결할 수 있었다. 여기서 중요한 것은 중복으로 계산되는 것을 제외하여야 한다는 것이다. 즉 (1,0)과 (0, 1)은 서로 같은 사람끼리 짝을 이루었으므로 같은 경우라고 인지하여야 한다. 이 부분을 해결하기 위해서 숫자 순서대로 먼저 오는 답 하나만 계산할 도록 first 인자를 이용해서 선택되지 않은 학생중에서 가장 번호가 빠른 학생의 짝을 찾도록 하였다. c = int(input()) def countPair(): cnt = 0 first = -1 for i in range(n): if not visited[i]: first = i break if first == -1 : return 1 for i in range(first..
-
백준 1956번)브루트포스- 분해합알고리즘/백준 2021. 8. 16. 11:06
https://www.acmicpc.net/problem/2231 2231번: 분해합 어떤 자연수 N이 있을 때, 그 자연수 N의 분해합은 N과 N을 이루는 각 자리수의 합을 의미한다. 어떤 자연수 M의 분해합이 N인 경우, M을 N의 생성자라 한다. 예를 들어, 245의 분해합은 256(=245+2+4+5)이 www.acmicpc.net 자연수 n이 주어질때, n =m+ m각자릿수의 합이 이루어질 때, m 은 n의 생성자, n은 m의 분해합이다. 생성자를 구하는 문제였다. 가장 작은 생성자를 구하는 문제로, 1부터 n까지 실행해서 가장 작은 생성자가 나오면 Break하도록 하였다. 각자릿수의 합을 구할때, while문의 /100...의 형식이 아닌 list sum을 이용하자! n = int(input(..
-
알고리즘 - 7) 다익스트라알고리즘 2021. 5. 6. 07:24
1. 다익스트라 알고리즘(한 지점에서 시작해서 모든 노드로의 최단거리 구하기) - 양방향 import heapq import sys input = sys.stdin.readline INF = int(1e9) n, m = map(int, input().split()) graph= [] for _ in range(m): a, b = map(int, input().split()) graph[a].append((b,1)) graph[b].append((a, 1)) distance = [INF]*(n+1) def dijkstra(start){ start = 0 distance[start] = 0 q = [] heapq.heappush(q, (distance[start], start)) while q: dist, ..
-
알고리즘 -3) DFS/ BFS알고리즘 2021. 5. 5. 19:34
1. DFS(stack사용) function dfs (graph, startNode){ let visited = []; let stack = [start]; while(stack.length!==0){ let n = stack.pop(); if (!visited.includes(n)){ visited.push(n); let sub = graph[n].filter(x=>!visited.includes(x)) for (let i of sub){ stack.push(i); } } } return visited; } 2. BFS(queue사용) function bfs (graph, startNode){ let queue = []; let visited = []; queue.push(startNode); whil..
-
백준 1956번) 최단경로 - 운동알고리즘/백준 2021. 1. 29. 21:05
최단경로 찾기 문제에서 간선에 음수가 있다면 벨만 포드, 양수만 존재한다면 다익스트라, 양수중에서도 특정 구역을 거쳐서 지나간다면 플로이드 워셜 방법을 쓰도록 한다. 이 문제는 같은곳에서 출발하여 같은 곳으로 돌아온다는 것을 유의한다. #include #include #include #include #define INF 1e9 using namespace std; int n, m; int graph[401][401]; int main() { cin >> n >> m; for (int i = 0; i > a ..
-
백준 1904번) 동적계획법 1 - 01.타일알고리즘/백준 2021. 1. 29. 21:03
이코테에 있던 문제와 매우 유사한 문제. #include #include #include #include #define INF 1e9 using namespace std; int d[1000001]; int n; int main() { cin >> n; d[0] = 0; d[1] = 1; d[2] = 2; d[3] = 3; for (int i = 4; i < n + 1; i++) { d[i] = (d[i - 2] * 2 + d[i - 3]) % 15746; } cout
-
이것이 코딩테스트다 - 10) 그래프알고리즘 2021. 1. 27. 22:02
8,9,10 단원은 백준, 프로그래머스 달린다고 생각하고 복습 제대로 해야한다. 엉망진창 와진창이다. 10.1) 팀 결성 #include #include #include #include #define INF 1e9 using namespace std; int n, m; int parent[100000]; int find_parent(int parent[100000], int x) { if (parent[x] != x) { parent[x] = find_parent(parent, parent[x]); } return parent[x]; } void union_parent(int parent[100000], int a, int b) { a = find_parent(parent, a); b = find_par..