728x90

Algorithm (Python, Java, SQL)/Inflearn Study 78

[Python Algorithm] Dynamic programming(동적계획법) - 위상정렬(그래프 정렬)

> Dynamic programming(동적계획법) - 위상정렬 : 일의 선후관계를 유지하면서 전체 일의 순서를 짜는 알고리즘, 그래프와 진입차수가 중요함 (두 가지를 만들어둬야 함) 예를 들어 아래의 그림을 보면 4번 정점의 진입차수는 1과 5에서 4로 향하는 방향 2개 존재. 그래서 진입차수는 2 이런 식으로 각각 차수 값을 저장해둬야함. 📖 문제 : 위상정렬(그래프 정렬) 위상정렬은 어떤 일을 하는 순서를 찾는 알고리즘입니다. 각각의 일의 선후관계가 복잡하게 얽혀있을 때 각각 일의 선후관계를 유지하면서 전체 일의 순서를 짜는 알고리즘입니다. 만약 아래와 같은 일의 순서를 각각 지키면서 전체 일의 순서를 정한다면 1 4 //1번일을 하고 난 후 4번일을 해야한다. 5 4 4 3 2 5 2 3 6 2 ..

[Python Algorithm] Dynamic programming(동적계획법) - 회장뽑기(플로이드-워샬 응용)

> Dynamic programming(동적계획법) - 플로이드 워샬 알고리즘 : 모든 정점이 모든 정점으로 가는 비용을 구하는 알고리즘 (2차원리스트) 📖 문제 : 회장뽑기 월드컵축구의 응원을 위한 모임에서 회장을 선출하려고 한다. 이모임은 만들어진지 얼마 되지 않았기 때문에 회원사이에 서로 모르는 사람도 있지만, 몇 사람을 통하면 서로 모두 알 수 있 다. 각 회원은 다른 회원들과 가까운 정도에 따라 점수를 받게 된다. 예를 들어 어느 회원이 다른 모든 회원과 친구이면, 이 회원의 점수는 1점이다. 어느 회원의 점수가 2점이면, 다른 모든 회원이 친구이거나, 친구의 친구임을 말한다. 또한, 어느 회원의 점수가 3점이면, 다른 모든 회원이 친구이거나, 친구의 친구이거나, 친국의 친구의 친구임을 말한다...

[Python Algorithm] Dynamic programming(동적계획법) - 플로이드 워샬 알고리즘

