코딩 학습/C와 C++

C 언어 연습

이개 2026. 3. 3. 21:41

1. 주제별 코딩 문제 (Level 1~5)

각 주제별로 단순 구현부터 구조적 사고가 필요한 문제까지 배치했습니다.

① 배열 & 이중 배열

  1. 기초: 10개의 정수를 입력받아 합계와 평균 출력하기.
  2. 검색: 배열에서 최댓값과 그 값이 몇 번째 인덱스에 있는지 찾기.
  3. 변환: 3x3 행렬을 입력받아 행과 열을 바꾼 전치 행렬(Transpose) 출력하기.
  4. 통계: 5x5 이중 배열에 성적을 넣고, 각 행(학생별) 합계와 각 열(과목별) 합계 구하기.
  5. 도전: 달팽이 배열 만들기 (n을 입력받아 시계방향 소용돌이 형태로 숫자 채우기).

② 포인터 (Pointer)

  1. 교환: swap 함수를 포인터를 이용해 구현하여 두 변수의 값 바꾸기.
  2. 연산: 포인터 증감(ptr++)을 사용하여 배열의 모든 요소 출력하기.
  3. 문자열: 포인터만을 사용하여 문자열의 길이를 반환하는 my_strlen 함수 만들기.
  4. 역순: 포인터를 활용해 입력받은 문자열을 뒤집어 저장하기.
  5. 심화: 배열 포인터와 포인터 배열의 차이를 코드로 증명하기.

③ 동적 할당 (malloc / free)

  1. 가변 배열: 사용자에게 숫자를 입력받고, 딱 그 개수만큼만 정수형 배열 할당 후 값 채우기.
  2. 확장: realloc을 사용하여 기존 할당된 메모리 크기를 2배로 늘려보기.
  3. 구조체 할당: 구조체 변수를 동적으로 생성하고 멤버에 값을 입력한 뒤 해제하기.
  4. 2차원 동적 할당: 사용자로부터 행(R)과 열(C)을 입력받아 $R \times C$ 크기의 2차원 배열 동적 할당하기.
  5. 안전성: 메모리 누수(Leak)를 확인하는 코드를 짜고, 왜 free가 필수인지 설명하는 주석 달기.

④ 구조체 (Struct)

  1. 정의: Point 구조체(x, y)를 만들고 두 점 사이의 거리를 구하는 함수 작성.
  2. 중첩: Date 구조체를 멤버로 가지는 Employee 구조체 정의하기.
  3. 배열: 학생 5명의 이름과 점수를 담는 구조체 배열을 만들고 성적순으로 정렬하기.
  4. 함수: 구조체 변수를 함수의 인자로 넘길 때, 값 복사(Value)와 주소 전달(Address)의 차이 확인하기.
  5. 설계: 도서 관리 프로그램용 구조체(제목, 저자, ISBN, 대출 여부)를 설계하고 데이터 입력받기.

⑤ 파일 I/O

  1. 쓰기: "Hello C Programming"이라는 문장을 test.txt에 저장하기.
  2. 읽기: test.txt에 저장된 내용을 한 줄씩 읽어 콘솔에 출력하기.
  3. 복사: 파일 A.txt의 내용을 그대로 B.txt로 복사하는 프로그램 만들기.
  4. 형식화: 구조체 배열에 담긴 데이터를 fprintf를 사용해 표 형식으로 파일에 저장하기.
  5. 검색: 파일 내에서 특정 단어가 몇 번 등장하는지 찾아내는 카운터 만들기.

3. 학습자를 위한 대안적 프레이밍

C를 배우실 때 단순히 문법을 익히는 것보다 다음의 **'관점 확장'**을 고려해 보시기 바랍니다.

  • 포인터 vs 배열: "배열 이름은 상수 포인터다"라는 말을 코드로 증명해 보세요. 왜 arr[i]가 *(arr + i)와 같은지 이해하는 것이 핵심입니다.
  • 스택(Stack) vs 힙(Heap): 지역 변수가 저장되는 스택과 동적 할당이 일어나는 힙의 생명주기 차이를 고민해 보세요. "함수가 종료되어도 데이터가 남아야 한다면?" 이 질문이 동적 할당의 존재 이유입니다.
  • 추상화의 시작: 구조체는 C++의 '클래스'로 진화합니다. 데이터를 묶는 것에 그치지 않고, 이 데이터를 다루는 함수들을 어떻게 연결할지 고민해 보세요.

'코딩 학습 > C와 C++' 카테고리의 다른 글

C++ 기초 - 포인터와 레퍼런스  (0) 2026.03.05
C++ 기초 - Visual Studio 실행, 변수, 입출력  (0) 2026.03.04
C - 배열  (0) 2026.03.04
C - 포인터  (1) 2026.03.03
C - 동적 할당, 구조체  (0) 2026.03.03