โป ์ด ์นดํ ๊ณ ๋ฆฌ์ ๊ธ๋ค์ knu EK.Ryu ๊ต์๋์ <์๋ฃ๊ตฌ์กฐ> ์์ ์ ๋ฃ๊ณ ๋๋ฆ๋๋ก ํ์๊ฐ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
โป ๋ถ์กฑํ ์ค๋ช ์ด ์๊ฑฐ๋, ์๋ชป ์๊ณ ์์ฑํ ๋ถ๋ถ์ด ๋ณด์ธ๋ค๋ฉด ๋๊ธ๋ก ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค๐
3.5 A Mazing Problem
๋ฏธ๋ก(maze)๋ ์ค๋ซ๋์ ํฅ๋ฏธ ์๋ ๋ฌธ์ ์์ต๋๋ค. ์คํ ์ฌ๋ฆฌํ์๋ค์ ์ฅ๊ฐ ๋ฏธ๋ก์์ ์์์ ์ฐพ๋๋ก ํ๋ จ์์ผ ์๊ณ , ๋ง์ ์ถ๋ฆฌ ์๊ฐ๋ค์ ์๊ตญ์ ์ ์ ๋ฏธ๋ก๋ฅผ ์ด์ธ ์ฌ๊ฑด์ ๋ฐฐ๊ฒฝ์ผ๋ก ์ด์ฉํ์ต๋๋ค.
๋ฏธ๋ก๋ ์คํ์ ์ข์ ์์ฉ์ด ๋๋ฏ๋ก ์ฐ๋ฆฌ๋ ์ด ๋ฌธ์ ์ ๋ํด ๊ด์ฌ์ ๊ฐ์ ธ ๋ด ์๋ค. ์ด ์ ์์๋ ๋ฏธ๋ก๋ฅผ ์ฐพ์๋ด๋ ํ๋ก๊ทธ๋จ์ ๊ตฌํํ์ต๋๋ค. ํ๋ก๊ทธ๋จ์ ๋ฏธ๋ก์์ ์ฌ๋ฐ๋ฅธ ๊ธธ์ ์ฐพ์ ๋๊น์ง ์๋ชป๋ ๊ฒฝ๋ก๋ฅผ ์ฌ๋ฌ ๋ฒ ์ทจํ๋, ์ผ๋จ ์ฌ๋ฐ๋ฅธ ๊ธธ์ ์ฐพ์ ํ์๋ ์๋ชป๋ ๊ฒฝ๋ก๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๊ณง๋ฐ๋ก ๋ฏธ๋ก๋ฅผ ๋น ์ ธ๋๊ฐ ์ ์์ต๋๋ค.
Maze: representation
ํ๋ก๊ทธ๋จ ์์ฑ ์ ์ ์ผ ๋จผ์ ํด์ผ ํ ์ผ์ ๋ฏธ๋ก๋ฅผ ํํํ๋ ๊ฒ์ ๋๋ค.
๋ฏธ๋ก๋ฅผ ํํํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋งํ ๊ธธ์ 1๋ก, ํต๊ณผํ ์ ์๋ ๊ธธ์ 0์ผ๋ก ํ 2์ฐจ์ ๋ฐฐ์ด์ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค.
์ด๋ฌํ 2์ฐจ์ ๋ฐฐ์ด๋ก ํํ๋ ๋ฏธ๋ก์์ ๋ฏธ๋ก ์์ ์ฅ๋ ํ๊ณผ ์ด๋ก ์ธ์ ๋ ์ง ๊ทธ ์์น๋ฅผ ํํํ ์ ์์ต๋๋ค. ๋ง์ฝ X๊ฐ ํ์ฌ์ ์์น, maze[row][col]์ ๋ํ๋ธ๋ค๋ฉด ์๋์ ๊ทธ๋ฆผ2๋ ์ด ์์น์์ ์ด๋ ๊ฐ๋ฅํ 8๊ฐ์ ์ธ์ ์์น๋ฅผ ๋ณด์ฌ์ค๋๋ค. ์ด ์ฌ๋ ๋ฐฉํฅ์ N, NE, E, SE, S, SW, W, NW๋ก ๋ช ์ธํ ์ ์์ต๋๋ค.
๋ค๋ง, ๋ชจ๋ ์์น๊ฐ 8๊ฐ์ ์ธ์ ์์น๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ ์๋๋๋ค. ๋ง์ผ [row][col]์ด ๋ฏธ๋ก์ ๊ฐ์ฅ์๋ฆฌ, ์ฆ ๊ฒฝ๊ณ์ ์ ์๊ฒ ๋๋ฉด ์ฌ๋ ๋ฐฉํฅ์ด ์๋ ์ค์ง ์ธ ๋ฐฉํฅ๋ง ์์ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฒฝ๊ณ ์กฐ๊ฑด์ ํน์ด์ฑ์ ํผํ๊ธฐ ์ํด์๋ ๋ฏธ๋ก์ ์ฃผ์๋ฅผ 1๋ก ๋๋ฌ์์ผ๋ก์จ ํด๊ฒฐ ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด m * p ๋ฏธ๋ก๋ (m+2) * (p+2) ๋ฐฐ์ด์ด ํ์ํ๊ฒ ๋๋๋ฐ ์ด ๋, ๋ฏธ๋ก์ ์ ๊ตฌ๋ [1][1]์ด ๋๊ณ , ์ถ๊ตฌ๋ [m][p]๊ฐ ๋ฉ๋๋ค.
์ด์ ์ด๋ํ ๋ฐฉํฅ๋ค์ ์๋์ ๊ทธ๋ฆผ5์ ๊ฐ์ด ๋ฐฐ์ด move์ ๋ฏธ๋ฆฌ ์ ์ํ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ 8๊ฐ์ ๊ฐ๋ฅํ ์ด๋ ๋ฐฉํฅ์ 0์์ 7๊น์ง์ ์ซ์๋ก ๋ํ๋ด๊ณ , ๊ฐ ๋ฐฉํฅ์ ๋ํด์๋ ์ํ๊ณผ ์์ง ์ขํ์ ์คํ์ ์ผ๋ก ๋ํ๋ ๋๋ค. ์ด ํ ์ด๋ธ์ ๋ง๋ค๊ธฐ ์ํ C ์ ์ธ๋ฌธ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
typedef struct {
short int vert;
short int horiz;
} offsets;
offsets move[8]; // ๊ฐ ๋ฐฉํฅ์ ๋ํ ์ด๋ ๋ฐฐ์ด
์ด ์ํฉ์์ ํ์ฌ์ ์์น๋ฅผ maze[row][col]์ด๋ผ ํ๋ฉด, ๋ค์ ์ด๋ํ ์์น maze[nextRow][nextCol]์ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ๋ฉ๋๋ค.
nextRow = row + move[dir].vert;
nextCol = col + move[dir].horiz;
๋ฏธ๋ก๋ฅผ ์ด๋ํ ๋์๋ ์ฌ๋ฌ ๋ฐฉํฅ์ ์ ํ์ด ์์ ์ ์์ต๋๋ค. ์ด๋ ์ด๋ค ๋ฐฉํฅ์ด ์ต์์ ์ ํ์ผ์ง ์ ์ ์์ผ๋ฏ๋ก, ํ์ฌ์ ์์น๋ฅผ ์ง์ ํ๊ณ ์ ํํ ์ ์๋ ํ ๋ฐฉํฅ์ ์ ํํด์ผ ํฉ๋๋ค. ์ด๋ ๊ฒ ํ์ฌ์ ์์น๋ฅผ ์ง์ ํ๋ฉด ๋ง์ฝ ์๋ชป๋ ๊ธธ๋ก ๊ฐ๋๋ผ๋ ๋๋์์์ ๋ค๋ฅธ ๋ฐฉํฅ์ ์๋ํ ์ ์์ต๋๋ค. (stack)
๋จผ์ ๋ถ์ชฝ์์ ์์ํ์ฌ ์๊ณ ๋ฐฉํฅ์ผ๋ก ์์๋๋ก ๊ฐ๋ฅํ ๋ฐฉํฅ์ ๊ฒ์ฌํ๊ณ , ํ ๋ฒ ์๋ํ๋ ๊ธธ์ ๋ค์ ์๋ํ์ง ์๊ธฐ ์ํด ์๋ํ๋ ๊ธธ์ ๋ฐฐ์ด mark์ ๊ธฐ๋กํ์ฌ ์ ์งํ ์ ์์ต๋๋ค.
๋ฐฐ์ด mark๋ 0์ผ๋ก ์ด๊ธฐํํ๊ณ , maze[row][col]์ ๋ฐฉ๋ฌธํ๊ฒ ๋๋ฉด mark[row][col]์ 1๋ก ๋ณ๊ฒฝํฉ๋๋ค.
์ด์ ๋ฏธ๋ก ์๊ณ ๋ฆฌ์ฆ ์ฝ๋๋ฅผ ์์ฑํด๋ด ์๋ค.
๋ฏธ๋ก ํ์ ํจ์ ๊ตฌํ
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define TRUE 1
#define FALSE 0
#define MAZE_SIZE 10
#define EXIT_ROW 8
#define EXIT_COL 8
// ์คํ์ ์ ์ฅ๋ ์์น ์ ๋ณด๋ฅผ ๋ด์ ๊ตฌ์กฐ์ฒด
typedef struct {
int row; // ํ์ฌ ํ ์์น
int col; // ํ์ฌ ์ด ์์น
int dir; // ์ด๋ ๋ฐฉํฅ
} element;
// ์ด๋ ๋ฐฉํฅ์ ์ ์ํ ๊ตฌ์กฐ์ฒด (vert๋ ์์ง ์ด๋, horiz๋ ์ํ ์ด๋)
typedef struct {
int vert; // ์์ง ๋ฐฉํฅ
int horiz; // ์ํ ๋ฐฉํฅ
} offsets;
// ์คํ๊ณผ ๊ด๋ จ๋ ๋ณ์๋ค
element stack[100]; // ์คํ ๋ฐฐ์ด
int top; // ์คํ์ ์ต์์ ์ธ๋ฑ์ค
// 8๋ฐฉํฅ์ผ๋ก์ ์ด๋์ ์ ์
offsets move[8] = {
{-1, 0}, // ๋ถ์ชฝ
{-1, 1}, // ๋ถ๋์ชฝ
{0, 1}, // ๋์ชฝ
{1, 1}, // ๋จ๋์ชฝ
{1, 0}, // ๋จ์ชฝ
{1, -1}, // ๋จ์์ชฝ
{0, -1}, // ์์ชฝ
{-1, -1} // ๋ถ์์ชฝ
};
// ๋ฏธ๋ก์ ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ฐฐ์ด
int maze[MAZE_SIZE][MAZE_SIZE] = {
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1},
{1, 0, 0, 0, 1, 1, 1, 1, 1, 1},
{1, 1, 1, 0, 1, 1, 0, 0, 0, 1},
{1, 1, 1, 0, 0, 0, 0, 1, 0, 1},
{1, 1, 1, 1, 1, 1, 0, 1, 0, 1},
{1, 1, 1, 1, 1, 1, 0, 1, 0, 1},
{1, 0, 0, 0, 0, 1, 0, 1, 0, 1},
{1, 0, 1, 1, 0, 0, 0, 0, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 0, 1},
{1, 1, 1, 1, 1, 1, 1, 1, 1, 1}
};
int mark[MAZE_SIZE][MAZE_SIZE]; // ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ๊ธฐ๋กํ๋ ๋ฐฐ์ด
// ์คํ์์ ์์๋ฅผ ๊บผ๋ด์ค๋ ํจ์ (pop)
element pop(int* top) {
if (*top == -1) {
printf("Stack is empty!\n");
element dummy = { -1, -1, -1 }; // ๋น ๊ฐ ๋ฐํ
return dummy;
}
else {
return stack[(*top)--]; // ์คํ์์ ์์๋ฅผ ๊บผ๋ด์ ๋ฐํ
}
}
// ์คํ์ ์์๋ฅผ ๋ฃ๋ ํจ์ (push)
void push(element item) {
stack[++top] = item; // ์คํ์ ์์๋ฅผ ์ถ๊ฐ
}
// ๊ฒฝ๋ก๋ฅผ ํ์ํ๋ ํจ์ (์ด๋ฏธ ์ฃผ์ด์ง ํจ์)
void path(void) {
int i, row, col, next_row, next_col, dir, found = FALSE;
element position;
// ์ถ๋ฐ์ (1,1)์ ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์ํ๊ณ ์คํ์ ์ ์ฅ
mark[1][1] = 1;
top = 0; // ์คํ์ ์ต์๋จ์ 0์ผ๋ก ์ค์
stack[0].row = 1;
stack[0].col = 1;
stack[0].dir = 1;
// ์คํ์ด ๋น์ด ์์ง ์๊ณ ์ถ๊ตฌ๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ ๊ณ์ ํ์
while (top > -1 && !found) {
// ์คํ์์ ํ์ฌ ์์น๋ฅผ ๊บผ๋ด์ด
position = pop(&top);
row = position.row;
col = position.col;
dir = position.dir;
// 8๋ฐฉํฅ ํ์์ ์์
while (dir < 8 && !found) {
next_row = row + move[dir].vert;
next_col = col + move[dir].horiz;
// ์ถ๊ตฌ์ ๋์ฐฉํ ๊ฒฝ์ฐ
if (next_row == EXIT_ROW && next_col == EXIT_COL)
found = TRUE; // ์ถ๊ตฌ๋ฅผ ์ฐพ์๋ค๊ณ ํ์
else if (!maze[next_row][next_col] && !mark[next_row][next_col]) {
// ๋ฐฉ๋ฌธํ์ง ์์ ๊ฒฝ๋ก๋ผ๋ฉด
mark[next_row][next_col] = 1; // ๋ฐฉ๋ฌธํ๋ค๊ณ ํ์
// ํ์ฌ ์์น๋ฅผ ์คํ์ ์ ์ฅ
position.row = row;
position.col = col;
position.dir = ++dir; // ๋ค์ ๋ฐฉํฅ์ ์คํ์ ์ ์ฅ
push(position);
// ์ ์์น๋ก ์ด๋
row = next_row;
col = next_col;
dir = 0; // ์๋ก์ด ์์น์์ 8๋ฐฉํฅ ํ์์ ๋ค์ ์์
}
else {
++dir; // ์ด๋ํ ์ ์์ผ๋ฉด ๋ค์ ๋ฐฉํฅ์ผ๋ก ์ ํ
}
}
}
// ๊ฒฝ๋ก๋ฅผ ์ฐพ์ ๊ฒฝ์ฐ
if (found) {
printf("The path is:\n");
printf("row col\n");
for (i = 0; i <= top; i++)
printf("%2d%5d\n", stack[i].row, stack[i].col);
printf("%2d%5d\n", row, col);
printf("%2d%5d\n", EXIT_ROW, EXIT_COL);
}
// ๊ฒฝ๋ก๋ฅผ ์ฐพ์ง ๋ชปํ ๊ฒฝ์ฐ
else
printf("The maze does not have a path\n");
}
// ๋ฉ์ธ ํจ์
int main() {
// mark ๋ฐฐ์ด ์ด๊ธฐํ (0์ผ๋ก ๋ชจ๋ ์นธ์ ๋ฐฉ๋ฌธํ์ง ์์ ์ํ๋ก ์ค์ )
for (int i = 0; i < MAZE_SIZE; i++)
for (int j = 0; j < MAZE_SIZE; j++)
mark[i][j] = 0;
// ๋ฏธ๋ก ๊ฒฝ๋ก ํ์ ์์
path();
return 0;
}
path ๋ถ์: ๋ฏธ๋ก์ ํฌ๊ธฐ๊ฐ ํจ์ path์ ์ฐ์ฐ ์๊ฐ์ ๊ฒฐ์ ํฉ๋๋ค. ๋ฏธ๋ก์ ๊ฐ ์์น๋ ํ ๋ฒ๋ง ๋ฐฉ๋ฌธ๋๋ฏ๋ก ์ต์ ์ ๊ฒฝ์ฐ ์ฐ์ฐ ์๊ฐ์ O(m*p)์ ๋๋ค. ์ฌ๊ธฐ์ m๊ณผ p๋ ๊ฐ๊ฐ ๋ฏธ๋ก์ ํ๊ณผ ์ด์ ๋๋ค.
3.6 Evaluation of Expressions
์์์ ํ๊ธฐํ๋ ํ์ค ๋ฐฉ์์ ๋ ํผ์ฐ์ฐ์ ์ฌ์ด์ ์ดํญ ์ฐ์ฐ์๊ฐ ์์นํ๋ ์ค์ ํ๊ธฐ๋ฒ(infix notation)์ ๋๋ค.
(๋ง์ด ๊ฑฐ์ฐฝํ์ง 1 + 3, a // b ์ ๊ฐ์ ํํ)
์ด ์ค์ ํ๊ธฐ๋ฒ์ ์์์ ์ฐ๋ ๋ฐ ์์ด์ ๊ฐ์ฅ ๋ณดํธ์ ์ด์ง๋ง ์์์ ๊ณ์ฐํ๋ ์ปดํ์ผ๋ฌ์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ์ผ๋ฐ์ ์ผ๋ก ๊ดํธ๋ฅผ ์ฌ์ฉํ์ง ์๋ ํ์ ํ๊ธฐ๋ฒ(posifix notation)์ ์ฌ์ฉํฉ๋๋ค. ์ด ํ๊ธฐ๋ฒ์์๋ ์ฐ์ฐ์๊ฐ ํผ์ฐ์ฐ์ ์ดํ์ ์ค๋๋ฐ, ์ดํด๋ฅผ ๋๊ธฐ ์ํด ์๋์ ์ค์ ํ๊ธฐ๋ฒ๊ณผ ํ์ ํ๊ธฐ๋ฒ์ ๋น๊ตํ ํ๋ฅผ ๋ด ์๋ค.
ํ์ ํ๊ธฐ์์ ์ฐ์ฐ
์ค์ ํ๊ธฐ๋ฅผ ํ์ ํ๊ธฐ๋ก ๋ณํํ๋ ํจ์๋ฅผ ์์ฑํ๊ธฐ ์ ์, ํ์ ํ๊ธฐ์์ ์ฝ๊ฒ ์ฐ์ฐํ๋ ๋ฐฉ๋ฒ์ ๋จผ์ ๋ค๋ค๋ด ์๋ค.
'๐CS > ๐Data Structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๋ฃ๊ตฌ์กฐ] hw1 ์ ๊ทผ ํ๊ธฐ๋ฒ ์ฆ๋ช (0) | 2024.10.15 |
---|---|
[์๋ฃ๊ตฌ์กฐ] Chapter3. STACKS AND QUEUES(1) (2) | 2024.10.05 |
[์๋ฃ๊ตฌ์กฐ] Chapter2. Arrays and Structures(2) (0) | 2024.10.05 |
[์๋ฃ๊ตฌ์กฐ] Chapter2. Arrays and Structures(1) (0) | 2024.10.01 |