문타쿠, 공부하다.
[C언어 코딩 도장] Unit 38. 연습문제 및 심사문제 본문
38.6 연습문제: 포인터에 할당된 메모리를 3차원 배열처럼 사용하기
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
/* depth = 2, row = 3, col = 5 */
long long*** m = malloc(sizeof(long long**) * 2);
for (int depth = 0; depth < 2; depth++)
{
m[depth] = malloc(sizeof(long long*) * 3);
for (int row = 0 ;row < 3; row++)
{
m[depth][row] = malloc(sizeof(long long) * 5);
}
}
m[1][2][4] = 100;
printf("%lld\n", m[1][2][4]);
for (int depth = 0; depth < 2; depth++)
{
for (int row = 0; row < 3; row++)
{
free(m[depth][row]);
}
free(m[depth]);
}
free(m);
return 0;
}
38.7 심사문제: 단위행렬 만들기
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int size;
scanf_s("%d", &size);
printf("\n");
if (size < 2 || size>10)
{
printf("크기는 2~10 사이로 입력해주세요.\n");
return 1;
}
// 행
int** square = malloc(sizeof(int *) * size);
for (int i = 0; i < size; i++)
{
// 열
square[i] = malloc(sizeof(int) * size);
}
for (int i = 0; i < size; i++)
{
for (int j = 0; j < size; j++)
{
if (i == j)
{
square[i][j] = 1;
}
else
{
square[i][j] = 0;
}
printf("%d ", square[i][j]);
}
printf("\n");
}
for (int i = 0; i < size; i++)
{
// 열 영역 메모리 해제
free(square[i]);
}
// 행 영역 메모리 해제
free(square);
return 0;
}
38.8 심사문제: 지뢰찾기
1차 작성 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int row, col;
printf("행의 크기>> ");
scanf("%d", &row);
if (row < 3 || row > 10)
{
printf("행의 범위는 3 ~ 10입니다.");
return 1;
}
printf("열의 크기>> ");
scanf("%d", &col);
if (col < 3 || col>10)
{
printf("열의 범위는 3 ~ 10입니다.");
return 1;
}
printf("\n");
// 2차원 배열 동적 할당
char** minesweeper = malloc(sizeof(char*) * row);
for (int i = 0; i < row; i++)
{
minesweeper[i] = malloc(sizeof(char) * col);
}
// 2차원 배열에 문자 값 입력
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
// 입력 버퍼에 남아 있는 공백 문자나 개행 문자를 무시하기 위해서 서식 지정자 앞에 공백을 추가
scanf(" %c", &minesweeper[i][j]);
}
}
printf("\n");
// 입력한 문자 값 2차원 배열 형태로 출력(없어도 되는 부분)
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%c ", minesweeper[i][j]);
}
printf("\n");
}
printf("\n");
// 지뢰 찾기
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (minesweeper[i][j] == '*')
{
printf("%c ", minesweeper[i][j]);
}
else
{
int count = 0;
// 상
if ((i - 1 >= 0) && (minesweeper[i - 1][j] == '*'))
count++;
// 하
if ((i + 1 < row) && (minesweeper[i + 1][j] == '*'))
count++;
// 좌
if ((j - 1 >= 0) && (minesweeper[i][j - 1] == '*'))
count++;
// 우
if ((j + 1 < col) && (minesweeper[i][j + 1] == '*'))
count++;
// 대각선 상좌
if ((i - 1 >= 0) && (j - 1 >= 0) && (minesweeper[i - 1][j - 1] == '*'))
count++;
// 대각선 상우
if ((i - 1 >= 0) && (j + 1 < col) && (minesweeper[i - 1][j + 1] == '*'))
count++;
// 대각선 하좌
if ((i + 1 < row) && (j - 1 >= 0) && (minesweeper[i + 1][j - 1] == '*'))
count++;
// 대각선 하우
if ((i + 1 < row) && (j + 1 < col) && (minesweeper[i + 1][j + 1] == '*'))
count++;
minesweeper[i][j] = count;
printf("%d ", minesweeper[i][j]);
}
}
printf("\n");
}
// 2차원 배열 동적 할당 해제
for (int i = 0; i < row; i++)
{
free(minesweeper[i]);
}
free(minesweeper);
return 0;
}
지뢰찾기 부분의 중복 코드를 간략화 한 2차 코드
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int row, col;
printf("행의 크기>> ");
scanf("%d", &row);
if (row < 3 || row > 10)
{
printf("행의 범위는 3 ~ 10입니다.");
return 1;
}
printf("열의 크기>> ");
scanf("%d", &col);
if (col < 3 || col>10)
{
printf("열의 범위는 3 ~ 10입니다.");
return 1;
}
printf("\n");
// 2차원 배열 동적 할당
// 행
char** minesweeper = malloc(sizeof(char*) * row);
for (int i = 0; i < row; i++)
{
// 열
minesweeper[i] = malloc(sizeof(char) * col);
}
// 2차원 배열에 문자 값 입력
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
// 입력 버퍼에 남아 있는 공백 문자나 개행 문자를 무시하기 위해서 서식 지정자 앞에 공백을 추가
scanf(" %c", &minesweeper[i][j]);
}
}
printf("\n");
// 입력한 문자 값 2차원 배열 형태로 출력(없어도 되는 부분)
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf("%c ", minesweeper[i][j]);
}
printf("\n");
}
printf("\n");
// 지뢰 찾기
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
if (minesweeper[i][j] == '*')
{
printf("%c ", minesweeper[i][j]);
}
else
{
int count = 0;
// 상 하 좌 우 대각선 방향 검사
for (int upDown = -1; upDown <= 1; upDown++)
{
for (int leftRight = -1; leftRight <= 1; leftRight++)
{
if (upDown == 0 && leftRight == 0)
continue;
int checkRow = i + upDown;
int checkCol = j + leftRight;
if (checkRow >= 0 && checkRow < row && checkCol >= 0 && checkCol < col && \
minesweeper[checkRow][checkCol] == '*')
count++;
}
}
minesweeper[i][j] = count;
printf("%d ", minesweeper[i][j]);
}
}
printf("\n");
}
// 2차원 배열 동적 할당 해제
for (int i = 0; i < row; i++)
{
free(minesweeper[i]);
}
free(minesweeper);
return 0;
}
'C언어 > C언어 코딩 도장' 카테고리의 다른 글
[C언어 코딩 도장] Unit 39. 연습문제 및 심사문제 (0) | 2023.09.24 |
---|---|
[C언어 코딩 도장] Unit 39. 문자열 사용하기 (0) | 2023.09.24 |
[C언어 코딩 도장] Unit 38. 포인터와 배열 응용하기 (0) | 2023.09.23 |
[C언어 코딩 도장] Unit 37. 연습문제 및 심사문제 (0) | 2023.09.19 |
[C언어 코딩 도장] Unit 37. 2차원 배열 사용하기 (0) | 2023.09.19 |