본문 바로가기

728x90

알고리즘

(102)
[백준][Kotlin] 1912 연속합 - https://www.acmicpc.net/problem/1912 1912번: 연속합 첫째 줄에 정수 n(1 ≤ n ≤ 100,000)이 주어지고 둘째 줄에는 n개의 정수로 이루어진 수열이 주어진다. 수는 -1,000보다 크거나 같고, 1,000보다 작거나 같은 정수이다. www.acmicpc.net 풀이 1. 수열을 저장하는 배열을 선언한다. 2. 수열을 순환하면서 최대값을 저장하는 dp 배열을 선언한다. 3. 현재 입력되는 값과 이전 최대값과 현재 입력 값 중 최대 값을 저장한다. 4. 저장된 dp 배열에서 최대값을 구한다. 코드 import java.util.* fun main(args: Array) { val sc = Scanner(System.`in`) val n = sc.nextInt() ..
[백준][KOTLIN] 9251 LCS - https://www.acmicpc.net/problem/9251 9251번: LCS LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net 풀이 1. 서로 입력된 두 단어를 전부 비교한다. 2. dp 에 비교하여 겹치는 단어의 개수를 저장한다. A C A Y K P C 0 1 1 1 1 1 A 1 1 2 2 2 2 P 1 1 2 2 2 3 C 1 2 2 2 2 3 A 1 2 3 3 3 3 K 1 2 3 3 4 4 3. 단어를 전부 비교한 표에서 규칙을 찾는다. - 서로 같을 경우 현재 ..
[백준][KOTLIN] 2565 전깃줄 - https://www.acmicpc.net/problem/2565 2565번: 전깃줄 첫째 줄에는 두 전봇대 사이의 전깃줄의 개수가 주어진다. 전깃줄의 개수는 100 이하의 자연수이다. 둘째 줄부터 한 줄에 하나씩 전깃줄이 A전봇대와 연결되는 위치의 번호와 B전봇대와 연결되는 www.acmicpc.net 풀이 1. 전봇대 번호를 저장할 2차원 배열을 선언한다.(0 : A 전봇대, 1 : B 전봇대) 2. 겹치는 조건을 찾는 것은 복잡하므로 역으로 교차하지 않는 최대 전깃줄 수를 구해서 전깃줄 전체 개수에서 뺀다. 3. 교차하지 않는 최대 전깃줄을 구하기 위해서 A를 기준으로 잡고 오름 차순으로 정렬 한다.(Array.sort comparable lamba 사용) 4. 3번에서 정렬된 배열의 B 값의 ..
[백준][KOTLIN] 11054 가장 긴 바이토닉 부분 수열 - https://www.acmicpc.net/problem/11054 11054번: 가장 긴 바이토닉 부분 수열 첫째 줄에 수열 A의 크기 N이 주어지고, 둘째 줄에는 수열 A를 이루고 있는 Ai가 주어진다. (1 ≤ N ≤ 1,000, 1 ≤ Ai ≤ 1,000) www.acmicpc.net 풀이 1. 11053 번 문제를 응용하여 이중으로 처리하는 것으로 푼다. 2. 왼쪽에서 오른쪽으로 증가하는 부분 수열의 개수를 구한다. (1 .. N) 3. 오른쪽에서 왼쪽으로 증가하는 부분 수열의 개수를 구한다. (N downTo 1) 4. 2번 3번 dp 값을 더한 것 중 최대값을 구한다. 5. 중복이 있으므로 4번의 최대값에서 1을 뺀다. - 증가하는 부분 수열을 구하는 법 A[6] = {10, 20, 10..
[백준][KOTLIN] 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 풀이 A[6] = {10, 20, 10, 30, 20, 50} 이라는 수열이 있을 때, dp[1] = A[1] > A[0]이기 때문에 dp[0] + 1 dp[2] = A[2] > A[1]이기 때문에 dp[1] + 1 dp[3] = A[3] < A[2] 이고 A[3] = A[1] 이기 때문에 dp[0]+1 dp[4] = ..
[백준][KOTLIN] 10844 쉬운 계단 수 https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 풀이 코드 import java.util.* fun main(args: Array) { val sc = Scanner(System.`in`) val N = sc.nextInt() val dp = Array(N + 1) { IntArray(10) } for (j in 1..9) { dp[1][j] = 1 } for (i in 2..N) { for (j in 0..9) { dp[i][j] = when (j) { 0 -> dp[i - 1][j + 1] % 1_000_000_000 9 -> dp[i - 1][j - 1..
[백준][KOTLIN] 2579 계단 오르기 https://www.acmicpc.net/problem/2579 2579번: 계단 오르기 계단 오르기 게임은 계단 아래 시작점부터 계단 꼭대기에 위치한 도착점까지 가는 게임이다. 과 같이 각각의 계단에는 일정한 점수가 쓰여 있는데 계단을 밟으면 그 계단에 쓰여 있는 점 www.acmicpc.net 풀이 코드 import java.util.* fun main(args: Array) { val sc = Scanner(System.`in`) val n = sc.nextInt() val score = IntArray(301) for (i in 1..n) { score[i] = sc.nextInt() } val dp = IntArray(301) dp[1] = score[1] dp[2] = score[2] + d..
[백준][KOTLIN] 1932 정수 삼각형 https://www.acmicpc.net/problem/1932 1932번: 정수 삼각형 첫째 줄에 삼각형의 크기 n(1 ≤ n ≤ 500)이 주어지고, 둘째 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다. www.acmicpc.net 풀이 위의 과정에 나온 규칙성을 이용하여 동적프로그래밍으로 해결한다. 코드 import java.util.* fun main(args: Array) { val sc = Scanner(System.`in`) val n = sc.nextInt() val input = Array(n + 1) { IntArray(n + 1)} val dp = Array(n + 1) { IntArray(n + 1) } for (i in 1..n) { for (j in 1..i) { input[..