djm03178   1달 전

내용이 상당 부분 https://www.acmicpc.net/board/view/23037 와 겹칠 수 있지만, 질문에서 자주 보이는 채점 결과에 대한 질문과 오해들을 중심으로 다시 정리해봤습니다. 또한  https://www.acmicpc.net/blog/view/55 를 먼저 읽은 뒤에 이 글을 읽으시는 것을 강력히 추천합니다.

  • 출력은 잘 나오는데 / 결과는 맞는데 / 답은 맞게 나오는데 뭐가 틀렸다는 건가요? : '틀렸습니다' 자체가 출력한 답이 틀렸다는 뜻입니다. 틀렸다는 건 채점 프로그램이 코드를 읽고 틀린 알고리즘이라고 판단하는 게 아니고, 그냥 주어진 조건 내의 어떤 입력을 프로그램에 넣었는데 오답을 출력한 것을 확인했을 뿐입니다. 그 이상의 의미는 없습니다. 이런 글을 쓰시는 분들은 대개 중요한 말을 빼먹으신 건데, "예제에 대한" 출력이 잘 나왔을 뿐이고, 채점 서버는 예제만 채점하는 게 아니기 때문에 이런 말을 하는 것 자체가 아무 의미가 없습니다. https://www.acmicpc.net/blog/view/55 의 BOJ 작동 원리를 읽어보세요.
  • Visual Studio / Eclipse / PyCharm / 컴파일러 / vim / 제 컴퓨터에서는 잘 되는데 왜 틀렸다고 하나요? : 역시 마찬가지입니다. 채점 서버가 예제만 넣어보는 게 아닌데, 예제만 넣어보고 잘 된다고 아무리 말해봐야 아무 의미가 없습니다.
  • 제 코드는 아무리 봐도 맞는데, 채점 프로그램이 잘못 판정했을 가능성은 없나요? : 네, 사실상 없습니다. 채점 프로그램에 문제가 있는 경우 자체가 극히 드물고, 채점 프로그램이 문제라면 다른 사람들도 이미 문제를 느끼고 제보를 했을 테니 금방 고쳐질 문제입니다. 오히려 입력 파일에 문제가 있을 가능성이 조금은 있는데, 푼 사람이 수백 명 단위라면 이마저도 가능성이 사실상 없다고 보시면 됩니다. 조금 주관적인(?) 확률을 보여드리자면 아래와 같으니, 과연 어느 쪽을 의심하는 것이 합리적일지 잘 생각해 보시기 바랍니다.
    • 내 코드가 틀렸을 확률: 99.9%
    • 데이터에 문제가 있을 확률: 0.0999%
    • 채점 프로그램에 문제가 있을 확률: 0.0001%
  • 제 컴파일러에서는 컴파일 에러가 안 나는데 왜 채점하면 나나요? : 컴파일러와 컴파일 환경이 같지 않기 때문입니다. 표준에서 정하지 않은 부분에 대해서는 어떤 컴파일러에서는 받아줄 수도 있지만 어떤 컴파일러에서는 안 될 수도 있습니다. 대표적으로 특정 헤더를 포함해야 사용할 수 있는 라이브러리를 어떤 컴파일러에서는 다른 헤더를 포함하는 것으로도 사용이 가능하지만 채점 서버의 컴파일러에서는 불가능할 수도 있습니다. 다음은 제가 아마 100번 이상 달아본 답변 내용입니다: 컴파일 에러는 "컴파일 에러"라고 쓰인 곳을 클릭하면 에러 메시지를 볼 수 있습니다.
  • 런타임 에러가 났다는 건 무슨 뜻인가요? 답은 맞게 나왔다는 뜻인가요? : 답이 맞게 나왔는지는 모릅니다. 출력한 답에 대한 판정 자체를 하지 않았기 때문입니다. 맞는 답을 출력했어도, 오답을 출력했어도, 출력 자체를 하기 전이었어도 비정상적으로 프로그램이 종료된 순간 받는 것이 런타임 에러입니다. 다만 그 케이스 이전의 케이스까지는 맞게 나온 것이 맞고, 그 케이스 이후의 케이스는 아예 테스트 자체를 안 해봤기 때문에 아무것도 알 수가 없습니다. 런타임 에러를 발생시키는 주 원인은 https://www.acmicpc.net/board/... 에서 보실 수 있습니다.
  • 시간 초과가 났다는 건 답은 맞게 나왔다는 뜻인가요? : 이것도 마찬가지입니다. 답이 맞게 나왔는지 자체를 판정을 안 합니다. 문제에 적힌 시간 제한을 넘길 때까지 프로그램이 종료되지 않아서 채점 프로그램이 강제로 프로그램을 종료하고 시간을 초과했다고 판정했을 뿐입니다.
  • 메모리 초과는 배열 범위를 넘어선 곳에 침범했다는 뜻인가요? : 아닙니다. 메모리 초과는 메모리를 문제에 적힌 메모리 제한보다 많이 할당받으려고 할 때 받습니다. 전역 변수든, 지역 변수든, 동적 할당이든 프로그램이 할당받는 총 메모리가 제한을 넘으면 받게 됩니다. 계속 강조하지만, 할당이 중요합니다. 할당받은 영역을 실제로 사용하는지 여부와는 관계 없습니다. 메모리 계산법 정도는 익혀두고, 기본적으로 할당받는 배열의 크기, 또는 최대 입력에서 동적으로 할당받는 메모리의 크기 등을 한 번 계산해 보세요.
  • 사용한 메모리를 계산해봐도 얼마 안 되는데 왜 이렇게 많이 나오나요? : 채점 환경에서 프로그램을 실행하기 위해 기본적으로 사용하는 메모리가 있습니다. 아주 단순한 프로그램이라도 그 프로그램이 돌기 위한 메모리가 일정량은 필요하기 때문입니다. 또한 사용하는 라이브러리에 따라서도 그 라이브러리가 기본적으로 사용하게 되는 메모리가 있습니다. 가상 머신 위에서 동작하는 Java나 Python 등의 언어에서는 그 가상 머신이 사용하는 메모리가 전부 포함되고, 기본 자료형을 사용하더라도 내부적으로 객체를 표현하기 위한 메모리가 훨씬 더 많이 필요할 수도 있습니다.
  • 배열 범위를 넘어서게 되는 코드인데 왜 런타임 에러가 안 나나요? : C, C++에서 배열 범위를 넘어서는 것 등의 잘못된 코드는 주로 undefined behavior입니다. 번역하면 '미정의 동작'입니다. 말 그대로 정의되지 않은 행동을 할 뿐이고, 그 행동이 무엇인지는 언어적으로 정해진 게 없습니다. 그러므로 그런 코드가 실행됐을 때는 어떤 결과가 나오더라도 이상하지 않습니다. 다른 변수의 값을 건드려서 무한루프를 돌게 만들어 시간 초과가 날 수도 있고, 메모리를 할당받는 명령을 지속적으로 실행해서 메모리 초과가 날 수도 있고, 출력을 계속 해서 출력 초과가 날 수도 있고, 아무 문제 없이 잘 돌아서 맞았습니다!! 가 나올 수도 있습니다. 물론 가상 머신 위에서 실행되는 Java나 Python 등의 언어는 그런 위험한 동작에 대한 검사를 가상 머신이 해주기 때문에 이런 경우 대부분 런타임 에러를 바로 받을 수 있습니다.
  • 0%에서 틀리면 프로그램이 시작하자마자 틀렸다는 뜻이고, 100%에서 틀리면 프로그램이 끝날 때 틀렸다는 뜻인가요? : 아닙니다. 채점 중에 뜨는 %는 채점 서버에 있는 여러 테스트 케이스 중 몇 번째 케이스를 테스트 중인지를 백분율로 나타낸 것에 불과하고, 프로그램의 실행이 어디까지 된 것인지는 알 수 없습니다. 다시 강조하지만 채점 프로그램은 예제만 넣어보는 게 아니고, 대체로 수십 개 정도의 케이스를 가지고 프로그램을 여러 번 테스트합니다. 그래서 몇 %에서 틀렸는지는 거의 의미가 없고, 다만 채점 순서가 대체로 입력량이 큰 순이므로 거의 끝까지 가서 틀렸다면 아마도 매우 작은 케이스에서 예외가 있을 거라는 추측 정도만 할 수 있습니다.
  • 제한 시간 / 메모리를 넘겼는데도 왜 맞았습니다!! 를 받나요? : 언어별 시간 / 메모리 보너스 때문입니다.  https://www.acmicpc.net/help/language
  • 출력 초과는 왜 받나요? : 채점 프로그램은 각 테스트 케이스에 대한 답이 얼마나 큰지 알기 때문에, 프로그램이 정답에 비해 너무 압도적으로 많은 출력을 하려고 하면 굳이 끝까지 기다리지 않고 바로 끊어버립니다. 이런 경우 대부분 1. 디버깅용으로 출력하는 코드가 그대로 남아있거나 2. 위에서 언급한 undefined behavior 때문에 반복적으로 출력문이 실행되거나 3. 경우에 따라 출력 양식이 달라져야 하는 경우 (예를 들면, 답이 존재하지 않으면 NO 한 줄만 출력하고, 존재하면 N줄의 정수를 출력해야 할 때) 적게 출력해야 하는 경우를 판단하지 못해서 많이 출력하는 경우입니다.
  • 출력 형식이 잘못되었습니다는 무슨 형식이 틀렸다는 건가요? : 일단 일반적인 문자(알파벳, 숫자 등)가 틀리면 이 대신 '틀렸습니다'를 받습니다. '출력 형식이 잘못되었습니다'는 이런 것들은 맞았는데, 공백이 맨 앞이나 중간에 불필요하게 더 들어가 있다거나, 빈 줄을 출력해야 하는 곳에 하지 않았거나 등의 경우에 발생합니다. 정말로 예제와 한 글자도 다름없이 100% 일치하는지 다시 확인해 보세요.

gunwookim   1달 전

이옝! 사랑해여!

kyo20111   1달 전

100%에서 틀리면 최근에 추가된 테스트케이스를 의심해 볼수도 있죠

djm03178   8일 전

그런 경우는 매우 드물고, 간혹 발견되는 것들은 대부분 일찍 다른 분들에 의해 잡힙니다. 문제를 많이 풀어보신 것도 아닌데 어떻게 '상당수' 있다고 생각하시는지 모르겠군요.

wider93   5일 전

3처럼 질문하시는 분들은 채점 프로그램과 입력 데이터를 구분해서 질문하는 건 아닐 거라고 생각합니다...

djm03178   5일 전

둘의 차이를 모르시는 분들을 위해 쓴 게 이 FAQ고, 둘의 차이를 아는 사람이라면 당연히 '입력 데이터'를 '채점 프로그램'이라고 써서는 안 되는 겁니다.

댓글을 작성하려면 로그인해야 합니다.