NMF
NMF 음수미포함 행렬분해
다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄보도록 합시다.
관련 문제)
문제 설명
문제에서 챕터의 크기(K)는 최대 500 입니다.
DP를 활용하여 문제를 접근할 것이므로 점화식의 정의를 우선 세워봅시다.
그렇다면 d[i][j]는 다음의 방식으로 다르게 표현이 가능합니다.
위의 정의 방식으로 최대 500 까지의 많은 챕터들을 더 작게 작게 줄여나가면서 답을 찾아나갈 수 있습니다.
가장 작은 경우는 다음의 경우 입니다.(종결조건)
d[i][i] = 0
d[i][i+1] = a[i](i번째 챕터 크기)+ a[i+1](i+1번째 챕터 크기)
위의 점화식의 정의에 따라 Top-down, Bottom-Up 두가지 방식으로 코드를 구현하여 보겠습니다.
구현 과정: 첫 번째 Top-down 방식
def go(i, j):
if i == j:
return 0
if d[i][j] != -1:
return d[i][j]
ans = d[i][j]
for k in range(i, j):
tmp = go(i, k)+go(k+1, j)+sum(a[i:j+1])
if ans == -1 or ans > tmp:
ans = tmp
d[i][j] = ans
return ans
구현 과정: 두 번째 Bottom-UP 방식
d=[[-1]*k for i in range(k)]
# 길이가 1 일 때
for i in range(k):
d[i][i]=0
# 길이가 2 일 때
for i in range(k-1):
d[i][i+1]=a[i]+a[i+1]
# 길이가 3~k 일 때
for l in range(3,k+1):
for i in range(k-l+1):
j=i+l-1
tmp=-1 # d[i][j]의 여러 후보들 중에서 최소값을 저장하는데 필요한 변수
for t in range(i,j):
if tmp==-1 or tmp > d[i][t]+d[t+1][j]:
tmp = d[i][t]+d[t+1][j]
d[i][j]=tmp+sum(a[i:j+1])
print(d[0][k-1])
관련 문제 및 포스트)
제가 생각하기에 자신이 가장 구현하기 편하며 실수를 줄일 수 있는 접근 방식이 가장 좋은 풀이라고 생각합니다.
아무리 가독성이 좋고 구현하기 쉬운 코드라 하더라도 시간복잡도가 너무나 초과하는 코드라면 효율적인 알고리즘을 적용하는 것에 대해 더욱 고민하여야 합니다.
이 문제와 같은 경우는 Top-Down 방식의 코드로 백준에 제출을 하면 Python의 경우 시간초과 오류가 발생합니다.
그 이유는, 이 문제는 Top-Down 의 메모이제이션이 크게 효과를 내지 못하며, 너무 깊게 재귀함수가 반복되며 테스트 데이터 T의 값이 커질 수록 시간이 많이 소요하는 것이라 생각합니다. 따라서, 메모이제이션이 잘 되지 않는 문제의 경우에는 Bottom-Up 방식을 사용하는 것이 좋습니다. 종결 조건에서부터 시작하여 최종 답을 찾을 때까지 하나씩 진행되는 방식이기 때문에 시간복잡도가 줄기 때문입니다.
전체 구현 코드
import sys
def input(): return sys.stdin.readline().rstrip()
t = int(input())
for _ in range(t):
k = int(input())
a = list(map(int, input().split()))
d = [[-1]*k for i in range(k)]
# 길이가 1 일 때
for i in range(k):
d[i][i] = 0
# 길이가 2 일 때
for i in range(k-1):
d[i][i+1] = a[i]+a[i+1]
# 길이가 3~k 일 때
for l in range(3, k+1):
for i in range(k-l+1):
j = i+l-1
tmp = -1 # d[i][j]의 여러 후보들 중에서 최소값을 저장하는데 필요한 변수
for t in range(i, j):
if tmp == -1 or tmp > d[i][t]+d[t+1][j]:
tmp = d[i][t]+d[t+1][j]
d[i][j] = tmp+sum(a[i:j+1])
print(d[0][k-1])
NMF 음수미포함 행렬분해
PCA 주성분 분석(차원 축소)
주요 주제)
다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄 보도록 합시다.
다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄보도록 합시다.
다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄보도록 합시다.
다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄 보도록 합시다.
다이내믹 프로그래밍 방법이 필요한 문제들은 처음엔 접근 방법이 막막하게 느껴지곤 합니다. DP 접근 풀이가 필요한 관련 유형의 문제들을 많이 다뤄보도록 합시다.
삼성역량테스트에서 출제되는 코테문제들의 경우 2차원 배열을 특정한 기준을 통해 회전시키는 문제가 자주 출제됩니다.
Introducing Python 처음 시작하는 파이썬[2판] 을 읽으면서, 몇 가지 헷갈리거나 새롭게 알게된 문법, 함수, 메소드들을 정리하려고 합니다.
f-문자열
Introducing Python 처음 시작하는 파이썬[2판] 을 읽으면서, 몇 가지 헷갈리거나 새롭게 알게된 문법, 함수, 메소드들을 정리하려고 합니다.
Pipeline-CPU 목차 Pipeline CPU(1) : Single-Cycle vs Multi-Cycle CPU Pipeline CPU(2) : Pipeline-CPU의 간략한 이해 Pipeline CPU(3) : Data Hazard(RAW...
Pipeline-CPU 목차 Pipeline CPU(1) : Single-Cycle vs Multi-Cycle CPU Pipeline CPU(2) : Pipeline-CPU의 간략한 이해 Pipeline CPU(3) : Data Hazard(RAW...
Pipeline-CPU 목차 Pipeline CPU(1) : Single-Cycle vs Multi-Cycle CPU Pipeline CPU(2) : Pipeline-CPU의 간략한 이해 Pipeline CPU(3) : Data Hazard(RAW...
Pipeline-CPU 목차 Pipeline CPU(1) : Single-Cycle vs Multi-Cycle CPU Pipeline CPU(2) : Pipeline-CPU의 간략한 이해 Pipeline CPU(3) : Data Hazard(RAW...
Pipeline-CPU 목차 Pipeline CPU(1) : Single-Cycle vs Multi-Cycle CPU Pipeline CPU(2) : Pipeline-CPU의 간략한 이해 Pipeline CPU(3) : Data Hazard(RAW...
Component-Driven User Interfaces