2026-1-Algorithm-assignments: 3월 10일 강의 과제 알고리즘 문제 풀이 및 구현
2026년 1학기 알고리즘 강의의 실습 과제인 알고리즘 문제 풀이 결과물을 push했습니다. 다양한 알고리즘 문제에 대한 파이썬 코드를 작성했습니다.
2026-1-Algorithm-assignments: 3월 10일 강의 과제 알고리즘 문제 풀이 및 구현
2026년 1학기 알고리즘 강의의 실습 과제인 알고리즘 문제 풀이 결과물을 push했습니다. 다양한 알고리즘 문제에 대한 파이썬 코드를 작성했습니다.
요약
이번 커밋에서는 2026년 3월 10일에 main 브랜치에 2026-1-Algorithm-assignments 레포지토리에 총 331라인의 코드를 추가했습니다. .gitignore 파일을 제외한 4개의 파이썬 파일에 새로운 알고리즘 구현과 테스트 코드가 포함되었습니다.
구현 내용
이번 커밋에서는 총 4개의 파이썬 파일에 대한 수정이 있었습니다.
변경된 파일 목록
.gitignoreWeek01_problem/1.1.seqsearch_problem.pyWeek01_problem/1.2.arrsum_problem.pyWeek01_problem/1.3.exchangesort_problem.pyWeek01_problem/leetcode_1365_problem.py
총 331라인의 코드가 추가되었고, 삭제된 라인은 없습니다.
주요 변경사항 상세 설명
Week01_problem/1.1.seqsearch_problem.py
이 파일은 선형 검색(Sequential Search) 알고리즘을 구현합니다. 주어진 배열 S에서 특정 값 x를 찾아 그 위치(index)를 반환합니다. 만약 x가 배열에 없으면 -1을 반환합니다. for-else 구문을 활용하여 break 없이 루프가 종료될 경우 (즉, 요소를 찾지 못한 경우) -1을 할당합니다. 다양한 테스트 케이스를 통해 기능이 검증되었습니다.
def seqsearch(n, S, x): # n: size of the array, S: input array, x: target value
location = 0
for i in range(n): # i = 0 부터 n - 1까지 순회
if S[i] == x: # 이번 원소가 x와 같다면, 이번 위치 i를 저장
location = i
break # 찾았으므로 반복문 종료
else: # for 루프가 break 없이 전부 끝났다면
location = -1
return location
Week01_problem/1.2.arrsum_problem.py
이 파일은 배열의 모든 원소를 합산하는 arrsum 함수를 구현합니다. 입력된 배열 S의 크기 n을 받아 각 원소를 순회하며 result 변수에 더해 최종 합계를 반환합니다. 다양한 양수, 음수, 혼합, 그리고 빈 배열에 대한 테스트 케이스를 포함합니다.
def arrsum(n, S):
result = 0
for i in range(n):
result += S[i]
return result
Week01_problem/1.3.exchangesort_problem.py
이 파일은 교환 정렬(Exchange Sort) 알고리즘, 일반적으로 버블 정렬의 한 형태로 볼 수 있는 구현을 포함합니다. 이중 반복문을 사용하여 배열 S의 모든 원소를 오름차순으로 정렬합니다. 바깥 루프는 기준 원소(S[i])를 선택하고, 안쪽 루프는 기준 원소 뒤의 원소(S[j])와 비교하여 필요시 자리를 바꿉니다.
def exchangesort(n, S):
for i in range(len(S)-1): # S의 모든 원소에 대해서 (range(배열의 크기)과 동일 = 0 1 2 ... n-1) # 일명 ANCHOR
for j in range(i + 1, len(S)): # i + 1번째 (이번 원소의 다음 원소) 부터 n - 1 (마지막 원소) 까지 순회 # ANCHOR와의 비교대상
if S[i] > S[j]: # 이번 원소가 다음 원소보다 크다면
S[i], S[j] = S[j], S[i] # 더 큰 이번 원소를 그 원소 위치로 보내고 그 원소는 이번 원소 자리로 가져온다
Week01_problem/leetcode_1365_problem.py
이 파일은 LeetCode 문제 "How Many Numbers Are Smaller Than The Current Number"를 해결합니다. 주어진 배열 nums의 각 원소 nums[i]에 대해, nums[i]보다 작은 숫자가 배열에 몇 개 있는지 계산하여 새로운 배열을 반환합니다. 이 구현에서는 먼저 배열을 정렬하여 각 숫자의 위치를 파악하고, 이를 바탕으로 원래 배열의 각 숫자에 대해 자신보다 작은 숫자의 개수를 효율적으로 계산합니다. 중복된 숫자를 처리하기 위해 딕셔너리를 사용하여 한 번의 정렬 후 각 숫자의 첫 등장 위치를 저장합니다.
class Solution(object):
def smallerNumbersThanCurrent(self, nums):
s_nums = sorted(nums)
count = {}
for i, num in enumerate(s_nums): # 오름차순 정렬된 s_nums에 대하여 enumerate로 s_nums의 원소 num과 그 원소의 인덱스 i를 동시에 순회
if num not in count: # 이번 원소 num이 아직 count 딕셔너리에 아직 없거나 같은 수가 배열에 여러 개 있을 수 있습니다.
count[num] = i # num보다 작은 수의 개수는 num이 s_nums에서 처음 나오는 위치 인덱스 i와 같습니다.
for i, num in enumerate(nums): # 정렬되지 않는 nums에 대하여 enumerate로 nums의 원소 num과 그 원소의 인덱스 i를 동시에 순회
nums[i] = count[num] # count에 저장된 num보다 작은 수의 개수를 nums의 원소 num이 있는 위치 i에 저장합니다.
return nums
배운 점 및 개선점
이번 작업을 통해 기본적인 알고리즘인 선형 검색, 배열 합산, 그리고 간단한 정렬 알고리즘을 파이썬으로 구현하는 연습을 했습니다. LeetCode 문제 해결 과정에서는 정렬된 배열을 활용하여 문제 해결의 효율성을 높이는 방법을 학습했습니다. 특히, 중복된 값을 처리하기 위해 딕셔너리를 사용하여 시간을 절약하는 방법을 익혔습니다.
앞으로 개선할 점은 다음과 같습니다.
- 각 알고리즘의 시간 복잡도와 공간 복잡도에 대한 분석을 추가하는 것이 필요합니다.
- 더 다양한 테스트 케이스를 추가하여 코드의 견고성을 높여야 합니다.
- 다른 정렬 알고리즘(예: 삽입 정렬, 선택 정렬)도 구현하여 비교해볼 필요가 있습니다.
다음 단계로는 더 복잡한 알고리즘 문제에 도전하고, 각 알고리즘의 성능을 최적화하는 방법에 대해 학습할 계획입니다.
참고 자료
- CSE304-2025-2-Algorithms 강의 자료 (Week01)
- LeetCode: How Many Numbers Are Smaller Than The Current Number (https://leetcode.com/problems/how-many-numbers-are-smaller-than-the-current-number)