728x90
문제 보기
이 문제는 DP 문제이다.
N명의 아이들을 번호 순서대로 옮기는 최소한의 수를 구하면 된다. 최소한의 수를 구하기 위해서는 움직이지 않아도 되는 아이들을 구하면 된다. 움직이지 않아도 되는 아이들은 현재 번호 순서에서 가장 긴 증가하는 수열에 해당한다.
알고리즘 과정은 아래와 같다.
1. 가장 긴 증가하는 수열을 구한다.
2. 전체 인원수에서 가장 긴 증가하는 수열의 길이를 뺀다.
코드
if __name__ == "__main__":
N = int(input()) # 아이들의 수
people = [int(input()) for _ in range(N)] # 아이들 번호 순서 정보
# 2차원 dp
dp = [[0] * N for _ in range(N)]
# 가장 긴 증가하는 부분수열
for i in range(N):
dp[i][i] = 1 # i를 시작점으로 설정.
for j in range(i + 1, N):
for k in range(j):
if people[k] < people[j]:
dp[i][j] = max(dp[i][j], dp[i][k] + 1)
# 가장 긴 증가하는 수열 길이 계산
lis = 0
for i in range(N):
lis = max(lis, max(dp[i]))
# 전체 길이 - 가장 긴 증가하는 부분수열
answer = N - lis
print(answer)
728x90
'알고리즘 풀이 > 백준' 카테고리의 다른 글
[ 백준 2343 ] 기타 레슨 - Python (0) | 2020.07.29 |
---|---|
[ 백준 17070 ] 파이프 옮기기 1 (0) | 2020.07.28 |
[ 백준 2636 ] 치즈 - Python (0) | 2020.07.06 |
[ 백준 5557 ] 1학년 - Python (0) | 2020.07.04 |
[ 백준 2493 ] 탑 - Python (4) | 2020.07.02 |