스파르타 취업지원 이력서 세션 (2)


문제 설명 solution.py
#141 프로그래머스의 마스코트인 머쓱이는 최근 취미로 당구를 치기 시작했습니다. 머쓱이는 손 대신 날개를 사용해야 해서 당구를 잘 못 칩니다. 하지만 끈기가 강한 머쓱이는 열심히 노력해서 당구를 잘 치려고 당구 학원에 다니고 있습니다. 오늘도 당구 학원에 나온 머쓱이에게 당구 선생님이"원쿠션"(당구에서 공을 쳐서 벽에 맞히는 걸 쿠션이라고 부르고, 벽에 한 번 맞힌 후 공에 맞히면 원쿠션이라고 부릅니다) 연습을 하라면서 당구공의 위치가 담긴 리스트를 건네줬습니다. 리스트에는 머쓱이가 맞춰야 하는 공들의 위치가 담겨있습니다. 머쓱이는 리스트에 담긴 각 위치에 순서대로 공을 놓아가며 "원쿠션" 연습을 하면 됩니다. 이때, 머쓱이는 항상 같은 위치에 공을 놓고 쳐서 리스트에 담긴 위치에 놓인 공을 맞춥니다.

머쓱이와 달리 최근 취미로 알고리즘 문제를 풀기 시작한 당신은, 머쓱이가 친 공이 각각의 목표로한 공에 맞을 때까지 최소 얼마의 거리를 굴러가야 하는지가 궁금해졌습니다.
당구대의 가로 길이 m, 세로 길이 n과 머쓱이가 쳐야 하는 공이 놓인 위치 좌표를 나타내는 두 정수 startX, startY, 그리고 매 회마다 목표로 해야하는 공들의 위치 좌표를 나타내는 정수 쌍들이 들어있는 2차원 정수배열 balls가 주어집니다. "원쿠션" 연습을 위해 머쓱이가 공을 적어도 벽에 한 번은 맞춘 후 목표 공에 맞힌다고 할 때, 각 회마다 머쓱이가 친 공이 굴러간 거리의 최솟값의 제곱을 배열에 담아 return 하도록 solution 함수를 완성해 주세요.

def solution(m, n, startX, startY, balls):
     answer = []
     def getDist(x1, y1, x2, y2):
          return (x1 - x2) ** 2 + (y1 - y2) ** 2
     for (ballX, ballY) in balls:
          distU = getDist(startX, startY, ballX, ballY + 2 * (n - ballY))
          distD = getDist(startX, startY, ballX, -ballY)
          distL = getDist(startX, startY, -ballX, ballY)
          distR = getDist(startX, startY, ballX + 2 * (m - ballX), ballY)
          if startX == ballX:
               if startY > ballY:
                   distD = int(1e9)
              else:
                   distU = int(1e9)
          if startY == ballY:
               if startX > ballX:
                    distL = int(1e9)
               else:
                    distR = int(1e9)
          dist = min((distU, distD, distL, distR))
         answer.append(dist)
     return answer

스파르타 취업지원 이력서 세션 (1)

    체크 포인트 주요 노트
삼성
바이오
로직스
QA*
회사 성격 요약 글로벌 CDMO (고객사 제품 위탁 생산)
FDA·EMA·PMDA 등 글로벌 규제 대응 상시
Audit/Inspection 대응 능력이 핵심 경쟁력
대규모 생산 설비 + 데이터 관리 체계 중심
"규제 환경에서 안전하게 운영할 수 있는가?"
1. Data Integrity를 구조적으로 이해하는가? ALCOA+ 개념 이해 여부
기록·변경·이력 관리 경험
Traceability(추적 가능성) 개념 언급
시스템 변경 시 영향 분석 사고
단순 데이터 분석 경험보다 변경 관리 및 추적 구조 설계 경험 선호
2. 표준화 및 SOP 기반 사고가 있는가? 표준화 경험
프로세스 개선 경험
Validation / Verification 구분 이해
문서화 중요성 인식
창의적 해결보다 일관된 관리가 중요
3. Audit 대응 마인드가 있는가? 단일 결과 의존 구조가 아닌가?
검증 단계가 명확한가?
로그·이력·검증 과정 설명 가능한가?
설명 가능성(Explainability) 중요
4. 리스크 기반 사고가 있는가? 실패 가능성 고려
오판 리스크 최소화 구조
사전 예방적 사고
ICH Q9(품질 리스크 관리) 이해도 간접적으로 드러나는지

