lcr7324   1년 전

들어가기 전에...

알람 시계는 백준 질문 게시판에서 질문이 가장 많이 올라오는 문제 중 하나입니다. 단계별로 풀어보기의 초반부에 위치하면서도, 보기보다 까다로운 조건 분기로 인해 코딩 입문자가 한번에 맞히기 절대 쉽지 않은 문제라 생각합니다. 때문에 이 글을 작성하는 2022년 9월 27일 기준으로 질문 게시판 19페이지에 달하는 엄청난 수의 질문이 쌓이는 문제가 되고 말았습니다.

질문이 수백개에 달하는 만큼 코드도 가지각색입니다. 하지만 의외로 틀렸습니다 혹은 런타임 에러를 받는 이유는 몇 가지 되지 않습니다. 올라오는 질문의 대부분은 이미 이전에 올라온 질문 몇 개만 찾아봐도 반례를 찾을 수 있거나, 본인과 동일한 이유로 질문한 다른 이가 이미 있는 경우입니다.

이 사실이 너무나도 안타까워 질문 게시판의 C / C++ / Java / Python 코드를 총 297개 수집하여 분석하고 이 글을 작성하게 되었습니다. 이 문제에서만 3년 전부터 꾸준히 한 달에 20개 가량의 질문이 올라오고 있는데, 이 글을 계기로 무의미한 질문이 한 달에 5개 이내로 줄었으면 하는 것이 제 바람입니다.

또한, 질문 게시판에 글을 올리기 위해서는 질문 게시판 공지사항을 반드시 읽도록 되어 있는데, 이 공지사항 가장 위에 쓰여 있는 질문 검색을 먼저 해서 자신에게 필요한 답변이나 반례가 없는지 확인하고 질문을 남겨주세요. 라는 문구만큼은 모두 꼭 숙지하셨으면 하는 것이 또다른 바람입니다.

첫 번째로 확인할 것: 예제

놀랍게도, 297개의 코드 중 예제를 통과하지 못하는 코드가 83개에 달합니다. 당신의 코드라고 예외라는 법은 없습니다. 다음을 꼭 확인해주세요.

1. 문제에서 요구하는 대로 올바르게 출력하고 있는지 확인해주세요. 시와 분은 하나의 공백으로 구분되어야 하며, 불필요한 0을 출력해서는 안됩니다.

  • 시와 분 사이에 공백이 없으면 틀립니다.
  • 시와 분 사이에 공백이 아닌 다른 문자(콜론, 쉼표 등)를 출력하면 틀립니다.
  • 시와 분 사이에 공백을 2개 이상 출력하면 틀립니다.
  • 불필요한 0을 출력하면 안된다는 것은 다음을 의미합니다.
    • 3시 7분이 답이라면, 03 07과 같은 형태로 출력하면 틀리고 3 7으로 출력해야 한다는 뜻입니다.
    • 0시 20분이 답이라면, 0 20을 출력해야 합니다.
    • 16시 정각이 답이라면, 16 0을 출력해야 합니다.
    • 자정이 답이라면, 0 0을 출력해야 합니다.
입력
10 50

정답
10 5

오답 예시
10:5
10 05
10  5
10:05
105
10시 5분

2. 문제에서 요구하는 대로 올바르게 입력을 받고 있는지 확인해주세요. 시와 분은 공백으로 구분되어 주어집니다. 줄바꿈이 아닙니다. 특히 파이썬 코드에서 굉장히 자주 발견되는 에러입니다. 제가 수집한 것 중에는 8개가 해당합니다.

# 틀린 코드의 예시
h = int(input())
m = int(input())

# 올바른 입력 방법의 예시
h, m = map(int, input().split())

