[자바JAVA]1099 : [기초-2차원배열] 성실한 개미

문제 1099 : [기초-2차원배열] 성실한 개미

영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.
왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데, 그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.

개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다. (오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)
이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.
미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지오른쪽 또는 아래쪽으로만 움직였다.
미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.

단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는더이상 이동하지 않고 그 곳에 머무른다고 가정한다. 미로 상자의 테두리는 모두 벽으로 되어 있으며, 개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.

  • 입력예시1
1
2
3
4
5
6
7
8
9
10
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
  • 출력예시1
1
2
3
4
5
6
7
8
9
10
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
  • 입력예시2
1
2
3
4
5
6
7
8
9
10
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 0 0 1
1 0 0 0 0 1 2 0 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
  • 출력예시2
1
2
3
4
5
6
7
8
9
10
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 9 9 1
1 0 0 0 0 1 2 0 9 1
1 0 0 0 0 1 0 0 9 1
1 0 0 0 0 0 0 0 9 1
1 1 1 1 1 1 1 1 1 1




내코드

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
53
54
55
56
57
58
59
60
61
62
import java.util.Scanner;

public class c1099 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//개미집 10*10 만들기
int[][] antHouse = new int[11][11];

//개미집에 입력값 넣기
int w;
for(int i=1; i<antHouse.length; i++){
for(int j=1; j<antHouse.length; j++){
w = sc.nextInt();
antHouse[i][j] = w;
}
}

//오른쪽 아래로 내려갈수있도록 count변수로 y좌표 기억하기
int count = 2;
Boolean isTwo = false;

for(int i=2; i<11; i++){
for(int j=count; j<11; j++) {
//System.out.println("좌표(x,y)는 ("+ i +" , "+ j + ") 값은?"+antHouse[i][j]);

//먹이(2)인 경우
if (antHouse[i][j] == 2) {
isTwo = true;
antHouse[i][j] = 9;
break;
}

//갈 수 있는 길(0)인 경우
if (antHouse[i][j] == 0) {
antHouse[i][j] = 9;
}

//벽(1)인 경우
else if (antHouse[i][j] == 1) {
count = j-1;
break;
}

}

//먹이(2)인 경우
if(isTwo) {
break;
}
}
sc.close();

//출력
for(int i=1; i<antHouse.length; i++){
for(int j=1; j<antHouse.length; j++){
System.out.printf("%d ", antHouse[i][j]);
}
System.out.println();
}

}
}




문제 풀이

개미는 조건상 항상 오른쪽과 아래로만 움직이기때문에 좌표(x,y)에서 y좌표를 기억해야했다.
따라서 count라는 변수를 생성하여 y좌표를 기억하고 x++를 시켰다.
또한 antHouse[i][j] == 2인 경우에는 flag를 걸어두어 이중 for문을 다 빠져나갈 수 있도록 설계했다.
문제를 해결하고 나서 더 나은 방법이 있는지 구글링했는데 while문으로 좌표를 증가시켜 해결하는 방법으로도 풀수도 있었다.




다른 문제 풀이가 보고싶다면?