* 핵심 키워드: 표준화, 재현성, 변경 영향 추적, 데이터 무결성, 검증 체계

    체크 포인트 주요 노트
셀트리온
QA**
회사 성격 요약 바이오시밀러 중심
시장 선점 전략 중요
속도 + 비용 + 품질 균형
R&D와 생산 연결 구조
"경쟁 환경에서 빠르고 효율적으로 움직일 수 있는가?"
1. 이 사람은 속도 감각이 있는가? 리드타임 단축 경험
효율 개선 경험
병목 제거 경험
공정 개선 경험
바이오시밀러는 먼저 나가는 회사가 유리해 정확함만 강조하면 약함
2. 비용 구조를 이해하는가? 자원 효율화 경험
불필요한 단계 제거 경험
후보 압축/선별 전략
실패 비용 고려 사고
원가 경쟁력도 중요해 '성능 개선'보다 '효율 개선'이 강함
3. 실질적 문제 해결 경험이 있는가? 현장 문제 해결 경험
데이터 기반 개선 경험
가설 설정 → 검증 → 개선 루프 경험
실행 중심 성향
4. 품질과 속도의 균형을 이해하는가? 검증 구조 언급 여부
리스크 관리 경험
단순 속도 강조 아님
품질 문제 발생 시 리스크가 큼

** 핵심 키워드: 후보 압축, 리드타임 단축, 비용 절감 구조, 효율 개선, 속도 + 정확도 균형

(예시) 문장 템플릿

  1. 리스크 기반 설계 강조형
    단일 예측 점수에 의존할 경우 발생할 수 있는 오판 리스크를 최소화하기 위해 예측 점수·구조적 검증·화학적 특성 분석을 통합한 다층 검증 체계를 설계하였습니다.
  2. Data Integrity 강조형 
    모델 간 인터페이스를 표준화하고 데이터 흐름을 구조화하여, 변경 발생 시 영향 범위를 추적 가능하도록 설계함으로써 재현성과 데이터 무결성을 확보하였습니다.
  3. 속도·시장 선점 강조형
    Recall 중심 1차 필터링을 통해 유망 후보 손실을 최소화하고, Precision 기반 2차 압축으로 실험 대상을 효율화함으로써 연구 리드타임 단축과 비용 절감이 가능한 구조를 구현하였습니다.
  4. Human-in-the-Loop 강조형
    예측 임계값을 연구자가 직접 조정할 수 있도록 설계하여, AI 자동화가 아닌 통제 가능한 의사결정 보조 시스템으로 구현하였습니다.
  5. 숫자 활용 설득형
    31,000개 후보를 2,800개로 압축하여 약 91%의 노이즈를 제거하였으며, 무작위 실험 대비 성공 확률을 15배 향상시켰습니다.

문제 설명 solution.py
수학에서 칸토어 집합은 0과 1 사이의 실수로 이루어진 집합으로, [0, 1]부터 시작하여 각 구간을 3등분하여 가운데 구간을 반복적으로 제외하는 방식으로 만들어집니다. 남아는 칸토어 집합을 조금 변형하여 유사 칸토어 비트열을 만들었습니다. 유사 칸토어 비트열은 다음과 같이 정의됩니다.

(1) 0 번째 유사 칸토어 비트열은 "1" 입니다.
(2) n(1 ≤ n) 번째 유사 칸토어 비트열은 n - 1 번째 유사 칸토어 비트열에서의 1을 11011로 치환하고 0을 00000로 치환하여 만듭니다.

남아는 n 번째 유사 칸토어 비트열에서 특정 구간 내의 1의 개수가 몇 개인지 궁금해졌습니다. n과 1의 개수가 몇 개인지 알고 싶은 구간을 나타내는 l, r이 주어졌을 때 그 구간 내의 1의 개수를 return 하도록 solution 함수를 완성해주세요.
def solution(n, l, r):
     answer = r - l + 1
     for num in range(l - 1, r):
          while num >= 1:
               a,b = divmod(num,5)
               if b == 2 or a == 2:
                    answer -= 1
                    break
               num = a
     return answer