3. 예제를 통과하는지 직접 코드를 실행해서 확인해주세요. tio.run과 같은 온라인 코드 실행 사이트를 이용하는 것을 권장합니다. 이 코드가 왜 틀렸나요? 라는 질문이 올라왔는데 코드가 예제조차 통과하지 않는 것을 발견하면 답변자는 크나큰 괴로움과 분노에 빠집니다. 만일, 예제를 통과하지 않는 것을 이미 알고 있지만 본인의 코드가 왜 그렇게 작동하는 건지가 궁금한 상황이라면, 그 상황을 질문에 꼭 명시해주세요. 이 경우는 문법에 관한 설명과 코드가 작동되는 방식에 대한 설명을 답변으로 받을 가능성이 있습니다. 그렇지 않으면 받게 될 답변은 예제를 통과하지 못한다는 한마디 뿐입니다. 답변자도 사람인지라, 무성의한 질문에는 대개의 경우 무성의한 답변이 따릅니다. 잊지 마세요.

  • 코드를 수정했으면, 다시 첫 번째 예제부터 전부 확인해야 합니다. 맞게 나오던 입력이 코드 수정 후 다시 틀리는 것은 굉장히 흔한 일입니다.
  • 질문에 올리려고 했던 바로 그 코드를 확인해야 합니다. 테스트한 코드와 질문에 올린 코드가 다른 경우도 굉장히 흔합니다.

두 번째로 확인할 것: 반례

예제를 통과한 214개의 코드 중 141개의 코드가 다음 반례를 통과하지 못합니다. 다시 말해, 만약 당신이 예제는 맞는데 틀렸습니다를 받고 있다면, 당신의 코드도 60% 이상의 확률로 다음 반례를 통과하지 못할 겁니다.

입력
0 45

정답
0 0

다시 한번, 질문을 올리기 전에 질문 검색을 먼저 해서 자신에게 필요한 답변이나 반례가 없는지 확인하고 질문을 남겨주세요. 질문이 수백개가 쌓여있는 상황이다보니 도저히 다 읽을 엄두가 안 나는 것도 이해가 갑니다만, 대개의 경우는 몇 개만 확인해도 충분할 겁니다. 이 문제에 올라온 질문 중 수십개 이상에는 0 45가 반례라는 답변이 이미 달려있습니다. 기존에 올라온 질문들을 살피는 요령을 조금 드리자면,

  • 코드 내용보다 답변으로 달린 반례를 눈여겨 보세요.
  • 언어를 가릴 필요가 없습니다. 여러 언어에서 공통적으로 많이 틀리는 반례도 많습니다.

반례 모음

열심히 프로그램 돌려서 엄선한 반례 모음입니다. 이 10개의 입력을 전부 통과하면 99%는 맞았습니다!를 받을 수 있다고 자신합니다. 실제로 제가 수집한 297개의 코드 중 아래 반례를 전부 넣었을 때 전부 통과하는 것은 단 2개였는데, 그 2개의 코드는 그대로 제출했을 때 맞았습니다!를 받았습니다. 실수로 다른 코드를 올린 것인지, 아니면 답변을 받은 후 질문 글 코드를 수정한 것인지는 알 수 없지만요.

입력         정답
0 0          23 15
0 44         23 59
0 45         0 0
0 46         0 1
1 40         0 55
16 44        15 59
16 45        16 0
16 46        16 1
17 0         16 15
23 59        23 14

마치며...

0 45라는 반례는 이 문제에만 해당하지만, 이 글에서 설명한 오답에 대처하는 방법론은 이 문제에만 해당하는 것이 아니라 다른 문제들에도 해당합니다. 다른 문제의 경우 확인할 것이 더 많겠지만, 최소한 이 글에서 설명한 내용은 반드시 확인해야 한다는 뜻입니다. 문제에서 요구하는 대로 입력을 받고 출력하고 있는지, 예제는 확실하게 통과하는지, 질문 게시판에 올라오는 반례들은 통과하는지를 꼭 확인합시다.

즐거운 백준 되세요. 감사합니다.

djm03178   1년 전

한 가지 첨언하자면, 예제를 통과하지 못하는 코드가 많은 건 예제 2번 이후가 추가된지가 오래되지 않았기 때문도 있습니다.

lcr7324   1년 전

질문 게시판 1페이지에서 두 달 반을 버텼네요. 결국 묻히게 되었지만..

nanolist   5달 전

감사합니다. 

작성하신 글을 보면서 문제를 해결할 수 있었습니다.

swj03   4달 전

덕분에 뭐가 모자랐을지 제가 직접 찾아보고 해결할 수 있었어요 감사합니다.

smilingwon20   2달 전

감사합니다

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