코딩테스트는 최근 IT 업계에서 필수적으로 요구되는 능력 중 하나입니다. 기계적으로 문제를 푸는 것이 아니라, 문제의 핵심을 깊이 이해하고, 올바른 알고리즘과 자료 구조를 활용하는 능력이 필요합니다. 이번 강좌에서는 불우이웃돕기라는 주제로 알고리즘 문제를 선정하고, 그 문제를 해결하는 과정을 자세히 설명하겠습니다.
문제 설명
불우이웃돕기 프로그램은 복지 기관이 필요로 하는 금액을 기부자들이 모아주는 과정을 시뮬레이션하는 프로그램입니다. 기부자들은 서로 다른 금액을 기부할 수 있고, 이 기부금이 특정 금액에 도달했을 때, 프로그램은 기부금의 총액과 기부자 수를 출력해야 합니다.
문제 정의
다음과 같은 조건을 만족하는 프로그램을 구현하시오.
- 기부자 수는 N명이다. (1 ≤ N ≤ 100)
- 각 기부자는 1,000 이상의 금액을 기부할 수 있다.
- 목표 금액 M을 설정한다. (M은 1,000 이상의 자연수)
입력
첫 번째 줄에 기부자 수 N과 목표 금액 M이 공백으로 구분되어 주어진다.
두 번째 줄에는 각 기부자가 기부할 금액이 공백으로 구분되어 주어진다.
출력
기부금의 총액과 기부자 수를 출력한다. 총액이 M 이상일 경우, “목표 달성” 메시지를 함께 출력한다.
문제 해결 과정
이제 위 문제를 해결하기 위한 알고리즘을 단계적으로 살펴보겠습니다.
1단계: 문제 분석
문제를 해결하기 위해서는 입력으로 주어진 기부자 수와 각 기부자의 기부 금액을 이용해 총 기부 금액을 계산해야 합니다. 이후 이 총액이 목표 금액 M과 비교하여 조건을 체크하면 됩니다.
2단계: 알고리즘 설계
알고리즘은 다음과 같이 설계할 수 있습니다:
- 기부자 수 N과 목표 금액 M을 입력받는다.
- N명의 기부자가 기부한 금액을 리스트로 입력받는다.
- 리스트의 모든 요소를 합하여 총 기부 금액을 계산한다.
- 총 기부 금액이 M 이상인 경우, “목표 달성” 메시지를 포함하여 총액과 기부자 수를 출력한다.
- 그렇지 않은 경우에는 총액과 기부자 수만 출력한다.
3단계: 코드 구현
이제 위에서 설계한 알고리즘을 바탕으로 Python으로 코드를 구현해보겠습니다.
def main():
# 기부자 수 N과 목표 금액 M 입력
N, M = map(int, input().split())
# 기부자들이 기부하는 금액 리스트 입력
donations = list(map(int, input().split()))
# 기부금 총액 계산
total_donations = sum(donations)
# 결과 출력
print(f"총 기부금: {total_donations}, 기부자 수: {N}")
# 목표 금액과 비교
if total_donations >= M:
print("목표 달성")
if __name__ == "__main__":
main()
4단계: 코드 설명
위 코드는 다음과 같은 기능을 수행합니다:
- 첫 번째 줄에서 기부자 수와 목표 금액을 입력받고,
map
함수를 이용하여 정수로 변환합니다. - 두 번째 줄에서 각 기부자의 기부 금액을 리스트 형태로 입력받아 저장합니다.
sum()
함수를 사용하여 기부 금액의 총합을 구하고, 이를 출력합니다.- 총 기부 금액이 목표 금액 이상인지 검사하여 메시지를 출력합니다.
5단계: 성능 검토
이 문제의 시간 복잡도는 O(N)입니다. 기부자 수가 최대 100명이므로, 이 정도의 시간 복잡도는 코딩 테스트에서는 아주 효율적이라고 할 수 있습니다. 공간 복잡도는 O(N)으로, 기부 금액을 저장하기 위해 리스트를 사용하기 때문입니다.
6단계: 예제 및 테스트 케이스
코드의 신뢰성을 높이기 위해 여러 테스트 케이스를 준비했습니다:
테스트 케이스 1
입력:
5 10000 3000 4000 2000 5000 1500
출력:
총 기부금: 15500, 기부자 수: 5 목표 달성
테스트 케이스 2
입력:
3 20000 5000 6000 7000
출력:
총 기부금: 18000, 기부자 수: 3
이렇게 다양한 테스트 케이스를 통해 코드가 문제 없이 작동하는지 확인할 수 있습니다.
결론
이번 강좌에서는 불우이웃돕기를 주제로 하여, Python 알고리즘 문제를 해결하는 과정을 체계적으로 살펴보았습니다. 문제를 정확하게 이해하고, 이를 해결하기 위한 알고리즘을 단계적으로 구축하는 것이 중요하다는 점을 강조하고 싶습니다. 이러한 과정은 코딩 테스트 뿐만 아니라 실제 개발 환경에서도 유용하게 활용될 수 있습니다.
앞으로도 다양한 알고리즘 문제를 통해 실력을 쌓아가며, 각 문제를 해결하는 능력을 기르길 바랍니다. 감사합니다.