프로젝트 7주차 타임라인 (Wed Feb 11 2026)


[22] Cellect Epitope – Technical Q&A

Question 1. 왜 Epitope 예측을 하나의 모델로 해결하지 않았나요?
(a) 기존에 충분한 데이터가 존재하는 항원 (in-distribution), (b) 데이터베이스에 없거나 서열 유사도가 낮은 신규 항원 (out-of-distribution)

이 두 경우는 입력 서열의 분포가 경우가 달라 단일 모델로 동시에 최적화 할 경우, (a) 기존 데이터에서는 과도한 일반화, (b) 신규항원에서는 데이터 편향에 의한 오판이 발생할 가능성이 큽니다. 따라서 문제 자체를 분리하고, 각 문제에 적합한 PLM을 선택하는 전략을 채택했습니다.

두 모델의 병팽은 성능 평균을 높이기 위한 앙상블이 아닌 문제 공간 자체는 분리하여 커버리지를 확장하는 전략입니다.
Question 2. ProtT5를 기존 데이터 기반 Epitope 분석에 사용한 이유는 무엇인가요?
                                      대규모 단백질 서열로 사전학습된 모델, downstream task fine-tuning 시 성능 향상이 큰 구조
본 프로젝트의 Epitope 데이터는 강한 도메인 특이성을 가진 점을 고려하였을때, ProtT5를 주어진 데이터로 fine-tuning함으로써 Epitope 길이 분포, 특정 mofit, 실험 조건에 따른 결합 패턴이 Embedding 단계부터 반영되도록 유도했습니다.
Question 3. ESM-2를 신규 항원 예측에 사용한 이유는 무엇인가요?
신규 항원 예측은 전형적인 out-of-distribusion(OOD) 문제로, 주어진 데이터에 강하게 fine-tuning된 모델은 학습 데이터에서 자주 등장한 패턴을 과신하거나 유사하지 않은 서열에 대한 과도한 확신을 보일 위험이 있습니다.

ESM-2는 특정 태스크보다 진화적 보존성, 구조적 제약, 기능적 보편성을 중심으로 학습된 모델입니다. 따라서 학습 데이터에 존재하지 않는 항원이라도 단백질로서 공통적으로 나타나는 Epitope 후보 특성을 근거로 보다 안정적인 예측을 수행할 수 있다고 판단했습니다 
Question 4. 왜 2-Stage Cascade 구조를 사용했나요?
Stage 1에서는 Recall을 최우선으로 설정해 “놓치지 않는 필터” 역할을 수행하고, Stage 2에서는 Precision을 높여 실제 실험 가능한 후보만 남기도록 설계했습니다. 이는 실험 파이프라인의 비용 구조를 반영해 False Negative(i.e. '유망한 Epitope를 놓침')과 False Positive(i.e. '불필요한 후보를 포함')를 줄이기 위한 방법입니다.
Question 5. Final Score는 어떤 의미를 가지나요?
Final Score는 PLM embedding 기반 예측 결과와 2-stage 모델의 단계별 신뢰도를 통합한 의사결정 점수입니다. 단일 확률값이 아닌 연구자가 후보 간 상대적 우선순위를 비교하고 cut-off를 유연하게 조정할 수 있도록 설계된 지표입니다.
Question 6. 구조 기반 검증을 별도로 수행한 이유는 무엇인가요?
서열 기반 예측만으로는 Epitope가 실제로 항체 접근이 가능한 위치인지 판단하기 어렵습니다. ESMFold를 통해 예측한 3D 구조 상에서 표면 노출 여부, 구조적 제약을 확인함으로써 서열 상으로는 유망하지만 물리적으로 결합 불가능한 후보를 추가로 제거할 수 있었습니다.
Question 7. In-silico Mutagenesis를 도입한 이유는 무엇인가요?
Epitope 내 모든 잔기가 결합에 동일하게 기여하지는 않습니다. 가상 변이를 통해 예측 점수 변화에 민감한 잔기와 소수성 변화에 따른 결합 안정성 변동을 분석함으로써 단순 “Epitope 후보”를 넘어 결합에 핵심적인 Hotspot Residue를 식별하고자 했습니다.
Question 8. 이 프로젝트에서 말하는 ‘설명 가능성’은 무엇을 의미하나요?
본 프로젝트에서의 설명 가능성은 왜 이 후보가 선택되었는지, 어떤 기준으로 탈락했는지를 점수·구조·화학적 근거로 단계별로 추적 가능하게 만드는 것을 의미합니다. 이는 실제 연구 환경에서 AI 결과를 신뢰하고 활용하기 위한 최소 조건이라고 판단했습니다.

