Codepass Expert № 11 · 3D · 2025.03
All 14 Rotation search
PROBLEM № 11 — 2503 Protein Folding

인접한 원자가 점수를 만든다. 사슬을 어떻게 접을까.

20종의 아미노산을 사슬로 잇고, 적절한 위치에서 90°씩 회전시켜 접는다. 인접한 원자의 점수 곱이 합산 — S(30)·N(10)을 가까이 두는 폴딩이 압도적으로 유리하다.

최대화 목표 space 100³ amino 10~20 H=1·C=2·O=5·N=10·S=30
DEEP-DIVE · 심층 분석
단백질 폴딩 — 베스트 해법의 정당성과 알고리즘 원리
정수 회전 행렬의 무결성과 고가 원소 밀집을 위한 그리디 fold 탐색
심층 분석 읽기 →

§ 1문제 정의

초기에 아미노산들은 일직선으로 펴진 사슬 상태로 100³ 공간 안에 놓인다. fold_amino, fold_element로 90° 단위 회전을 반복해 사슬을 접는다.

점수는 셀이 6면체이므로 6방향 인접만 본다. S(30)와 N(10)이 가까이 붙으면 한 쌍이 300점. 단순한 폴딩 한 번이 수십~수백 점의 점수 차이를 만든다.

전형적 접근: 빔 서치(beam search). 매 단계 N개의 폴딩 후보 중 점수가 가장 높은 K개를 살리고 나머지는 버린다. 깊이 우선보다 너비 우선이 잘 작동.

S와 N을 마주 보게 하라 — 한 번의 90° 회전이 300점을 만든다.

§ 2예제 시각화 — 11원소 사슬, 3번 폴딩

FIG. 11 — fold sequence, 2D projection STEP 01 / 5
SPACE play/pause · ← → step · R reset

§ 3알고리즘 골격

process():
    chain = protein(elements)          # 초기 펴진 상태
    beam = [(elements, 0)]
    for depth in 0..MAX_FOLDS:
        next_beam = []
        for (state, score) in beam:
            for amino i, element e, axis a, ccw c:
                state' = apply_fold(state, i, e, a, c)
                if valid(state'):
                    next_beam.append((state', evaluate(state')))
        beam = top_K(next_beam, K)
    apply best beam

§ 4관련 문제