Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬 NZEC 오류란? 발생 원인과 해결 방법 총정리

NZEC란 무엇인가?

NZEC는 'Non-Zero Exit Code', 즉 0이 아닌 종료 코드를 의미합니다. 프로그램은 실행을 마칠 때 운영체제에 종료 코드를 반환하는데, 정상적으로 종료되었을 경우에는 0(Exit Code 0), 오류로 인해 비정상적으로 종료되었을 경우에는 0이 아닌 값이 반환됩니다. 따라서 NZEC 오류는 프로그램이 도중에 문제를 일으키고 비정상 종료되었다는 신호입니다.

파이썬과 자바는 예외 처리(Exception Handling)를 지원하기 때문에, try-except 블록을 활용하면 이러한 오류를 효과적으로 잡아낼 수 있습니다.

NZEC 오류는 대표적인 런타임(Runtime) 오류로, 주로 다음과 같은 상황에서 발생합니다.

  • 음수 인덱스처럼 유효하지 않은 배열 인덱스에 접근했을 때
  • 프로그램이 할당된 메모리보다 더 많은 메모리를 사용하려 할 때

파이썬에서는 Exception 클래스가 모든 오류와 예외의 최상위 클래스입니다. 아래와 같은 코드로 예외를 처리할 수 있습니다.

try:
    # 오류가 발생할 가능성이 있는 코드
except Exception as e:
    pass

예제 1: 입력 처리 실수

잘못된 방법:

x, y = map(int, input())

올바른 방법:

x, y = map(int, input().split())

input()은 한 줄 전체를 문자열로 받아오므로, 공백으로 구분된 여러 값을 입력받으려면 반드시 split() 함수로 나누어야 합니다. 첫 번째 코드는 문자열 전체를 int로 변환하려다 ValueError를 유발하고, 이것이 곧 NZEC 오류로 이어집니다.

NZEC 오류의 주요 발생 원인

  • 무한 재귀(Infinite Recursion) – 재귀 호출이 멈추지 않으면 스택 메모리가 고갈되어 비정상 종료됩니다.
  • 입출력 형식 불일치 – 출력 결과가 테스트 케이스와 한 글자까지 정확히 일치해야 합니다. 프로그램의 출력과 기대 출력을 자동으로 비교해 주는 검증 코드로 테스트하는 것이 좋습니다.
  • 기본적인 코딩 실수 – 0으로 나누기(ZeroDivisionError) 같은 단순한 실수도 NZEC의 흔한 원인입니다.
  • 변수 값 점검 – 변수에 담긴 값이 허용 범위를 벗어나지 않는지 확인하세요. 특히 C나 자바처럼 고정 크기 정수형을 쓰는 언어에서는 오버플로우에 주의해야 하며, 파이썬이라도 매우 큰 수 연산 시 성능 문제가 생길 수 있습니다.
  • 20 이상의 팩토리얼 직접 계산 – 큰 수의 팩토리얼을 반복문으로 직접 계산하면 시간이나 메모리 제한에 걸릴 수 있습니다. 이 경우 로그를 활용하거나 math.factorial, 동적 계획법 등 다른 방식을 찾아야 합니다.

CodeChef 같은 경쟁 프로그래밍 플랫폼에서는 대개 구체적인 오류 코드를 알려주지 않기 때문에, 스스로 디버깅해야 합니다. 엣지 케이스(경계값 사례)를 꼼꼼히 점검하고, 위에서 언급한 실수를 저지르지 않았는지 하나씩 확인해 보세요.

예제 2: 비효율적인 입력 방식 개선

비효율적인 방법:

for i in range(0, n):
    x = int(input())
    arr.append(x)

효율적인 방법:

arr = [int(k) for k in input().split()]

또는

arr = list(map(int, input().split()))

반복문 안에서 여러 번 input()을 호출하면 실행 시간이 길어져 시간 초과나 오류의 원인이 될 수 있습니다. 한 줄로 들어온 데이터를 split()과 map(), 리스트 컴프리헨션으로 한 번에 처리하면 훨씬 빠르고 안전합니다. 경쟁 프로그래밍에서는 이런 입력 처리 습관만으로도 NZEC와 TLE(Time Limit Exceeded) 오류를 상당 부분 예방할 수 있습니다.