문제 설명 solution.py
#139 당신은 일렬로 나열된 n개의 집에 택배를 배달하려 합니다. 배달할 물건은 모두 크기가 같은 재활용 택배 상자에 담아 배달하며, 배달을 다니면서 빈 재활용 택배 상자들을 수거하려 합니다.

배달할 택배들은 모두 재활용 택배 상자에 담겨서 물류창고에 보관되어 있고, i번째 집은 물류창고에서 거리 i만큼 떨어져 있습니다. 또한 i번째 집은 j번째 집과 거리 j - i만큼 떨어져 있습니다. (1 ≤ i ≤ j ≤ n)

트럭에는 재활용 택배 상자를 최대 cap개 실을 수 있습니다. 트럭은 배달할 재활용 택배 상자들을 실어 물류창고에서 출발해 각 집에 배달하면서, 빈 재활용 택배 상자들을 수거해 물류창고에 내립니다. 각 집마다 배달할 재활용 택배 상자의 개수와 수거할 빈 재활용 택배 상자의 개수를 알고 있을 때, 트럭 하나로 모든 배달과 수거를 마치고 물류창고까지 돌아올 수 있는 최소 이동 거리를 구하려 합니다. 각 집에 배달 및 수거할 때, 원하는 개수만큼 택배를 배달 및 수거할 수 있습니다.

트럭에 실을 수 있는 재활용 택배 상자의 최대 개수를 나타내는 정수 cap, 배달할 집의 개수를 나타내는 정수 n, 각 집에 배달할 재활용 택배 상자의 개수를 담은 1차원 정수 배열 deliveries와 각 집에서 수거할 빈 재활용 택배 상자의 개수를 담은 1차원 정수 배열 pickups가 매개변수로 주어집니다. 이때, 트럭 하나로 모든 배달과 수거를 마치고 물류창고까지 돌아올 수 있는 최소 이동 거리를 return 하도록 solution 함수를 완성해 주세요.
from itertools import zip_longest as zip

def tolist(l):
     n = []
     for i, d in enumerate(l):
          for _ in range(d):
               n.append(i + 1)
     return n

def solution(cap, n, deliveries, pickups):
     d = tolist(deliveries)
     p = tolist(pickups)
     d.reverse()
     p.reverse()
     d = d[::cap]
     p = p[::cap]
     return 2 * sum([max(x, y) for x, y   
                                                  in zip(d, p, fillvalue = 0)])

프로젝트 7주차 타임라인 (Tue Feb 10 2026)


[21] Cellect Epitope - Summary

Point 1. 왜 이 프로젝트를 시작했나?
항체 신약 개발에서 가장 어려운 단계 중 하나는 항체가 실제로 결합할 수 있는 항원의 Epitope를 찾는 일입니다. 이 과정은 현재도 대부분 Wet-lab 실험에 의존하고 있으며, 반복 실험으로 인한 높은 비용과 후보 선별에 소요되는 긴 개발 기간이라는 현실적인 한계를 안고 있습니다.

기존 AI 기반 epitope 예측 모델도 존재하지만 실제 실험 환경과 맥락을 충분히 반영하지 못한다는 점에서 현장 적용에는 한계가 있었습니다.
Point 2. Cellect Epitope의 접근 방식
Cellect Epitope는 단순 예측 모델이 아니라 “이 Epitope가 왜 유력한가?”를 설명해주는 의사결정 보조 플랫폼입니다. 연구자는 단순 점수뿐 아니라 실험 조건, 구조적 노출 여부, 그리고 화학적 결합 가능성까지 함께 확인하며 납득 가능한 후보를 선택할 수 있습니다.
Point 3. 핵심 모델링 전략
PLM 병행 전략: (a) ProtT5 - 기존 데이터 분포 내에서 epitope 패턴을 정밀 분석
                         (b) ESM-2 - 데이터베이스에 없는 신규 항원에 대한 일반화 성능 확보
                         → 정확도와 확장성을 동시에 확보하기 위한 이중 모델 전략

