SOP (Standard Operating Procedure) 수립 회고
백준(BOJ)과 프로그래머스는 입출력 환경이 완전히 다릅니다. 백준은 날것의 문자열을 직접 파싱해야 하고, 프로그래머스는 정제된 매개변수를 던져줍니다. 이 두 플랫폼 사이에서 코드를 짤 때마다 헷갈리는 것을 방지하고, '관심사의 분리(Separation of Concerns)'를 완벽하게 지키기 위해 나만의 범용 보일러플레이트(Boilerplate) 템플릿을 구축했습니다.
알고리즘 문제 풀이도 결국 소프트웨어 엔지니어링의 일환입니다. 입출력을 처리하는 로직과 실제 문제를 푸는 수학적 로직이 섞여 있으면 디버깅이 어렵고 코드를 재사용할 수 없습니다.
main()의 역할 (I/O 전담): 콘솔에서 데이터를 읽어와 파싱하고, 결과를 출력하는 역할만 수행합니다.solution()의 역할 (비즈니스 로직 전담): 데이터를 가공하여 정답을 도출하는 순수 수학/알고리즘 연산만 수행합니다.이렇게 설계하면 백준에서 통과한 solution() 내부 로직만 그대로 복사해서 프로그래머스에 제출해도 단 한 줄의 수정 없이 통과할 수 있는 플랫폼 독립성을 얻게 됩니다.
실전 코딩 테스트에서 타건 시간을 최소화하기 위해 군더더기를 모두 뺀 가장 축약된 형태의 템플릿입니다. 앞으로 모든 문제는 이 뼈대 위에서 시작합니다.
import sys
# [1. 전역 설정] 백준 시간 초과 방지
input = sys.stdin.readline
# ---------------------------------------------------------
# [2. 비즈니스 로직 전담 구역]
# 프로그래머스 환경과 동일. 내부에 print나 input을 절대 넣지 않는다.
def solution(N, M, A):
answer = 0
# ... 핵심 알고리즘(투 포인터, 이분 탐색 등) 수행 ...
return answer
# ---------------------------------------------------------
# [3. I/O 및 컨트롤러 구역]
def main():
# 3-1. 입력 파싱 (문제에 맞게 수정)
# ex) N, M = map(int, input().split())
# ex) A = list(map(int, input().split()))
# 임시 목업 데이터 (실제 풀이 시 삭제)
N, M = 0, 0
A = []
# 3-2. 로직 호출 및 출력
result = solution(N, M, A)
print(result)
# ---------------------------------------------------------
# [4. 프로그램 진입점]
if __name__ == "__main__":
main()
if __name__ == "__main__": 은 왜 쓰는 걸까?파이썬 코드를 작성하며 가장 궁금했던 것은 "선언한 적도 없는 __name__이라는 변수를 어떻게 조건문에서 비교하고 있는가?" 였습니다. 이 특수 내장 변수(Magic Variable)의 작동 원리를 파헤친 결과는 다음과 같습니다.
__name__ = "__main__"을 할당해 줍니다. 즉, 이 조건문이 True가 되어 main()(입출력 및 테스트)이 정상 작동합니다.import 해서 쓰려고 하면, 파이썬은 __name__에 __main__ 대신 '파일의 원래 이름'을 넣어줍니다. 조건문이 False가 되므로, 무거운 main()의 입출력 과정이 멋대로 실행되는 것을 완벽하게 차단하고 순수 함수(solution)만 안전하게 가져다 쓸 수 있습니다.이 원리를 이해함으로써, 이제 내가 작성하는 템플릿의 모든 코드를 100% 통제할 수 있게 되었습니다.