PS/자주 하는 답변 35

반복문의 조건문 안에 strlen을 넣지 마세요.

C/C++에서 strlen은 char의 연속으로 이루어진 기초적인 형태의 문자열의 길이를 구해주는 역할을 합니다. 문자열의 구조를 몰라도 strlen만 있으면 손쉽게 길이를 알 수 있으니 참으로 편리한 함수이지만, 구조를 모르고 아무 곳에나 사용하면 다음과 같은 문제를 겪게 될 수 있습니다. 문자열을 다루는 문제에서 "문자열의 모든 문자를" 하나씩 전부 확인해야 하는 경우가 있습니다. 이 경우 가장 일반적인 방법은 아래와 같이 for 루프를 도는 것입니다. char str[1000001]; scanf("%s", str); for (int i = 0; i < str의_길이; i++) { str[i]에_대한_연산; } str의 최대 길이가 100만인 문제에서, str의_길이를 구하기 위해 다음과 같이 코드를..

50%에서 틀리는 것의 의미

BOJ에서 문제를 풀다 보면 50%에서 오답을 받는 경우를 심심찮게 볼 수 있습니다. 일반적으로 이런 경우는 문제가 "입력은 여러 개의 테스트 케이스로 이루어져 있다"와 같은 형식일 때입니다. 언뜻 보면 퍼센트가 반이나 올라갔으니까, 반은 맞은 건가? 하고 생각하기 쉽습니다. 하지만 대개의 경우, 진실은 그렇지 않습니다. 이게 무엇을 의미하는지 이해하려면 우선 BOJ의 채점 원리를 알아야 합니다. 자세한 동작 원리는 https://help.acmicpc.net/judge/info 에 설명되어 있으니, 여기에서는 짧게 필요한 것만 요약하겠습니다. BOJ 채점 프로그램에서 보여주는 %는 하나의 데이터에 대해 프로그램이 실행하는 단계와 그 실행 결과에 대한 판정을 내리는 2개의 단계로 나누어져 있습니다. 예를..

제출했던 틀린 코드 전체를 그대로 올려주세요.

코드는 제출했던, 틀렸던 바로 그 코드 전체가 온전하게 있어야 답변을 원활하게 할 수 있습니다. 항목별로 강조하자면, 오답을 받은 코드를한 글자의 수정도 없이전체를 그대로 가져와야 합니다.이는 질문에서 이야기하고자 하는 부분이 특정 함수나 특정 문장에 국한된 것이라 하더라도, 또는 딱 한 부분을 고쳤을 때 채점 결과가 달라지는 상황이라도 예외가 아닙니다. 이유는 다음과 같습니다.가장 확실하고 쉬운 디버깅 방법은 답변자가 그 코드를 복사해서 로컬에 넣고 직접 돌려보는 것입니다. 그런데 코드 전체가 없으면 애초에 이를 테스트하는 것 자체가 매우 번거롭습니다. 눈으로만 디버깅을 하거나, 아니면 임의의 테스트 코드를 직접 작성해야만 합니다. 직접 제출해보기 위해서라도 원본 코드 그대로는 반드시 필요합니다.코드는..

매 케이스/쿼리마다 개행 문자를 출력해야 합니다.

다중 테스트 케이스 문제들에서 조심해야 할 것은, 단일 테스트 케이스 문제와 달리 답을 하나만 딱 출력하고 끝내면 안 된다는 것입니다. 채점 프로그램은 그저 출력한 내용 전체가 정답 전체와 같은지를 비교할 뿐이기 때문에, 각 케이스에 대한 답 사이에 있는 개행 문자도 당연히 답 전체에 포함됩니다. 그래서 반드시! 각 케이스에 대한 답을 출력한 뒤 개행을 해주고 다음 테스트 케이스로 넘어가야 합니다. // NO cout

PS 질문에 자주 하는 답변

BOJ에서 많은 질문글들에 자주 반복해서 답변하게 되는 내용들을 보다 구체적으로 적어보려고 합니다. 일반적으로 쓰는 용어인 '자주 묻는 질문'이 아니라 '자주 하는 답변'인 이유는 PS 관련으로 올라오는 질문은 대부분이 자신의 코드에서 무엇이 잘못되었는지조차 모르고 그저 왜 틀렸는지를 묻는 것이고, 반면에 초보자들이 자주 하는 질문의 원인에는 일부 정해진 패턴이 있어 그에 따라 같은 내용의 답변을 반복하게 되는 경우가 많기 때문입니다. 그래서 초점을 '질문'이 아닌 다양한 질문들에 대한 해결책이 되는 '답변'에 두고 글을 작성해 보려고 합니다. 옛날부터 해보고 싶었던 프로젝트이기도 한데, BOJ 블로그나 게시판 등지에 쓰기에는 묻히기도 쉽고 마음껏 쓰기에는 부담스러워서 개인 블로그 새로 연 참에 이걸로 ..