2-Stage Cascade 예측 파이프라인: (Stage 1) CatBoost - Recall 중심 필터링으로 유망 후보를 최대한 보존
                                                           (Stage 2) XGBoost - Precision 중심 선별로 실제 결합 가능성 높은 후보만 유지
                                                           → 실험 전 단계에서 후보 수를 효율적으로 압축
Point 4. 예측 신뢰성을 높이기 위한 3단계 검증
1. 점수 기반 검증: 다단계 예측 결과를 통합한 Final Score
2. 구조 기반 검증: ESMFold 연동, epitope의 단백질 표면 노출 여부 확인
3. 화학적 검증: In-silico mutagenesis 및 소수성 지표 분석을 통한 hotspot 식별
Point 5. 데이터 기반 성과 및 프로젝트의 가치
전체 후보 중 약 91% 선제 제거, True Positive 유지하면서 실험 대상 범위 대폭 축소, 실험 방식·질병 상태에 따른 결합 편차 학습 성공
연구 비용 절감 & 개발 기간 단축, 점수·구조·화학 지표 기반 설명 가능한 AI, 실제 연구 환경을 반영한 실무 중심 솔루션
구분 내용 링크

프로젝트
개요 및 설계

프로젝트 노션 https://www.notion.so/teamsparta/2d52dc3ef514811a876af52264105da3
SEPHO 팀 노션 https://www.notion.so/teamsparta/4-2fc2dc3ef5148064873dcc776ea0ba95
모델 및 결과 정리 PPT (결과 보고서) https://www.canva.com/design/DAG6VQIGPI8/hh5ZaGcGf7E2NPp4wGdoYQ/edit
대시보드 HuggingFace https://huggingface.co/spaces/yunuk0/epitope

문제 설명 solution.py
#138 Ax + By + C = 0으로 표현할 수 있는 n개의 직선이 주어질 때, 이 직선의 교점 중 정수 좌표에 별을 그리려 합니다. 예를 들어, 직선 5개를 좌표 평면 위에 그린 후, 정수로 표현되는 교점에 별을 그리면 다음과 같습니다.

위의 그림을 문자열로 나타낼 때, 별이 그려진 부분은 *, 빈 공간(격자선이 교차하는 지점)은 .으로 표현하면 다음과 같습니다.

"....*...."  
"........."  
"........."  
"*.......*"  
"........."  
"........."  
"........."  
"........."  
"*.......*"  

직선 A, B, C에 대한 정보가 담긴 배열 line이 매개변수로 주어집니다. 이때 모든 별을 포함하는 최소 사각형을 return 하도록 solution 함수를 완성해주세요.
from itertools import combinations
import math

def solution(line):
     dots_x = []
     dots_y = []
     for f1, f2 in combinations(line, 2):
          a, b, e = f1
          c, d, f = f2
          if a * d - b * c == 0:
               continue
          x = (b * f - e * d) / (a * d - b * c)
          y = (e * c - a * f) / (a * d - b * c)
          if x == int(x) and y == int(y):
               dots_x.append(int(x))
               dots_y.append(int(y))
     a = max(dots_x) - min(dots_x)
     b = max(dots_y) - min(dots_y)
     answer = [['.'] * (a + 1) for _ in range(b + 1)]
     for i in range(len(dots_x)):
          x = dots_x[i] - min(dots_x)
          y = -(dots_y[i] - max(dots_y))
          answer[y][x] = '*'
     return [''.join(a) for a in answer]

프로젝트 7주차 타임라인 (Mon Feb 9 2026)


[20] 최종 결과물 PPT


문제 설명 solution.py
#137 카카오배 양궁대회 운영위원회는 한 선수의 연속 우승보다는 다양한 선수들이 양궁대회에서 우승하기를 원합니다. 따라서, 양궁대회 운영위원회는 결승전 규칙을 전 대회 우승자인 라이언에게 불리하게 다음과 같이 정했습니다.

