LIS
-
[백준 2565번] 전깃줄Coding Test/백준 2021. 2. 7. 23:19
# 문제 내 풀이 n = int(input()) # 전깃줄의 위치 정보 입력 받음 lines = [] for _ in range(n): a, b = map(int, input().split()) lines.append((a, b)) # A의 위치를 기준으로 전깃줄 위치 정보를 오름차순 정렬 lines.sort(key=lambda x: x[0]) # DP 테이블 생성 및 초기화 dp = [1] * n # B의 수열에서 가장 긴 증가하는 부분 수열(LIS) 찾기 for i in range(1, n): for j in range(0, i): if lines[i][1] > lines[j][1]: dp[i] = max(dp[i], dp[j] + 1) # 없애야 하는 전깃줄의 최소 개수 구하기 print(n - m..
-
[백준 11054번] 가장 긴 바이토닉 부분 수열Coding Test/백준 2021. 2. 6. 04:40
# 문제 내 풀이 n = int(input()) nums = list(map(int, input().split())) # 수열 입력 받기 # 가장 긴 증가하는 부분 수열과 감소하는 부분 수열 각각을 위한 DP 테이블 생성 및 초기화 dp_asc = [1] * 1000 dp_desc = [1] * 1000 # 가장 긴 증가하는 부분 수열 (LIS) 알고리즘 수행 for i in range(1, n): for j in range(0, i): if nums[i] > nums[j]: dp_asc[i] = max(dp_asc[i], dp_asc[j] + 1) # 가장 긴 감소하는 부분 수열 알고리즘 수행 for i in range(n - 2, -1, -1): for j in range(n - 1, i, -1): ..
-
[백준 11053번] 가장 긴 증가하는 부분 수열Coding Test/백준 2021. 1. 30. 14:08
# 문제 내 풀이 # 내 풀이 n = int(input()) nums = list(map(int, input().split())) # 수열 입력 받기 # DP 테이블 생성 및 초기화 dp = [1] * 1000 # 가장 긴 증가하는 부분 수열(LIS) 알고리즘 수행 for i in range(1, n): for j in range(0, i): if nums[j] < nums[i]: dp[i] = max(dp[i], dp[j] + 1) # 결과 출력 print(max(dp))
-
[백준 18353번] 병사 배치하기Coding Test/백준 2020. 11. 17. 19:10
# 문제 N명의 병사가 무작위로 나열되어 있다. 각 병사는 특정한 값의 전투력을 보유하고 있으며, 병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 한다. 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 한다. 또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용한다. 그러면서도 남아있는 병사의 수가 최대가 되도록 하고 싶다. 예를 들어, N=7일 때 나열된 병사들의 전투력이 다음과 같다고 가정하자. 이 때 3번 병사와 6번 병사를 열외시키면, 다음과 같이 남아있는 병사의 수가 내림차순의 형태가 되며 5명이 된다. 이는 남아있는 병사의 수가 최대가 되도록 하는 방법이다. 병사에 대한 정보가 주어졌을 때, 남아있는 병사의 수가 최대..