[백준] 1379 강의실 2 [Python]
·
알고리즘/백준
이 문제의 분류는 그리디 알고리즘과 우선순위 큐를 활용해서 푸는 문제입니다. 그리디 알고리즘만 사용하고 우선순위 큐를 사용하지 않는다면 시간초과가 나서 우선순위 큐를 사용하는 방법으로 구현해봤습니다. k = int(s.readline()) #우선 순위 큐 저장 배열선언 heap =[] #출력값들을 저장할 배열선언 answer= [0] * (k+1) lecture = [list(map(int,s.readline().split())) for _ in range(k)] #강의를 시작시간과 끝나는시간 기준으로 정렬 lecture.sort(key=lambda x:(x[1],x[2])) 강의를 시작시간과 끝나는시간으로 정렬하고 heap에 넣어야 새로운 강의를 넣을 때 마다 비교가 가능하므로 정렬해준다. #1은 강의..
[백준] 1520 내리막길 [Python]
·
알고리즘/백준
이 문제는 얼핏하면 dfs, bfs처럼 보여서 나도 처음에는 dfs로만 구현을 했었다. 하지만 dfs로 구현하면 값이 커질수록 반복되는 구간이 증가하기때문에 당연히 시간초과가 났었고 이를 고치기 위해 dp를 이용한 방법을 추가시켰다. 처음에는 dp를 어떻게 적용해야하는지가 감이 안와서 주변 친구들에게 도움을 받아서 이해를 하게 되었다. 이 문제를 시작점에서부터 도착점으로 가는 경로의 수를 구하는 문제에서, 임의의 점(x, y)에서 도착점 까지의 경우로 세분화 하여 구한다면, 그 어떤 경로로 (x, y)에 도착 하기만 해도 그 때부터의 경우의 수는 다시 구할 필요가 없다. 이 관점으로 코드를 구현해보자. 우선 처음에 dfs만 구현해서 시간초과가 난 코드이다. from sys import stdin as s..
[백준] 11660 구간 합 구하기 5 [Python]
·
알고리즘/백준
저는 위의 문제를 다이내믹 프로그래밍을 활용해서 풀어봤습니다. 주어진 N의 크기와 M이 커질수록 시간이 급속도로 증가하기 때문에 dp로 값을 저장해 주고 필요한 연산만 걸쳐서 원하는 값을 출력하는 것이 시간에 걸리지 않기 때문에 dp를 활용했습니다. 우선 배열의 크기 N과 합의 횟수 M 을 입력받습니다. #입력 값 n = 배열의 크기 n*n , m = 합을 구해야하는 횟수 n,m = map(int,s.readline().split()) arr=[list(map(int,s.readline().split())) for _ in range(n)] #dp를 [1][1]시작하기위해 n+1로설정 dp=[[0]*(n+1) for _ in range(n+1)] dp는 알아보기쉽게하기위해 1,1부터 시작하려고 범위를 n..
[알고리즘] 그리디 알고리즘
·
알고리즘/개념
💡그리디 알고리즘이란? 그리디 알고리즘은 현재 상황에서 지금 당장 좋은 것만 고르는 방법을 의미합니다. 일반적인 그리디 알고리즘은 문제를 풀기 위한 최소한의 아이디어를 떠올릴 수 있는 능력을 요구합니다. 그리디 해법은 단순히 가장 좋아 보이는 것을 반복적으로 선택해도 최적의 해를 구할 수 있는지를 검토합니다. 그리디 알고리즘 예시 문제 - 문제 : 카운터에는 거스름돈으로 사용할 500원, 100원, 50원, 10원짜리 동전이 무한히 존재한다고 가정합니다. 손님에게 거슬러 주어야 할 돈이 N원일 때 거슬러 주어야 할 동전의 최소 개수를 구하세요. 단, 거슬러 줘야 할 돈 N은 항상 10의 배수입니다. - 입력 : N = 1260 - 풀이 : 가장 큰 화폐 단위부터 돈을 거슬러 주는 식으로 풀이합니다. 먼저..
[알고리즘] 다이나믹 프로그래밍(DP)
·
알고리즘/개념
💡다이나믹 프로그래밍(DP)란? - 다이나믹 프로그래밍은 메모리를 적절히 사용하여 수행 시간 효율성을 비약적으로 향상하는 방법입니다. - 이미 계산된 결과는 별도의 메모리 영역에 저장하여 다시 계산하지 않도록 합니다. - 다이나믹 프로그맹의 구현은 일반적으로 두 가지 방식(Top Down, Bottom Up)으로 구성됩니다. 다이나믹 프로그래밍의 조건 1. 최적 부분 구조 (Optimal Substructure) 큰 문제를 작은 문제로 나눌 수 있으며 작은 문제의 답을 모아서 큰 문제를 해결할 수 있습니다. 2. 중복되는 부분 문제 (Overlapping Subproblem) 동일한 작은 문제를 반복적으로 해결해야 합니다. 다이나믹 프로그래밍 예시 - 피보나치 수열 n번째 피보나치 수를 f(n)라고 할 ..
[백준] 18405 경쟁적 전염[Python]
·
알고리즘/백준
이 문제는 기본적은 bfs문제에서 살짝 꼬아서 낸 문제입니다. 저는 처음 문제를 읽고 풀 때 N*N 배열을 N*K 배열로 글을 잘 못 읽고 풀어서 indexerror가 많이 발생했었는데 다시 제대로 읽어보니 N*N배열이고 K는 바이러스의 종류라는 것을 깨달았습니다.. bfs,dfs 문제를 풀 때에는 각 행,열의 변수와 문제에서 주어지는 조건 변수들을 잘 정리하고 문제를 풀기 시작하면 도움이 될 것 같습니다. #N,K의 입력을 받음 N,K = map(int,s.readline().split()) #각 행을 graph 이중배열에 저장 graph=[list(map(int,s.readline().split()))for _ in range(N)] # S,X,Y의 값 입력 받음 S,X,Y = map(int,s.re..
[알고리즘] 위상 정렬
·
알고리즘/개념
위상 정렬💡 - 위상 정렬(Topological sort)는 비순환 방향 그래프에서 정점을 선형으로 정렬하는 것입니다. - 모든 간선(u,v)에 대해 정점 u가 정점v보다 먼저 오는 순서로 정렬이 됩니다. 비순환 방향 그래프(DAG) - 비순환 방향 그래프는 사이클이 없는 방향 그래프입니다. - 왼쪽 그림과 오른쪽 그림의 차이는 정점2에서의 간선차이입니다. 정점끼리 사이클이 생기면 비순환 방향 그래프가 아니게 됩니다. 위상 정렬 동작 과정 진입차수(in_degree)가 0인 노드를 큐에 넣는다. 큐가 빌 때까지 다음의 과정을 반복한다. 1) 큐에서 원소를 꺼내 해당 노드에서 나가는 간선을 그래프에서 제거 2) 새롭게 진입차수가 0이 된 노드를 큐에 삽입 1) 모든 정점의 in_degree를 표시합니다...
[백준] 3055 탈출 [Python]
·
알고리즘/백준
위의 문제는 bfs를 활용해서 고슴도치가 비버의 집을 찾아가는 시간을 출력하는 문제입니다. 이 문제를 풀 때 고슴도치를 먼저 이동할지 물을 이동할지 고민을 하다가 저는 고슴도치를 먼저 이동하고 물을 이동하는 방식으로 풀어봤습니다. 이렇게 하면 물이 다음에 이동할 거리를 생각안해도되므로 고슴도치의 조건이 하나 줄어듭니다. R,C = map(int,s.readline().split()) graph = [list(map(str,s.readline().strip())) for _ in range(R)] v = [[0]*C for _ in range(R)] q = deque() 우선 진행에 필요한 데이터들을 미리 생성해두고 bfs함수와 조건들을 생성합니다. #비버 집 위치 저장 for i in range(R): ..
yunchan^.^
'알고리즘' 카테고리의 글 목록 (3 Page)