(1) 어피치가 화살 n발을 다 쏜 후에 라이언이 화살 n발을 쏩니다.
(2) 가장 작은 원의 과녁 점수는 10점이고 가장 큰 원의 바깥쪽은 과녁 점수가 0점입니다. 만약, k점을 어피치가 a발을 맞혔고 라이언이 b발을 맞혔을 경우 더 많은 화살을 k점에 맞힌 선수가 k 점을 가져갑니다. 단, a = b일 경우는 어피치가 k점을 가져갑니다. 
(3) 최종 점수가 더 높은 선수를 우승자로 결정합니다. 단, 최종 점수가 같을 경우 어피치를 우승자로 결정합니다.

현재 상황은 어피치가 화살 n발을 다 쏜 후이고 라이언이 화살을 쏠 차례입니다. 라이언은 어피치를 가장 큰 점수 차이로 이기기 위해서 n발의 화살을 어떤 과녁 점수에 맞혀야 하는지를 구하려고 합니다. 화살의 개수를 담은 자연수 n, 어피치가 맞힌 과녁 점수의 개수를 10점부터 0점까지 순서대로 담은 정수 배열 info가 매개변수로 주어집니다. 이때, 라이언이 가장 큰 점수 차이로 우승하기 위해 n발의 화살을 어떤 과녁 점수에 맞혀야 하는지를 10점부터 0점까지 순서대로 정수 배열에 담아 return 하도록 solution 함수를 완성해 주세요. 만약, 라이언이 우승할 수 없는 경우는 [-1]을 return 해주세요.
from itertools import combinations_with_replacement
from collections import Counter

def
solution(n, info):
     maxdiff,max_comb = 0,{}
     for combi in combinations_with_replacement(range(11), n):
         cnt = Counter(combi)
         score1, score2 = 0,0
         for i in range(1, 11):
              if info[10 - i] < cnt[i] : score1 += i
              elif info[10 - i] > 0 : score2 += i
         diff = score1 - score2
         if diff > maxdiff:
             max_comb = cnt
             maxdiff = diff
     if maxdiff > 0:
         answer = [0] * 11
         for n in max_comb:
              answer[10 - n] = max_comb[n]
         return answer
     else:
          return [-1]

 

프로젝트 6주차 타임라인 (Fri Feb 6 2026)


[19] 최종 결과물 - 대시보드 (5)

"사용 가이드" 페이지 요약
상호작용 Stage 1(포착)Stage 2(확신) 점수의 차이를 이해하고, Final Score의 가중치 산출 공식을 확인함
중요성 단순히 점수가 높다고 좋은 것이 아니라 어떤 임베딩 모델을 썼느냐에 따라 다른 기준점을 적용해야 함을 안내하여 잘못된 결론 도출을 방지함
상호작용 도구의 3대 핵심 활용처(viz. 순위 도출, 설계 최적화, 아키텍처 시연)를 파악하고, 제한 사항을 숙지함
중요성 AI 모델이 가진 한계(viz. Linear Epitope 한정, 데이터 편향 등)를 공개함으로써 연구자가 도구의 결과를 비판적으로 수용하고 올바른 환경에서만 사용하도록 유도함
상호작용 프로젝트의 출처와 개발 취지를 확인함
중요성 실제 연구 현장의 문제를 해결하기 위해 설계된 프로젝트임을 밝혀 서비스의 신뢰도를 마무리함

문제 설명 solution.py
#136 A 나라가 B 나라를 침공하였습니다. B 나라의 대부분의 전략 자원은 아이기스 군사 기지에 집중되어 있기 때문에 A 나라는 B 나라의 아이기스 군사 기지에 융단폭격을 가했습니다.

A 나라의 공격에 대항하여 아이기스 군사 기지에서는 무수히 쏟아지는 폭격 미사일들을 요격하려고 합니다. 이곳에는 백발백중을 자랑하는 요격 시스템이 있지만 운용 비용이 상당하기 때문에 미사일을 최소로 사용해서 모든 폭격 미사일을 요격하려 합니다.

A 나라와 B 나라가 싸우고 있는 이 세계는 2 차원 공간으로 이루어져 있습니다. A 나라가 발사한 폭격 미사일은 x 축에 평행한 직선 형태의 모양이며 개구간을 나타내는 정수 쌍 (s, e) 형태로 표현됩니다. B 나라는 특정 x 좌표에서 y 축에 수평이 되도록 미사일을 발사하며, 발사된 미사일은 해당 x 좌표에 걸쳐있는 모든 폭격 미사일을 관통하여 한 번에 요격할 수 있습니다. 단, 개구간 (s, e)로 표현되는 폭격 미사일은 s와 e에서 발사하는 요격 미사일로는 요격할 수 없습니다. 요격 미사일은 실수인 x 좌표에서도 발사할 수 있습니다.

