본문 바로가기

알고리즘 풀이16

[백준][C++] 11053번: 가장 긴 증가하는 부분 수열 https://www.acmicpc.net/problem/11053 11053번: 가장 긴 증가하는 부분 수열 수열 A가 주어졌을 때, 가장 긴 증가하는 부분 수열을 구하는 프로그램을 작성하시오. 예를 들어, 수열 A = {10, 20, 10, 30, 20, 50} 인 경우에 가장 긴 증가하는 부분 수열은 A = {10, 20, 10, 30, 20, 50} 이 www.acmicpc.net 수열이 주어졌을 때 가장 긴 증가하는 부분 수열의 길이를 구하는 문제이다. DP의 느낌이 강하게 들어서 DP로 풀어보았다. 먼저 DP[i]는 수열의 i번째에 가장 긴 증가하는 수열의 길이로 정의하고 점화식 찾기에 들어갔다.i번째 전까지 i번째 원소보다 작은 원소들 중 가장 긴 부분 수열의 길이 값을 찾아야 하므로 이중 .. 2024. 3. 26.
[백준][C++] 17779번: 게리맨더링 2 https://www.acmicpc.net/problem/17779 17779번: 게리맨더링 2 재현시의 시장 구재현은 지난 몇 년간 게리맨더링을 통해서 자신의 당에게 유리하게 선거구를 획정했다. 견제할 권력이 없어진 구재현은 권력을 매우 부당하게 행사했고, 심지어는 시의 이름도 www.acmicpc.net 기준점 (x,y)와 경계 길이인 d1,d2에 따라 5개 구역으로 나누어 인구가 가장 많은 구역과 작은 구역의 차이의 최솟값을 구하는 문제이다. 먼저 기준점 (x,y)가 (1,1)부터 (N,N)까지 모두 돌아야겠다는 생각이 들었다. -> 브루트포스 그 다음 경계선의 길이인 d1과 d2는 문제에서 주어진 조건에 따르면 경계선의 사각형의 4꼭짓점이 NXN에 포함되야 하므로 이를 통해d1은 범위가 정해지는 .. 2024. 3. 24.
[백준][C++] 1991번: 트리 순회 https://www.acmicpc.net/problem/1991 1991번: 트리 순회 첫째 줄에는 이진 트리의 노드의 개수 N(1 ≤ N ≤ 26)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 노드와 그의 왼쪽 자식 노드, 오른쪽 자식 노드가 주어진다. 노드의 이름은 A부터 차례대로 알파 www.acmicpc.net 입력된 트리 노드 정보를 통해 전, 중, 후위 순회를 출력하는 문제이다. 입력된 노드 정보들로 트리를 만들 수 있느냐가 이 문제에 핵심인 것 같다. 두 가지 자료구조로 트리를 만들어줬다. 먼저 배열을 사용해 트리를 만들어봤다. 데이터 타입으로 문자를 저장하는 이차원 배열을 사용해 왼쪽 자식은 이차원의 0번째 인덱스에, 오른쪽 자식은 이차원의 1번째 인덱스에 저장했다. 이렇게 트리를 만들.. 2024. 3. 23.
[백준][C++] 1520번: 내리막 길 https://www.acmicpc.net/problem/1520 1520번: 내리막 길 첫째 줄에는 지도의 세로의 크기 M과 가로의 크기 N이 빈칸을 사이에 두고 주어진다. 이어 다음 M개 줄에 걸쳐 한 줄에 N개씩 위에서부터 차례로 각 지점의 높이가 빈 칸을 사이에 두고 주어진다. www.acmicpc.net 항상 내리막 길로만 이동하는 경로의 개수를 구하는 문제이다. 가장 먼저 그래프 탐색으로 dfs가 떠올랐다. 풀이 로직으로는 1. (0,0)에서 시작 2. 인접한 좌표들을 돌며 더 낮은 높이로 이동 3. (M-1,N-1)에 도달하면 경로 개수+1 비교적 쉬운 문제였다 생각했으나 시간 초과가 나왔다. 아무래도 최악의 경우 경로의 개수가 10억이므로 재귀 함수로 풀었을 때 시간 초과가 나온 것 같다... 2024. 3. 22.