알람 시계는 백준 질문 게시판에서 질문이 가장 많이 올라오는 문제 중 하나입니다. 단계별로 풀어보기의 초반부에 위치하면서도, 보기보다 까다로운 조건 분기로 인해 코딩 입문자가 한번에 맞히기 절대 쉽지 않은 문제라 생각합니다. 때문에 이 글을 작성하는 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 45라는 반례는 이 문제에만 해당하지만, 이 글에서 설명한 오답에 대처하는 방법론은 이 문제에만 해당하는 것이 아니라 다른 문제들에도 해당합니다. 다른 문제의 경우 확인할 것이 더 많겠지만, 최소한 이 글에서 설명한 내용은 반드시 확인해야 한다는 뜻입니다. 문제에서 요구하는 대로 입력을 받고 출력하고 있는지, 예제는 확실하게 통과하는지, 질문 게시판에 올라오는 반례들은 통과하는지를 꼭 확인합시다.
lcr7324 1년 전 48
들어가기 전에...
알람 시계는 백준 질문 게시판에서 질문이 가장 많이 올라오는 문제 중 하나입니다. 단계별로 풀어보기의 초반부에 위치하면서도, 보기보다 까다로운 조건 분기로 인해 코딩 입문자가 한번에 맞히기 절대 쉽지 않은 문제라 생각합니다. 때문에 이 글을 작성하는 2022년 9월 27일 기준으로 질문 게시판 19페이지에 달하는 엄청난 수의 질문이 쌓이는 문제가 되고 말았습니다.
질문이 수백개에 달하는 만큼 코드도 가지각색입니다. 하지만 의외로 틀렸습니다 혹은 런타임 에러를 받는 이유는 몇 가지 되지 않습니다. 올라오는 질문의 대부분은 이미 이전에 올라온 질문 몇 개만 찾아봐도 반례를 찾을 수 있거나, 본인과 동일한 이유로 질문한 다른 이가 이미 있는 경우입니다.
이 사실이 너무나도 안타까워 질문 게시판의 C / C++ / Java / Python 코드를 총 297개 수집하여 분석하고 이 글을 작성하게 되었습니다. 이 문제에서만 3년 전부터 꾸준히 한 달에 20개 가량의 질문이 올라오고 있는데, 이 글을 계기로 무의미한 질문이 한 달에 5개 이내로 줄었으면 하는 것이 제 바람입니다.
또한, 질문 게시판에 글을 올리기 위해서는 질문 게시판 공지사항을 반드시 읽도록 되어 있는데, 이 공지사항 가장 위에 쓰여 있는 질문 검색을 먼저 해서 자신에게 필요한 답변이나 반례가 없는지 확인하고 질문을 남겨주세요. 라는 문구만큼은 모두 꼭 숙지하셨으면 하는 것이 또다른 바람입니다.
첫 번째로 확인할 것: 예제
놀랍게도, 297개의 코드 중 예제를 통과하지 못하는 코드가 83개에 달합니다. 당신의 코드라고 예외라는 법은 없습니다. 다음을 꼭 확인해주세요.
1. 문제에서 요구하는 대로 올바르게 출력하고 있는지 확인해주세요. 시와 분은 하나의 공백으로 구분되어야 하며, 불필요한 0을 출력해서는 안됩니다.
2. 문제에서 요구하는 대로 올바르게 입력을 받고 있는지 확인해주세요. 시와 분은 공백으로 구분되어 주어집니다. 줄바꿈이 아닙니다. 특히 파이썬 코드에서 굉장히 자주 발견되는 에러입니다. 제가 수집한 것 중에는 8개가 해당합니다.
3. 예제를 통과하는지 직접 코드를 실행해서 확인해주세요. tio.run과 같은 온라인 코드 실행 사이트를 이용하는 것을 권장합니다. 이 코드가 왜 틀렸나요? 라는 질문이 올라왔는데 코드가 예제조차 통과하지 않는 것을 발견하면 답변자는 크나큰 괴로움과 분노에 빠집니다. 만일, 예제를 통과하지 않는 것을 이미 알고 있지만 본인의 코드가 왜 그렇게 작동하는 건지가 궁금한 상황이라면, 그 상황을 질문에 꼭 명시해주세요. 이 경우는 문법에 관한 설명과 코드가 작동되는 방식에 대한 설명을 답변으로 받을 가능성이 있습니다. 그렇지 않으면 받게 될 답변은 예제를 통과하지 못한다는 한마디 뿐입니다. 답변자도 사람인지라, 무성의한 질문에는 대개의 경우 무성의한 답변이 따릅니다. 잊지 마세요.
두 번째로 확인할 것: 반례
예제를 통과한 214개의 코드 중 141개의 코드가 다음 반례를 통과하지 못합니다. 다시 말해, 만약 당신이 예제는 맞는데 틀렸습니다를 받고 있다면, 당신의 코드도 60% 이상의 확률로 다음 반례를 통과하지 못할 겁니다.
다시 한번, 질문을 올리기 전에 질문 검색을 먼저 해서 자신에게 필요한 답변이나 반례가 없는지 확인하고 질문을 남겨주세요. 질문이 수백개가 쌓여있는 상황이다보니 도저히 다 읽을 엄두가 안 나는 것도 이해가 갑니다만, 대개의 경우는 몇 개만 확인해도 충분할 겁니다. 이 문제에 올라온 질문 중 수십개 이상에는 0 45가 반례라는 답변이 이미 달려있습니다. 기존에 올라온 질문들을 살피는 요령을 조금 드리자면,
반례 모음
열심히 프로그램 돌려서 엄선한 반례 모음입니다. 이 10개의 입력을 전부 통과하면 99%는 맞았습니다!를 받을 수 있다고 자신합니다. 실제로 제가 수집한 297개의 코드 중 아래 반례를 전부 넣었을 때 전부 통과하는 것은 단 2개였는데, 그 2개의 코드는 그대로 제출했을 때 맞았습니다!를 받았습니다. 실수로 다른 코드를 올린 것인지, 아니면 답변을 받은 후 질문 글 코드를 수정한 것인지는 알 수 없지만요.
마치며...
0 45라는 반례는 이 문제에만 해당하지만, 이 글에서 설명한 오답에 대처하는 방법론은 이 문제에만 해당하는 것이 아니라 다른 문제들에도 해당합니다. 다른 문제의 경우 확인할 것이 더 많겠지만, 최소한 이 글에서 설명한 내용은 반드시 확인해야 한다는 뜻입니다. 문제에서 요구하는 대로 입력을 받고 출력하고 있는지, 예제는 확실하게 통과하는지, 질문 게시판에 올라오는 반례들은 통과하는지를 꼭 확인합시다.
즐거운 백준 되세요. 감사합니다.