2021/04 9

[백준] 특정 거리의 도시 찾기 18352번 (python)

문제 : 18352번: 특정 거리의 도시 찾기 (acmicpc.net) 18352번: 특정 거리의 도시 찾기 첫째 줄에 도시의 개수 N, 도로의 개수 M, 거리 정보 K, 출발 도시의 번호 X가 주어진다. (2 ≤ N ≤ 300,000, 1 ≤ M ≤ 1,000,000, 1 ≤ K ≤ 300,000, 1 ≤ X ≤ N) 둘째 줄부터 M개의 줄에 걸쳐서 두 개 www.acmicpc.net 풀이 방법 그래프에서 최단 거리를 찾는 문제이다 최단 거리를 찾는 문제는 bfs를 생각해 볼 수 있다. 처음에는 edge의 입력을 이차원 list를 만들어서 연결되어있으면 1 안 되어 있으면 0으로 풀었는데 이러면 메모리 초과로 틀리게 된다 그러므로 2차원 벡터로 i 에서 j로 가는 edge가 있으면 edge[i].app..

Algorithm 2021.04.20

큰 수의 법칙 (python)

문제 첫째 줄에 N M K 가 주어지고 둘째 줄에 N개의 자연수가 주어진다. N개의 자연수 배열중 M개로 만들 수 있는 가장 큰 수를 만들어서 출력하라 각 배열의 값은 반복 가능하고 같은 인덱스는 K번 초과해서 연속해서 나오면 안 된다 같은 수라도 인덱스가 다르면 연속하여 놓을 수 있다 예를 들어 3, 4, 3, 4, 3 이면 인덱스 1번과 3번은 다른 수이므로 정답은 4 * M가 될 것이다. 풀이 방법 배열을 정렬을 해서 가장 큰 수와 두번째로 큰 수를 결정한다 만약 가장 큰 수가 2개 이상이어도 상관없이 진행 그런 후 가장 큰 수를 만드는 패턴을 보면 K개의 가장 큰 수가 연속해서 나오고 두번 째로 큰 수가 한 번 나오고 다시 가장 큰 수가 k번 나오는 식으로 반복 되야 가장 큰 수를 만들 수 있다...

Algorithm 2021.04.15

[algospot] 두니발 박사의 탈옥 (c++)

출처 : algospot.com :: NUMB3RS algospot.com :: NUMB3RS 두니발 박사의 탈옥 문제 정보 문제 위험한 살인마 두니발 박사가 감옥에서 탈출했습니다. 수배지를 붙이고 군경이 24시간 그를 추적하고 있지만 용의주도한 두니발 박사는 쉽사리 잡히지 않았 algospot.com 풀이 방법 dp 문제이다. 마을의 정보를 입력받으면서 deg를 계산해주어 각 마을이 연결된 통로를 계산해준다. 기저 조건으로 days == 0 일 때 지금 위치가 목표지점이면 1.0을 리턴 아니면 0.0을 리턴하여 그 값에다 deg를 나누어 주어 확률을 계산하다. 기저 사례가 아닌 경우는 연결된 마을로 이동하는 재귀 호출을 하여 그 값에 deg를 나누어 주어서 확률을 계산한다. #include #inclu..

Algorithm 2021.04.14

[백준] RGB거리 1149번 (c++)

출처 : 1149번: RGB거리 (acmicpc.net) 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net 풀이 방법 dp 문제로 dp의 인덱스로 몇 번째 집인지, 자신이 선택한 색의 인덱스를 저장해 준다 기저사례로는 index 가 N-1일 땐 전 집에서 선택한 색을 제외한 두 색중 작은 값을 return한다 기저사례가 아닐시 for 문을 돌며 금지된 색이 아닐때 재귀 호출로 다음 인덱스와 선택한 색을 호출하고 그중 작은 값과 자신이 선택한 비용을 return 하여 해결하였다. #inclu..

Algorithm 2021.04.06

[백준] 1,2,3 더하기 9095번 (c++)