각 폭격 미사일의 x 좌표 범위 목록 targets이 매개변수로 주어질 때, 모든 폭격 미사일을 요격하기 위해 필요한 요격 미사일 수의 최솟값을 return 하도록 solution 함수를 완성해 주세요.
def solution(targets):
     answer = 0
     targets.sort(key = lambda x:x[1])
     answer = 0
     end = -1
     for s, e in targets:
          if s >= end:
               answer += 1
               end = e
     return answer

 

프로젝트 6주차 타임라인 (Thu Feb 5 2026)


[17] 최종 결과물 - 대시보드 (4)

"모델 설계 방법" 페이지 요약
상호작용 DACON 공개 데이터셋 출처를 확인하고, 모델이 학습한 4가지 대분류 태그(Method, Assay 등)의 정의를 파악
중요성 실험 조건마다 결과가 달라지는 생물학적 특성을 반영하기 위해 변수를 어떻게 통합하고 정제했는지 공개하여 데이터 처리의 신뢰성을 높임
상호작용 Stage 1(CatBoost)의 Recall 중심 설계와 Stage 2(XGBoost)의 Precision 중심 설계의 차이를 인지함
중요성 1차에서 넓게 잡고 2차에서 정교하게 거르는 구조가 실제 실험 프로세스와 맞닿아 있음을 설명함
상호작용 ProtT5(내부 검증용)ESM-2(신규 예측용)의 이원화 전략을 이해함
중요성 단순히 성능이 좋은 모델을 쓴 것이 아니라 상황에 맞는 임베딩 모델을 분리 사용했음을 강조함
상호작용 두 개의 Confusion Matrix를 비교하며 2-stage 모델이 노이즈(TN)를 얼마나 효과적으로 제거했는지 확인함
중요성 데이터 누수 차단 사실과 실제 성능 지표를 투명하게 공개하여 연구자가 안심하고 도구를 채택하게 만듬

문제 설명 solution.py
#135 카카오톡에서는 이모티콘을 무제한으로 사용할 수 있는 이모티콘 플러스 서비스 가입자 수를 늘리려고 합니다. 이를 위해 카카오톡에서는 이모티콘 할인 행사를 하는데, 목표는 다음과 같습니다.

(1) 이모티콘 플러스 서비스 가입자를 최대한 늘리는 것.
(2) 이모티콘 판매액을 최대한 늘리는 것.
(3) n명의 카카오톡 사용자들에게 이모티콘 m개를 할인하여 판매합니다.
(4) 이모티콘마다 할인율은 다를 수 있으며, 할인율은 10%, 20%, 30%, 40% 중 하나로 설정됩니다.
(5)각 사용자들은 자신의 기준에 따라 일정 비율 이상 할인하는 이모티콘을 모두 구매합니다.
(6)각 사용자들은 자신의 기준에 따라 이모티콘 구매 비용의 합이 일정 가격 이상이 된다면, 이모티콘 구매를 모두 취소하고 이모티콘 플러스 서비스에 가입합니다.

카카오톡 사용자 n명의 구매 기준을 담은 2차원 정수 배열 users, 이모티콘 m개의 정가를 담은 1차원 정수 배열 emoticons가 주어집니다. 이때, 행사 목적을 최대한으로 달성했을 때의 이모티콘 플러스 서비스 가입 수와 이모티콘 매출액을 1차원 정수 배열에 담아 return 하도록 solution 함수를 완성해주세요.
from itertools import product

def solution(users, emoticons):
     E = len(emoticons)
     result = [0, 0]
     percents = (10, 20, 30, 40)
     prod = product(percents, repeat=E)
     for p in prod:
          prod_members, prod_price = 0, 0
          for buy_percent, max_price in users:
               user_price = 0
               for item_price, item_percent in zip(emoticons, p):
                    if item_percent >= buy_percent:
                         user_price += item_price * (100-item_percent) * 0.01
               if user_price >= max_price:
                    prod_members += 1
               else:
                    prod_price += user_price
          result = max(result, [prod_members, prod_price])
     return result

+ Recent posts