
제품 소프트웨어 패키징에서는 개발이 완료된 소프트웨어를 사용자가 설치하고 사용할 수 있도록 구성하는 과정을 학습하였다. 특히 배포 파일 구성, 설치 절차, 패키징 시 고려해야 할 보안 및 호환성 요소를 이해하였다.
애플리케이션 테스트 케이스 설계에서는 프로그램이 요구사항에 맞게 동작하는지 확인하기 위한 테스트 케이스 작성 방법을 학습하였다. 입력값, 실행 조건, 예상 결과를 기준으로 테스트 항목을 구성하고, 오류를 사전에 발견하기 위해 체계적인 테스트 설계가 필요하다는 점을 배웠다.
애플리케이션 통합 테스트에서는 개별 모듈을 결합한 뒤 전체 시스템이 정상적으로 동작하는지 확인하는 과정을 학습하였다. 단위 테스트 이후 모듈 간 인터페이스와 데이터 흐름을 점검해야 하며, 통합 과정에서 발생할 수 있는 오류를 확인하는 것이 중요하다는 점을 알 수 있었다.
애플리케이션 성능 개선에서는 프로그램의 실행 속도, 자원 사용량, 응답 시간 등을 분석하고 개선하는 방법을 학습하였다. 성능 저하의 원인을 파악한 뒤 알고리즘 개선, 불필요한 연산 제거, 자원 사용 최적화 등을 통해 애플리케이션의 효율성을 높일 수 있다는 점을 이해하였다.
import heapq
# 1. 정렬 후 선택 Greedy
# 회의 시작 시간과 종료 시간이 주어졌을 때, 최대한 많은 회의를 선택하는 문제
def meeting_room(meetings):
# 종료 시간이 빠른 순서로 정렬
meetings.sort(key=lambda x: (x[1], x[0]))
count = 0
end_time = 0
for start, end in meetings:
if start >= end_time:
count += 1
end_time = end
return count
meetings = [(1, 4), (3, 5), (0, 6), (5, 7), (8, 9), (5, 9)]
print("선택 가능한 최대 회의 수:", meeting_room(meetings))
# 2. Heap Greedy
# 현재 선택 가능한 후보 중 가장 큰 값을 선택하는 문제
def max_profit(jobs):
# jobs = (마감일, 보상)
jobs.sort()
heap = []
for deadline, profit in jobs:
heapq.heappush(heap, profit)
# 마감일보다 선택한 작업 수가 많으면 보상이 가장 작은 작업 제거
if len(heap) > deadline:
heapq.heappop(heap)
return sum(heap)
jobs = [(1, 50), (2, 10), (2, 20), (1, 30)]
print("얻을 수 있는 최대 보상:", max_profit(jobs))
# 3. 비용 최소화 Greedy
# 여러 단위의 가격이 주어졌을 때, 가장 저렴한 비용부터 처리
def min_cost_purchase(prices, amount):
# prices = (가격, 구매 가능 수량)
prices.sort()
total_cost = 0
for price, count in prices:
buy = min(amount, count)
total_cost += price * buy
amount -= buy
if amount == 0:
break
return total_cost
prices = [(300, 3), (100, 2), (200, 4)]
amount = 5
print("최소 구매 비용:", min_cost_purchase(prices, amount))
# 4. 문자열 및 스택 Greedy
# 숫자 문자열에서 k개의 숫자를 제거하여 가장 큰 수 만들기
def make_big_number(number, k):
stack = []
for num in number:
while stack and k > 0 and stack[-1] < num:
stack.pop()
k -= 1
stack.append(num)
# 제거 횟수가 남아 있다면 뒤에서 제거
if k > 0:
stack = stack[:-k]
return ''.join(stack)
number = "1924"
k = 2
print("만들 수 있는 가장 큰 수:", make_big_number(number, k))
이번 주에는 코딩테스트 대비를 위해 Greedy 유형 문제 풀이를 진행하였다. Greedy 알고리즘은 매 순간 가장 유리해 보이는 선택을 통해 전체 최적해를 구하는 방식이라는 점을 이해하고, 문제 조건에 따라 어떤 기준으로 선택해야 하는지 판단하는 연습을 하였다.
정렬 후 선택 유형에서는 주어진 데이터를 특정 기준으로 정렬한 뒤 앞에서부터 조건에 맞는 값을 선택하는 문제를 풀이하였다. 구간 그리디에서는 끝점이나 진출 지점을 기준으로 선택하여 최소 횟수나 최대 개수를 구하는 방식을 익혔다.
커버 그리디에서는 현재 위치를 기준으로 가장 멀리 덮을 수 있는 선택을 하는 방식의 문제를 학습하였다. Heap 그리디에서는 현재 선택 가능한 후보 중 최댓값이나 최솟값을 우선순위 큐를 활용해 고르는 방법을 연습하였다.
마감일 스케줄링 유형에서는 마감일을 기준으로 정렬한 뒤, 조건을 초과하는 경우 가치가 낮은 항목을 제거하는 방식의 문제를 풀이하였다. 비용 최소화 유형에서는 작은 비용부터 처리하거나, 더 저렴한 조건에서 최대한 많이 처리하는 방식으로 최적해를 구하는 연습을 하였다.
누적 최적 유형에서는 현재까지의 최솟값이나 최댓값을 유지하면서 이후 선택을 판단하는 방법을 학습하였다. 문자열 및 스택 그리디에서는 앞자리 값이나 사전순을 고려하여 불리한 이전 선택을 제거하는 방식의 문제를 풀이하였다.
또한 수학적 그리디 유형에서는 수의 성질과 연산 규칙을 이용하여 최소 연산 횟수나 최적의 값을 구하는 문제를 학습하였다. 이를 통해 Greedy 문제는 단순히 큰 값이나 작은 값을 고르는 것이 아니라, 선택 기준이 전체 최적해로 이어지는지 판단하는 과정이 중요하다는 점을 알 수 있었다.