출처 : 9095번: 1, 2, 3 더하기 (acmicpc.net) 9095번: 1, 2, 3 더하기 각 테스트 케이스마다, n을 1, 2, 3의 합으로 나타내는 방법의 수를 출력한다. www.acmicpc.net 해결 방법 dp 문제로 n을 1, 2, 3을 빼서 재귀 호출을 반복적으로 하며, n이 0 이면 return 1을 n이 음수면 return 0을 해서 기저 조건을 만들어 주었다. dp table인덱스로는 숫자 n을 주었다. #include #include #include using namespace std; int dp[12]; int f(int n) { if (n == 0) return 1; if (n < 0) return 0; int& ret = dp[n]; if (ret != -1) ret..

Algorithm 2021.04.02

[백준] 1로 만들기 1463번 (c++)

출처 : 1463번: 1로 만들기 (acmicpc.net) 1463번: 1로 만들기 첫째 줄에 1보다 크거나 같고, 106보다 작거나 같은 정수 N이 주어진다. www.acmicpc.net 해결 방법 dp문제 이다. top-down으로 해결 하였다. 3으로 나누어 지면 f(n/3)을 호출해서 저장하고 2로 나누어 지면 f(n/2)을 호출해서 저장하고 f(n-1)을 호출해서 저장해 가장 작은 값에다가 +1을 더해 주어서 리턴하였다. #include #include #include using namespace std; int dp[100001]; const int INF = 987654321; int f(int n) { if (n == 1) return 0; int& ret = dp[n]; int tree ..

Algorithm 2021.04.02

[algospot] Quantization (c++)

출처 : algospot.com :: QUANTIZE algospot.com :: QUANTIZE Quantization 문제 정보 문제 Quantization (양자화) 과정은, 더 넓은 범위를 갖는 값들을 작은 범위를 갖는 값들로 근사해 표현함으로써 자료를 손실 압축하는 과정을 말한다. 예를 들어 16비트 JPG 파일 www.algospot.com 풀이 방법 정렬이 중요한 문제이다. 문제가 안 풀릴 시 정렬을 한번 생각해 보자 재귀 호출시 인자로 시작점과 남은 구간 자르기 횟수를 넘겨주면 된다 오차 제곱의 합을 구할 때 구간에서 평균값을 채택하면 구할 수 있다. 오차 제곱의 합의 값 계산은 구간 합 - 2 * 평균 * 구간 합 + 평균 * 평균 *(hi -lo +1)을 해주면 된다 여기서 hi 와 l..

Algorithm 2021.04.02

[백준] 설탕 2839번 (c++)

출처 : 2839번: 설탕 배달 (acmicpc.net) 2839번: 설탕 배달 상근이는 요즘 설탕공장에서 설탕을 배달하고 있다. 상근이는 지금 사탕가게에 설탕을 정확하게 N킬로그램을 배달해야 한다. 설탕공장에서 만드는 설탕은 봉지에 담겨져 있다. 봉지는 3킬로그 www.acmicpc.net 풀이 방법 dp 문제로 쉬운 문제였다. 재귀로 n을 입력받아 min(f(n-5), f(n-3)) + 1을 해주면 된다 기저 조건으론 n이 음수이면 INF(매우 큰 값)를 리턴해서 선택되지 못하게 n이 0이면 0을 리턴해서 끝났다는 것을 알려 주었다 마지막 출력부분에선 f(n)이 INF보다 크면 -1을 리턴 아니면 f(n)의 리턴 값을 리턴해 주면 된다 #include #include #include #include ..

Algorithm 2021.04.02

[algospot] 폴리오미노 (c++)

풀이 방법 dp 문제인데 문제를 부분 문제로 나누기 어려운 문제 였다. 처음에는 정사각형 하나를 두고 상하좌우로 사각형을 붙이는 형태로 부분 문제를 쪼개려고 생각 했지만 이러면 중복되는 부분을 다 제거 하기가 복잡해서 실패 했다. 정답은 층별로 부분 문제를 쪼개는 것이다 재귀 함수로 현재 남은 상자수와 각 재귀마다 첫 층에 쓸 상자수를 보내주고 함수 안에서 for 문을 돌며 2번째 층에는 몇개의 상자를 사용할지 선택후 함수 리턴값을 더하면 된다 여기서 리턴값에 first + second - 1를 곱해주어야 한다 1층과 2층을 한 칸씩 옆으로 이동시키면 다른 경우가 되기 때문이다. 시간 복잡도는 O(n^3)이다. #include #include #include #include const int MOD = ..

Algorithm 2021.04.01