> Dynamic programming(동적계획법) - 플로이드 워샬 알고리즘 : 모든 정점이 모든 정점으로 가는 비용을 구하는 알고리즘 (2차원리스트) 📖 문제 : 플로이드 워샬 알고리즘 N개의 도시가 주어지고, 각 도시들을 연결하는 도로와 해당 도로를 통행하는 비용이 주어질 때 모든 도시에서 모든 도시로 이동하는데 쓰이는 비용의 최소값을 구하는 프로그램을 작성하 세요. 입력설명 첫 번째 줄에는 도시의 수N(N 정점 1을 지난다는 것. k = 3 이면, 1, 2, 3 중에서 사용해가면서 최솟값을 구하는 것 ! 1,2,3 순서가 필수가 아닌 321 213 이 될 수도 123 다 안쓰일 수도 ! 출처 인프런 : 파이썬 알고리즘 문제 풀이

[Python Algorithm] Dynamic programming(동적계획법) - 최대점수 구하기(냅색 알고리즘)

> Dynamic programming(동적계획법) 📖 문제 : 최대점수 구하기(냅색 알고리즘) 이번 정보올림피아드대회에서 좋은 성적을 내기 위하여 현수는 선생님이 주신 N개의 문제를 풀려고 합니다. 각 문제는 그것을 풀었을 때 얻는 점수와 푸는데 걸리는 시간이 주어지게 됩 니다. 제한시간 M안에 N개의 문제 중 최대점수를 얻을 수 있도록 해야 합니다. (해당문제는 해당시간이 걸리면 푸는 걸로 간주한다, 한 유형당 한개만 풀 수 있습니다.) 입력설명 첫 번째 줄에 문제의 개수N(1

[Python Algorithm] Dynamic programming(동적계획법) - 동전 교환(냅색 알고리즘)

> Dynamic programming(동적계획법) 📖 문제 : 동전 교환(냅색 알고리즘) 다음과 같이 여러 단위의 동전들이 주어져 있을때 거스름돈을 가장 적은 수의 동전으로 교환 해주려면 어떻게 주면 되는가? 각 단위의 동전은 무한정 쓸 수 있다. 입력설명 첫 번째 줄에는 동전의 종류개수 N(1

[Python Algorithm] Dynamic programming(동적계획법) - 가방문제(냅색 알고리즘)

> Dynamic programming(동적계획법) 📖 문제 : 가방문제(냅색 알고리즘) 최고 17kg의 무게를 저장할 수 있는 가방이 있다. 그리고 각각 3kg, 4kg, 7kg, 8kg, 9kg의 무게를 가진 5종류의 보석이 있다. 이 보석들의 가치는 각각 4, 5, 10, 11, 13이다. 이 보석을 가방에 담는데 17kg를 넘지 않으면서 최대의 가치가 되도록 하려면 어떻게 담아야 할까요? 각 종류별 보석의 개수는 무한이 많다. 한 종류의 보석을 여러 번 가방에 담을 수 있 다는 뜻입니다. 입력설명 첫 번째 줄은 보석 종류의 개수와 가방에 담을 수 있는 무게의 한계값이 주어진다. 두 번째 줄부터 각 보석의 무게와 가치가 주어진다. 가방의 저장무게는 1000kg을 넘지 않는다. 보석의 개수는 30개 ..

[Python Algorithm] Dynamic programming(동적계획법) - 알리바바와 40인의 도둑(Top-Down)

> Dynamic programming(동적계획법) 📖 문제 : 알리바바와 40인의 도둑(Bottom-Up) 알리바바는 40인의 도둑으로부터 금화를 훔쳐 도망치고 있습니다. 알리바바는 도망치는 길에 평소에 잘 가지 않던 계곡의 돌다리로 도망가고자 한다. 계곡의 돌다리는 N×N개의 돌들로 구성되어 있다. 각 돌다리들은 높이가 서로 다릅니다. 해당 돌다리를 건널때 돌의 높이 만큼 에너지가 소비됩니다. 이동은 최단거리 이동을 합니다. 즉 현재 지점에서 오른쪽 또는 아래쪽으로만 이동해야 합니다. N*N의 계곡의 돌다리 격자정보가 주어지면 (1, 1)격자에서 (N, N)까지 가는데 드는 에너지의 최소량을 구하는 프로그램을 작성하세요. 만약 N=3이고, 계곡의 돌다리 격자 정보가 다음과 같다면 (1, 1)좌표에서 ..

[Python Algorithm] Dynamic programming(동적계획법) - 알리바바와 40인의 도둑(Bottom-Up)

> Dynamic programming(동적계획법) 📖 문제 : 알리바바와 40인의 도둑(Bottom-Up) 알리바바는 40인의 도둑으로부터 금화를 훔쳐 도망치고 있습니다. 알리바바는 도망치는 길에 평소에 잘 가지 않던 계곡의 돌다리로 도망가고자 한다. 계곡의 돌다리는 N×N개의 돌들로 구성되어 있다. 각 돌다리들은 높이가 서로 다릅니다. 해당 돌다리를 건널때 돌의 높이 만큼 에너지가 소비됩니다. 이동은 최단거리 이동을 합니다. 즉 현재 지점에서 오른쪽 또는 아래쪽으로만 이동해야 합니다. N*N의 계곡의 돌다리 격자정보가 주어지면 (1, 1)격자에서 (N, N)까지 가는데 드는 에너지의 최소량을 구하는 프로그램을 작성하세요. 만약 N=3이고, 계곡의 돌다리 격자 정보가 다음과 같다면 (1, 1)좌표에서 ..

[Python Algorithm] Dynamic programming(동적계획법) - 가장 높은 탑 쌓기

> Dynamic programming(동적계획법) 📖 문제 : 가장 높은 탑 쌓기 밑면이 정사각형인 직육면체 벽돌들을 사용하여 탑을 쌓고자 한다. 탑은 벽돌을 한 개씩 아래 에서 위로 쌓으면서 만들어 간다. 아래의 조건을 만족하면서 가장 높은 탑을 쌓을 수 있는 프 로그램을 작성하시오. (조건1) 벽돌은 회전시킬 수 없다. 즉, 옆면을 밑면으로 사용할 수 없다. (조건2) 밑면의 넓이가 같은 벽돌은 없으며, 또한 무게가 같은 벽돌도 없다. (조건3) 벽돌들의 높이는 같을 수도 있다. (조건4) 탑을 쌓을 때 밑면이 좁은 벽돌 위에 밑면이 넓은 벽돌은 놓을 수 없다. (조건5) 무게가 무거운 벽돌을 무게가 가벼운 벽돌 위에 놓을 수 없다. 입력설명 입력 파일의 첫째 줄에는 입력될 벽돌의 수가 주어진다. ..

[Python Algorithm] Dynamic programming(동적계획법) - 최대 부분 증가수열

> Dynamic programming(동적계획법) 📖 문제 : 최대 부분 증가 수열 N개의 자연수로 이루어진 수열이 주어졌을 때, 그 중에서 가장 길게 증가하는(작은 수에서 큰 수로) 원소들의 집합을 찾는 프로그램을 작성하라. 예를 들어, 원소가 2, 7, 5, 8, 6, 4, 7, 12, 3 이면 가장 길게 증가하도록 원소들을 차례대로 뽑아내면 2, 5, 6, 7, 12를 뽑아내어 길 이가 5인 최대 부분 증가수열을 만들 수 있다. 입력설명 첫째 줄은 입력되는 데이터의 수 N(2≤N≤1,000, 자연수)를 의미하고, 둘째 줄은 N개의 입력데이터들이 주어진다. 출력설명 첫 번째 줄에 부분증가수열의 최대 길이를 출력한다. 입력예제 1 8 5 3 7 8 6 2 9 4 출력예제 1 4 내 코드 if __na..

728x90