질문 전에 상단 포럼 검색에서 검색을 해보세요.
Unit 번호로 검색해보세요.
예. 38
예. 38.3
또는 키워드로 검색해보세요.
포인터
테스팅 오류
해당 Unit의 심사 문제는 해당 Unit의 설명과 연습 문제를 보면 풀 수 있습니다. 후반부의 심화된 심사 문제 일부는 지금까지 학습한 내용을 활용하게 되어 있습니다.(예. Unit 38.8 지뢰찾기)
자주 묻는 질문 목록은 다음과 같습니다.
'오류가 발생해 테스팅이 취소되었습니다'는 왜 생기나요?
무한 루프가 발생하는 경우입니다. 실행 시간 제한은 3초이며, 대부분은 1초 이내에 실행이 끝나고 심사가 종료됩니다. 간혹, 무한 루프가 발생하는 코드를 제출하는 경우가 있습니다. 이런 경우 심사를 강제로 중단하고 이와 같은 메시지를 출력합니다.
입력 값의 범위를 확인하세요. 입력 값의 범위가 지정되어 있습니다. 온라인 심사는 입력 값의 범위에 대해서 테스트합니다. 따라서 1부터 20까지는 동작했지만, 21번부터 동작하지 않는 경우가 있습니다. 즉, 컴파일은 되었고 심사를 검증하는 과정에서 통과하지 못하는 경우입니다.
부분 코드 넣기에 전체 코드를 넣었습니다. 심사문제는 부분 완성과 전체 완성이 있습니다. 부분 완성 문제에 전체 코드를 넣으면 오류가 발생해 심사가 진행되지 않습니다. Unit 3.9부터 반복되는 문제입니다.
27.12 심사문제를 예로 설명합니다. 문제에 따르면 z까지만 출력해야 합니다. 그러나 값을 벗어나 쓰레기 값이 출력되는 경우 오류가 발생해 심사가 종료됩니다.
온라인 심사는 제출한 소스 코드를 컴파일해서 실행할 뿐입니다. 온라인 심사 자체에 오류가 있는 경우는 없습니다. 만일, 오류가 있다면 단 한 명도 심사를 통과하지 못해야 합니다. 다양한 입력 값으로 먼저 테스트해서 문제가 없는지 확인해야 합니다.
입력을 잘못받는 경우 입력이 되지 않고 입력만 대기하다가 종료됩니다. scanf에서 "%d %d"로 써야 하는데 "%d, %d"로 쓰는 경우 입력 양식이 다릅니다. 이런 경우 입력 대기만 하고 심사가 종료됩니다.
해킹을 시도하는 경우입니다. 시스템 전체를 삭제하는 코드를 제출하는 경우가 있습니다. 이런 코드는 강제로 제거됩니다. 다른 경우는 의도적으로 무한 루프로 동작하는 코드를 제출해 시스템 자원을 고갈하려는 경우입니다. 이런 경우도 강제 종료됩니다. 사실, 의도하지 않게 무한 루프로 동작하는 코드를 제출하는 경우도 많습니다.
부분 완성 문제에 전체 코드를 제출한 경우입니다. 부분 완성형 문제는 문제에 "정답에는 밑줄 친 부분에 들어갈 코드만 작성해야 합니다."라는 문구가 있습니다. 전체 코드를 제출하면 코드가 엉망이 되므로 컴파일되지 않고 심사 오류가 발생합니다. 문제를 끝까지 정확하게 읽으세요.
화면에 출력할 수 없는 특수 문자가 출력된 경우입니다. 심사 시스템 내부에는 제출한 코드를 검증하는 여러 가지 테스트가 내장되어 있습니다. 포인터 부분의 경우 잘못 작성한 프로그램이면 화면에 출력할 수 없는 쓰레기 값이 출력될 때가 있습니다. 이런 경우엔 심사를 진행할 수 없어 오류 발생으로 처리됩니다. PC에서 다양한 값을 넣어 직접 테스트해보는 게 좋습니다.
심사문제 테스트는 하고 만들었습니까?
자주 묻는 질문입니다. 심사문제는 모두 테스트되었습니다. 심사문제 현황을 보면 현재 문제풀이를 시도해서 성공한 문제와 실패한 문제를 모두 볼 수 있습니다. 다른 회원이 해당 문제를 통과하고 있음을 알 수 있습니다. 또한, 랭킹에는 전체 문제를 풀이한 회원도 있습니다.
OJ 현황 보기
https://dojang.io/view/achievement/ojstatus.php?courseid=2&page=0
심사 문제 현황 보기
https://dojang.io/view/oj/problems.php?courseid=2
심사 문제 현황 보기에서는 각 심사 문제별 시도 인원과 통과 인원의 통계를 볼 수 있습니다. 400/500 = 80%는 500명이 시도해서 400명이 통과했다는 뜻입니다. 시도 횟수는 포함되지 않습니다.
부분 완성인데 전체 코드를 입력한 경우, 대소문자를 구분하지 않은 경우, 띄어쓰기나 구두점이 틀린 경우가 있습니다. Visual Studio에서 동작하는 코드를 작성하고 테스트해보는 것을 권합니다.
해당 Unit의 심사문제는 해당 Unit의 설명에 대부분은 정답 코드가 있습니다. 해당 Unit을 복습하거나 일단은 통과하고 1회 완독한 다음에 2회차 때 다시 풀어보기를 권장합니다. 또한, 중간부터 시작하면 독자의 배경 지식 수준이 다르기 때문에 어렵다고 느낄 수 있습니다. 반드시 처음부터 차례대로 학습해야 합니다. 참고서가 아니라 레벨이 오르는 것처럼 단계적으로 학습하게 구성되어 있기 때문입니다. 흰띠가 빨간띠 심사에 참여해도 안 되고, 노란띠가 검은띠 심사에 참여해도 안 됩니다. 단계별로 학습해야 합니다.
나는 통과했는데 심사는 통과하지 못합니다.
심사 문제에는 테스트 케이스가 1개일 때도 있지만, 2-3개를 제시할 때가 있습니다. 2-3개의 테스트를 모두 통과하는지 확인해야 합니다. 첫 번째 테스트는 우연의 일치로 통과했지만, 제대로 풀지 못했으므로 두 번째 테스트는 통과하지 못합니다. 이런 경우 심사도 통과하지 못합니다.
참고: 첫 번째는 통과하지만, 두 번째와 세 번째는 통과하지 못하는 경우
https://dojang.io/mod/forum/discuss.php?d=116
입력 값의 범위를 확인하세요.
심사 문제에는 입력 값의 범위가 있습니다. 30자까지 입력 받을 수 있다면 30자까지 입력 받았을 때 정상적으로 동작해야 합니다. 문자열이면 NULL 문자를 포함해 배열은 31자까지 선언되어 있어야 정상 동작할 것입니다.
숫자를 입력받는 경우에도 값의 범위가 있습니다. 30까지 입력 받을 수 있다면 30까지 입력했을 때 정상적으로 동작해야 합니다. 오버플로우가 발생해서 음수나 비정상 값이 출력되면 자료형을 더 큰 것으로 바꿔야 합니다.
1분 시간 제한은 왜 있나요?
보안상의 이유로 제한되어 있습니다. 온라인 컴파일러로 이용하거나 무차별적인 시도를 통해 치팅하려는 경우를 예방하기 위한 것입니다. 치팅 시도란 제대로 된 코드 작성을 통한 심사 통과가 아니라 심사가 원하는 출력문만 제출해서 통과하려는 시도입니다. 예. 평균값을 구하지 않고 심사에 쓰이는 평균값 85만 출력해서 통과하려는 시도. 무한한 시간과 자원이 있다면 모든 심사문제는 출력문만 작성해서 통과할 수 있습니다.
치팅보단 정상적인 문제 풀이를 권장합니다.
심사를 통과하지 못했을 때 충분히 고민하고, 코드를 고치고, 제출한다면 시간 제약에 걸리는 경우는 흔하지 않을 것입니다.
Visual Studio for Mac은 사용하면 안 됩니다
MS에서 공식적으로 밝힌 바와 같이 Visual Studio 2017 for Mac은 C#, F#, VB.NET 개발을 위한 것입니다. C/C++ 프로젝트를 지원하지 않습니다.
참고: Visual Studio 2017 for Mac Platform Targeting and Compatibility
https://www.visualstudio.com/en-us/productinfo/vs2017-compatibility-mac
conio.h는 비표준입니다
<C 언어 코딩 도장>에서 conio.h를 예제에서 사용하지 않는 이유도 비표준이기 때문입니다. Windows 플랫폼에서만 사용할 수 있으며, Visual Studio(for Windows)만 제공합니다. GCC, clang, XCode 같은 다른 개발 환경/컴파일러에서 지원하지 않습니다. 따라서 Unit 85.18 부록에서만 conio.h를 설명합니다.
맥에서 Visual Studio를 이용하는 방법
패러렐즈를 설치하고, 여기에 Windows 10과 Visual Studio 2017 Community를 설치해서 이용하는 방법이 많이 추천되고 있습니다.
맥에서 C 언어를 이용하는 방법
가장 좋은 방법은 맥에서 무료로 이용할 수 있는 XCode를 설치하는 것입니다. XCode에서 C 언어 프로젝트를 이용하는 방법은 다음 링크를 참고해주세요.
Mac의 XCode에서 C언어 시작하기
Unit 5.6 심사문제: 변수를 선언하고 값 할당하기
error: ‘num’ undeclared
undeclared(선언되지 않음, 미선언) 오류는 변수가 선언되지 않았을 때 발생하는 오류입니다. 변수를 선언해주세요.포인터 관련 오류: 'void *'에서 'int *'(으)로 변환할 수 없습니다
주로 Unit 34~38 사이에서 발생하는 문제입니다.Visual Studio에서 소스 파일 확장자를 .cpp로 했을 때 발생하는 문제입니다. 파일 확장자가 .cpp이면 Visual Studio는 C++ 언어로 컴파일합니다. 파일 확장자를 .c로 지정해야 C 언어로 컴파일합니다. C 언어와 C++ 언어는 메모리 관리에서 다른 부분이 있습니다. 책이 잘못된 게 아닙니다. 확장자를 .cpp로 지정해서 C++에서 C 언어를 작성하는 것이 잘못입니다. C 언어는 파일 확장자를 .c로 해야 합니다.
해결책1: Visual Studio에서 소스를 생성할 때 확장자를 .c로 해주세요. hello.cpp가 아니라 hello.c로 해야 합니다.
// C++ 방식, 타입 변환하는 건 C++ 방식입니다. C 언어에서 C++ 방식을 쓰면 안 됩니다. // C++은 malloc에서 형변환을 직접 지정해야 합니다.
int *ptr = (int*)malloc(sizeof(int));
// C 언어 방식, 소스 파일 확장자를 .c로 해야 합니다. // C 언어는 malloc에서 형변환을 자동으로 해줍니다.
int *ptr = malloc(sizeof(int));
자세한 내용은 이전 질문을 참조하세요.
https://dojang.io/mod/forum/discuss.php?d=30
https://dojang.io/mod/forum/discuss.php?d=99
https://dojang.io/mod/forum/discuss.php?d=128
Unit 3.3 Ctrl + F5로 실행해도 프롬프트 창이 바로 닫힙니다
Visual Studio에서 프로젝트 속성을 변경하면 해결할 수 있습니다. Visual Studio 2017에서 기본 프로젝트 속성이 변경되었습니다. Visual Studio 2017에서 이 문제를 해결하려면 다음 답변을 참고하세요.
https://dojang.io/mod/forum/discuss.php?d=249
Unit 11.7 심사문제: 정수, 실수, 문자 입력받기
세 가지 유형의 데이터를 입력받아 그대로 출력하는 문제입니다. 입력에는 scanf를 사용하고 출력에는 printf를 사용합니다. scanf만 사용하고 printf는 사용하지 않는 경우가 종종 있습니다.
https://dojang.io/mod/forum/discuss.php?d=102
https://dojang.io/mod/forum/discuss.php?d=153
Unit 18.9, || 작성법과 && 작성법
심사 문제 해설에서는 ||로 작성하는 방법을 전제로 설명하고 있으나 실제로는 &&로도 작성할 수 있습니다. 이에 심사 문제 해설도 두 가지 방법을 모두 설명하는 것으로 변경했습니다.
https://dojang.io/mod/forum/discuss.php?d=38&parent=104
Unit 18.10 심사 문제: 합격 여부 판단하기
성적 처리에서 성적은 0점부터 100점까지입니다. 주어진 조건을 잘 파악해서 -80 같은 음수가 입력되거나 200처럼 100점을 초과하는 점수가 입력되는 것을 방지해야만 심사를 통과할 수 있습니다. 즉, 버그 없는, 방어적인 코드를 작성해야 합니다.
https://dojang.io/mod/forum/discuss.php?d=89
https://dojang.io/mod/forum/discuss.php?d=85
Unit 23.8 심사문제 막혔어요!
'Visual Studio에서는 잘 되고 심사에서는 안 됩니다' 유형은 문제의 요건을 갖추지 못한 경우입니다. 문제가 요구한 데이터 형식
표준 입력으로 두 정수(unsigned int)가 입력됩니다.
unsigned int라고 타입을 명시했지만, Visual Studio에서 char, unsigned char 같은 다른 타입으로 문제 풀이를 하고 정상 동작한 것처럼 보여 심사 문제에 제출하면 통과하지 못합니다. 심사 문제에서 unsigned int라고 명시했다는 것은 입력 값으로 unsigned int에 쓸 수 있는 0 ~ 4,294,967,295 범위에 대해 정상적으로 동작해야 한다는 뜻입니다.
https://dojang.io/mod/forum/discuss.php?d=150
Unit 24, 36 2진법 관련
10진법과 2진법의 변환에 대해서는 다음 답변을 참조하세요.
https://dojang.io/mod/forum/discuss.php?d=115
Unit 24.3 비트 연산
<< 연산자는 항상 부족한 비트를 0으로 채웁니다.
>> 연산자는 부족한 비트를 부호 비트를 따라 채웁니다. 양수의 부호 비트는 0이므로 0으로 채우고, 음수의 부호 비트는 1이므로 1로 채웁니다.
https://dojang.io/mod/forum/discuss.php?d=143#p341
https://dojang.io/mod/forum/discuss.php?d=142
Unit 28.11
예시로 보여준 출력과 정확하게 일치하는지 먼저 테스트해야 합니다. 입력값을 출력에서 다시 출력하면 심사가 실패합니다.
https://dojang.io/mod/forum/discuss.php?d=40
Unit 31.7
입력 값의 범위에 따라 정확하게 동작해야 합니다. 한 가지 입력 값에 대해 동작하는 코드나 입력 값에 따라 줄바꿈(\n)의 개수가 달라지는 코드로는 심사를 통과할 수 없습니다.
https://dojang.io/mod/forum/discuss.php?d=145
Unit 32.3
bool 자료형을 %d로 입력받을 때 컴파일러 경고가 발생합니다. bool 자료형을 위한 서식 지정자는 따로 없나요? 네, 없습니다. %d를 써야 하는 이유는 다음 답변을 참조하세요.
https://dojang.io/mod/forum/discuss.php?d=133
Unit 38.4 가로와 세로가 헷갈립니다!
Unit 38.8 심사문제: 지뢰 찾기
지뢰 찾기 문제는 포인터와 배열을 제대로 이해해야 풀 수 있습니다. 또한, 대다수 풀이자는 조건을 만족하지 않으면 중간에 루프 실행을 중단하고 처음으로 돌아가는 방법으로 루프를 작성하게 됩니다. Unit 30. break, continue로 반복문 제어하기에서 continue를 사용해서 풀이하게 됩니다.
또는 4중첩 루프와 if 조건문을 복잡하게 사용하여 풀이하는 방법도 있습니다. 코드가 상당히 길고 복잡한 방식으로 일부 참가자가 이렇게 풀이합니다.
루프를 돌면서 인덱스를 벗어난 접근을 하게 되면, 주로 m[-1][-1]과 같은 접근을 하게 되면 메모리 오류가 발생합니다.
문자열이므로 n개가 아니라 끝에 NULL 문자를 포함한 n+1개만큼 메모리를 할당해야 합니다.
https://dojang.io/mod/forum/discuss.php?d=39
https://dojang.io/mod/forum/discuss.php?d=51
https://dojang.io/mod/forum/discuss.php?d=73
https://dojang.io/mod/forum/discuss.php?d=87
https://dojang.io/mod/forum/discuss.php?d=94
https://dojang.io/mod/forum/discuss.php?d=114
https://dojang.io/mod/forum/discuss.php?d=152
Unit 59. 포인터 연산과 역참조 사용하기 관련 질문
*(numPtrB++)이 아니라 *numPtrB++이 아닌가요?에 대한 답변
https://dojang.io/mod/forum/discuss.php?d=81#p212
Unit 71.11 심사 문제
https://dojang.io/mod/forum/discuss.php?d=207