본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

(220)
[c++] 백준 1932 정수 삼각형 백준 단계별로 풀어보기 [동적계획법1] 정수 삼각형 https://www.acmicpc.net/problem/1932 1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net [풀이] 대각선 오른쪽 위와, 왼쪽 위 중 더 큰 값과의 합을 구해 나간다. -> path[i][j] = std::max(path[i - 1][j - 1], path[i - 1][j]) + tri[i][j]; [코드] #include #include #include int main() { // 정수 삼각형, 합이 최대가 되는 경로 int n; int tri[502][502]; int path[502][502]; std..
[c++] 백준 1149 RGB 거리 백준 단계별로 풀어보기 [동적계획법] RGB 거리 https://www.acmicpc.net/problem/1149 1149번: RGB거리 첫째 줄에 집의 수 N(2 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 각 집을 빨강, 초록, 파랑으로 칠하는 비용이 1번 집부터 한 줄에 하나씩 주어진다. 집을 칠하는 비용은 1,000보다 작거나 www.acmicpc.net [풀이] n개의 집을 빨,초,파 중 하나로 칠해야 한다. 같은 색이 연속으로 반복되면 안될 때 모든 집을 칠하는 비용의 최솟값을 구하는 문제이다. 동적계획법으로 이 문제를 풀 때, 생각해야 할 것은 당장의 최솟값을 구해 더하는 것이 전체의 최솟값이 되지 않는다는 것이다. 예를 들어, 다음과 같이 3개의 집에 대해 빨,초,파 비..
[c++] 백준 1920 수 찾기 백준 단계별로 풀어보기 [이분 탐색] 수 찾기 https://www.acmicpc.net/problem/1920 1920번: 수 찾기 첫째 줄에 자연수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 줄에는 N개의 정수 A[1], A[2], …, A[N]이 주어진다. 다음 줄에는 M(1 ≤ M ≤ 100,000)이 주어진다. 다음 줄에는 M개의 수들이 주어지는데, 이 수들 www.acmicpc.net [풀이] 이진 탐색으로 find 배열의 수가 arr 배열에 존재하는지 검색하고, 존재하면 1을 존재하지 않으면 0을 출력한다. [코드] #include #include #include int arr[100001]; int find[100001]; int binary_search(int as, int ae..
[c++] 백준 2740 행렬 곱셉 백준 단계별로 풀어보기 [분할 정복] 행렬 곱셈 https://www.acmicpc.net/problem/2740 2740번: 행렬 곱셈 첫째 줄에 행렬 A의 크기 N 과 M이 주어진다. 둘째 줄부터 N개의 줄에 행렬 A의 원소 M개가 순서대로 주어진다. 그 다음 줄에는 행렬 B의 크기 M과 K가 주어진다. 이어서 M개의 줄에 행렬 B의 원소 K개 www.acmicpc.net [풀이] n*m의 행렬 a와 m*k의 행렬 b가 주어졌을 때, 두 행렬을 곱하는 프로그램. O(n^3)의 시간복잡도. [코드] #include #include #include int mat_a[100][100]; int mat_b[100][100]; int mat_c[100][100]; int main() { //n*m의 행렬 a와..
[c++] 백준 1992 쿼드트리 백준 단계별로 풀어보기 [분할 정복] 쿼드트리 https://www.acmicpc.net/problem/1992 1992번: 쿼드트리 첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1 ≤ N ≤ 64의 범위를 가진다. 두 번째 줄부터는 길이 N의 문자열이 N개 들어온다. 각 문자열은 0 또 www.acmicpc.net [풀이] 앞서 풀었던 색종이 자르기 문제와 거의 유사하다. 0으로만 이루어져있으면 0을, 1로만 이루어져있으면 1을 문자열에 추가하고, 0과 1이 섞여있다면 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래 순으로 재귀 호출을 한다. 재귀호출을 하는 코드 부문 앞, 뒤로 "(", ")"이 출력되도록 한다. [코드] #include #incl..
[c++] 백준 2630 색종이 만들기 백준 단계별로 풀어보기 [분할 정복] 색종이 만들기 https://www.acmicpc.net/problem/2630 2630번: 색종이 만들기 첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다. www.acmicpc.net [풀이] 재귀호출을 위한 인자로 y의 시작 좌표, x의 시작 좌표, size(width==height)를 전달해준다. 처음 arr[y][x]와 비교하여 다른 색이 붙어있다면 왼쪽 위, 오른쪽 위, 왼쪽 아래, 오른쪽 아래로 나누어 재귀호출을 해준다. 모두 하얀색이었다면 white_color 수를 증가해주고, 모두 파란색..
[c++] 백준 11866 요세푸스 문제 0 백준 단계별로 풀어보기 [큐, 덱] 요세푸스 문제 0 https://www.acmicpc.net/problem/11866 11866번: 요세푸스 문제 0 첫째 줄에 N과 K가 빈 칸을 사이에 두고 순서대로 주어진다. (1 ≤ K ≤ N ≤ 1,000) www.acmicpc.net [풀이] 1~n까지의 배열에 대해 k 간격으로 삭제해나갈 때 삭제되는 수들의 배열이 요세푸스 순열이다. k의 간격만큼 큐에서 수를 맨 뒤로 보내고, 반복문이 끝나면 맨 앞에 있는 값을 새로운 배열에 저장한 후 pop한다. 큐가 비워질 때까지 반복한 뒤 요세푸스 순열이 저장된 배열을 출력한다. [코드] #include #include int main() { //n, 간격 k에 대한 요세푸스 순열. 7 3 -> int n, k; s..
[c++] 백준 2164 카드2 백준 단계별로 풀어보기 [큐, 덱] 카드2 https://www.acmicpc.net/problem/2164 2164번: 카드2 N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가 www.acmicpc.net [풀이] 카드가 한 장 남을 때까지 제일 위에 있는 카드를 pop하고, 그 후 제일 위에 있는 카드(front)를 맨 뒤에 push하는 과정을 반복한다. [코드] #include #include int main() { //n이 주어졌을 때 가장 마지막에 남게 되는 카드. 1~n까지의 카드가 놓여있고 제일 위에 있는 카드를 버린 후 위에 있는 카드를 아래로..