[C언어 코드업 문제풀이] CodeUp 1099 : [기초-2차원배열] 성실한 개미
코드업 1099번 성실한 개미 문제 풀이 해답입니다.
1. 문제 설명
영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.
왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데,
그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.
개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다.
(오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)
이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.
미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지
오른쪽 또는 아래쪽으로만 움직였다.
미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,
먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.
단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는
더이상 이동하지 않고 그 곳에 머무른다고 가정한다.
미로 상자의 테두리는 모두 벽으로 되어 있으며,
개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.
2. 입력
10*10 크기의 미로 상자의 구조와 먹이의 위치가 입력된다.
3. 출력
성실한 개미가 이동한 경로를 9로 표시해 출력한다.
4. 입력 예시
1 1 1 1 1 1 1 1 1 1
1 0 0 1 0 0 0 0 0 1
1 0 0 1 1 1 0 0 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 0 0 1 0 1
1 0 0 0 0 1 0 1 0 1
1 0 0 0 0 1 2 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
5. 출력 예시
1 1 1 1 1 1 1 1 1 1
1 9 9 1 0 0 0 0 0 1
1 0 9 1 1 1 0 0 0 1
1 0 9 9 9 9 9 1 0 1
1 0 0 0 0 0 9 1 0 1
1 0 0 0 0 1 9 1 0 1
1 0 0 0 0 1 9 1 0 1
1 0 0 0 0 1 0 0 0 1
1 0 0 0 0 0 0 0 0 1
1 1 1 1 1 1 1 1 1 1
6. 문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include "stdio.h"
int main()
{
int matrix[11][11] = {}; //[세로][가로]
for(int j = 1; j<=10; j++ ){
for(int i = 1; i<=10; i++ ){
scanf("%d ",&matrix[j][i]);
}
}
int x,y;
x = 2;
y = 2;
while(1){
if(matrix[x][y] == 0){
matrix[x][y] = 9;
y ++;
}
if(matrix[x][y] == 1){
y --;
x++;
}
if(matrix[x][y] == 2){
matrix[x][y] = 9;
break;
}
else if(matrix[x][y+1] == 1 && matrix[x+1][y] == 1){
if(matrix[x][y] == 0){
matrix[x][y] = 9;
}
break;
}
}
for(int i = 1; i <= 10; i++){
for(int j =1; j <= 10; j++){
printf("%d ",matrix[i][j]);
}
printf("\n");
}
return 0;
}
|
while 문을 이용해서 풀었습니다.
개미는 항상 오른쪽으로 움직이며 가로막혀있을 경우(다음 길이 1일 경우) 아래로 내려가게 됩니다.
if(matrix[x][y] == 0){
matrix[x][y] = 9;
y ++;
}
현 위치가 0일 경우 9로 표시를 하며 왼쪽(y)로 한칸 이동합니다.
if(matrix[x][y] == 1){
y --;
x++;
}
다음 길이 1이라면(가로막혀 있다면) y--로 다시 왼쪽으로(이전에 오른쪽으로 이동했으므로) 한칸, 아래로 한칸(x++) 이동해줍니다.
그 후 2가 나오거나(먹이거나), 오른쪽,아래가 모두 1로 가로 막혀 있다면 break 문으로 while문을 빠져나가 줍니다. 그런데 여기서
else if(matrix[x][y+1] == 1 && matrix[x+1][y] == 1){
if(matrix[x][y] == 0){
matrix[x][y] = 9;
}
break;
}
위의 0과1을 찾는 과정에서 이미 y나 x를 증감했기때문에 현 위치의 0번을 탐색하지 않았습니다. 따라서 오른쪽,아래로 1칸 더 이동했을때 막혀있다면 현재값이 0인경우 9로 경로를 이동했다고 표시해줍니다.
감사합니다.
'ET의 공부 > C언어 연습문제[ 코드업 ]' 카테고리의 다른 글
[C언어 코드업 문제풀이] CodeUp 1461 : [기초-배열연습] 2차원 배열 순서대로 채우기 1-2 (0) | 2020.04.16 |
---|---|
[C언어 코드업 문제풀이] CodeUp 1460 : [기초-배열연습] 2차원 배열 순서대로 채우기 1-1 (1) | 2020.04.16 |
[C언어 코드업 문제풀이] CodeUp 1098 : [기초-2차원배열] 설탕과자 뽑기 (0) | 2020.04.14 |
[C언어 코드업 문제풀이] CodeUp 1097 : [기초-2차원배열] 바둑알 십자 뒤집기(설명) (0) | 2020.04.14 |
[C언어 코드업 문제풀이] CodeUp 1096 : [기초-2차원배열] 바둑판에 흰 돌 놓기(설명) (0) | 2020.04.14 |