이 문제는 6주차 때 이미 풀었던 문제지만 비효율적으로 입력 최대 크기(100 100)만큼 배열을 생성해서 풀었고 또한 잘못 이해를 해서 푼 부분이 있기에 포인터와 동적할당을 이용한 방법과 올바르게 풀고자 선정하였다.
입력된 격자판의 세로, 가로, 막대의 개수, 막대의 길이, 방향, 좌표(x,y)를 바탕으로 격자판에 막대들을 둔 상태로 격자판을 출력하는 것이 목적이다.
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
int **board; // 격자판 배열
int xCount, yCount, count, len, direct, x, y;
// xCount : 격자판 가로 yCount : 격자판 세로 count : 막대의 개수 len : 막대의 길이
// direct : 막대의 방향 x, y : 막대의 위치 좌표
scanf("%d %d", &yCount, &xCount); // 격자판 세로, 가로 길이 입력
board = malloc(sizeof(int *) * yCount);
for (int i = 0; i < yCount; i++)
{
board[i] = malloc(sizeof(int) * xCount);
}
// 입력 받은 세로, 가로 길이를 기준으로 메모리를 할당한 후 이중 포인터 board에 주소들을 각각 저장
for (int i = 0; i < yCount; i++) // 입력된 세로, 가로 길이를 기준으로 격자판의 요소들 초기화
{
for (int j = 0; j < xCount; j++)
{
board[i][j] = 0;
}
}
scanf("%d", &count); // 막대의 개수 입력
for (int i = 0; i < count; i++) // 개수만큼 반복
{
scanf("%d %d %d %d", &len, &direct, &x, &y); // 해당 막대의 길이, 방향, 좌표 입력
for (int j = 0; j < len; j++) // 길이만큼 반복
{
if (!direct) // 방향이 가로라면
{
board[x - 1][y - 1 + j] = 1; // 해당 위치의 요소 1로 변경
}
else // 방향이 세로라면
{
board[x - 1 + j][y - 1] = 1; // 해당 위치의 요소 1로 변경
}
}
}
for (int i = 0; i < yCount; i++) // yCount, xCount만큼 반복하며 해당 요소 출력
{
for (int j = 0; j < xCount; j++)
{
printf("%d ", board[i][j]);
}
printf("\n"); // 한 행을 출력할 때마다 개행
}
for (int i = 0; i < yCount; i++)
{
free(board[i]);
}
// 세로의 크기만큼 반복하며 board의 가로 배열 메모리 해제
free(board); // board 메모리 해제
}
1098번 문제의 로직 풀이는 CodeUp WriteUp에 작성했으므로 포인터 선언 및 메모리 동적 할당 및 고친 부분을 작성하겠다.
일단 고친부분은 지난번에 풀 때는 x, y가 햇갈려서 첫 번째 입력 값을 가로 크기(xCount)로 받아들여서 입, 출력 과정에서 반대로 좀 꼬와서 작성했는데, 이제는 2차원 배열의 특성([세로][가로])를 코딩도장을 통해 이해했기 때문에 굳이 반대로 꼬와서 하거나 잘못된 이름으로 짓지않고 세로 크기는 yCount, 가로 크기는 xCount로 입력받아 그대로 사용했다.
2차원 배열의 크기가 입력되기 때문에 먼저 선언하지 않고 크기를 입력을 받은 후 2차원 배열 포인터 사용 방법대로 malloc으로 동적 메모리 할당을 받았다. 그리고 문제 풀이 로직을 거친 후 세로 -> 가로 순으로 포인터를 만들었기 때문에 이번에는 가로 -> 세로 순으로 메모리를 free로 해제해줬다.
'Old (2021.01 ~ 2021.12) > Algorithm' 카테고리의 다른 글
CodeUp 1416 : 2진수 변환 (0) | 2021.03.07 |
---|---|
CodeUp 1502 : 2차원 배열 채우기 2 (0) | 2021.03.07 |
CodeUp 1810 : (포인터) 부분 문자열 (0) | 2021.03.07 |
CodeUp 1581 : swap 함수 만들기 (0) | 2021.03.07 |
CodeUp WriteUp With C Language (0) | 2021.02.27 |