SOP (Standard Operating Procedure) 수립 회고
알고리즘 문제를 풀 때마다 플랫폼(백준 vs 프로그래머스)의 입출력 방식 차이로 코드가 꼬이는 것을 막기 위해, 나만의 범용 보일러플레이트(Boilerplate) 템플릿을 구축했습니다. 더 나아가, 함수형 프로그래밍의 핵심인 '데이터 불변성(Immutability)'과 '함수의 순수성(Purity)'을 템플릿의 기본 철학으로 강제하여 버그를 원천 차단하는 아키텍처를 설계했습니다.
알고리즘 문제 풀이도 소프트웨어 설계입니다. 입출력을 처리하는 로직과 수학적 로직이 섞여 있으면 디버깅이 어렵습니다.
main() (I/O 컨트롤러): 콘솔에서 데이터를 읽어와 파싱하고, 결과를 출력(print)하는 역할만 수행.solution() (비즈니스 컨트롤러): 플랫폼과 맞닿아 있는 함수. 데이터 전처리(정렬 등)를 수행하고 적절한 알고리즘 라이브러리를 호출.two_pointers() (순수 알고리즘 라이브러리): 정제된 파라미터를 받아 수학/알고리즘 연산만 수행 후 값을 return."a.sort()를 습관적으로 쓰다 보면, 원본 데이터를 훼손하는 나쁜 습관이 들지 않을까?"
배열을 매개변수로 넘길 때 파이썬은 '참조(Reference)'로 넘깁니다. 알고리즘 함수 내부에서 a.sort()(In-place 정렬)를 해버리면, 밖에서 그 데이터를 기다리던 다른 로직들은 순서가 뒤죽박죽된 오염된 데이터를 받게 되는 치명적인 부수 효과(Side Effect)가 발생합니다.
따라서 원본 데이터의 훼손을 막기 위해 항상 sorted(a)를 사용하여 독립적인 복사본을 만들어 넘겨야 합니다. 특히 return two_pointers(n, sorted(a), target_sum) 처럼 매개변수 위치에서 인라인(Inline)으로 호출하면, 불필요한 지역 변수 할당을 막고 가비지 컬렉터(GC)가 깔끔하게 메모리를 정리하는 파이썬다운(Pythonic) 코드가 완성됩니다.
실전 코딩 테스트에서 사용할 범용 뼈대입니다. (예시: 두 수의 합)
import sys
# [1. 전역 설정] 백준 시간 초과 방지
input = sys.stdin.readline
# ---------------------------------------------------------
# [2. 순수 알고리즘 라이브러리] - 연산만 수행
def two_pointers(n, sorted_a, target_sum):
start = 0
end = n - 1
count = 0
while start < end:
current_sum = sorted_a[start] + sorted_a[end]
if current_sum < target_sum:
start += 1
elif current_sum > target_sum:
end -= 1
else:
count += 1
start += 1
end -= 1
return count
# ---------------------------------------------------------
# [3. 비즈니스 로직 컨트롤러] - 프로그래머스 제출 환경
def solution(n, a, target_sum):
# 습관의 형성: 원본 데이터 'a'를 훼손하지 않고(a.sort() 금지),
# sorted(a)를 인라인으로 넘겨 불필요한 변수 할당을 막고 불변성을 유지한다.
return two_pointers(n, sorted(a), target_sum)
# ---------------------------------------------------------
# [4. 표준 입출력 컨트롤러] - 백준 환경
def main():
n = int(input())
a = list(map(int, input().split()))
target_sum = int(input())
# 여기서 a를 그대로 solution에 넘겨도, a의 원본 순서는 영원히 보호됨!
print(solution(n, a, target_sum))
# ---------------------------------------------------------
# [5. 프로그램 진입점]
# 내가 '직접' 실행할 때만 main() 구동. 모듈로 import 될 때는 실행 방지.
if __name__ == "__main__":
main()