제출 코드
- 사용 알고리즘 :
BFS
스터디에서 받은 피드백을 바탕으로, 코드를 더 간결하게 수정했다
-
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
package gold; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class G1245_farmManagement { static final int peek = 501; // 탐색한 산봉우리 체크용 (산봉우리 최대 높이=500) static int N, M; static int[][] map; static boolean[][] visit; static int[] di = {-1, -1, -1, 0, 1, 1, 1, 0}; static int[] dj = {-1, 0, 1, 1, 1, 0, -1, -1}; static class Node{ int i; int j; Node(int i, int j){ this.i = i; this.j = j; } } // 해당 격자에서 bfs로 팔방탐색 static List<Node> bfs(int i, int j) { List<Node> list = new ArrayList<>(); Queue<Node> queue = new LinkedList<>(); queue.add(new Node(i, j)); visit[i][j] = true; while(!queue.isEmpty()) { Node now = queue.poll(); list.add(now); for(int d=0; d<8; d++) { int ni = now.i + di[d]; int nj = now.j + dj[d]; if(ni<0 || ni>=N || nj<0 || nj>=M || visit[ni][nj]) continue; if(map[ni][nj] > map[now.i][now.j]) { // 더 높은 곳 만나면 산봉우리 리스트 비우고 리턴 list.clear(); return list; } else if(map[ni][nj] == map[now.i][now.j]) queue.add(new Node(ni, nj)); visit[ni][nj] = true; } } return list; } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] line = br.readLine().split(" "); N = Integer.parseInt(line[0]); M = Integer.parseInt(line[1]); map = new int[N][M]; for(int i=0; i<N; i++) { line = br.readLine().split(" "); for(int j=0; j<M; j++) { map[i][j] = Integer.parseInt(line[j]); } } int cnt = 0; for(int i=0; i<N; i++) { for(int j=0; j<M; j++) { if(map[i][j] == peek || map[i][j] == 0) continue; // 이미 탐색한 산봉우리나, 평지 제외 visit = new boolean[N][M]; List<Node> list = bfs(i, j); // 탐색된 산봉우리 리스트 if(!list.isEmpty()) { cnt++; for(Node no: list) { map[no.i][no.j] = peek; } } } } System.out.println(cnt); } }
-
2차 코드 : 피드백 반영 후
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
package gold; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.Queue; public class G1245_farmManagement { static final int peek = 501; // 탐색한 산봉우리 체크용 (산봉우리 최대 높이=500) static int N, M, cnt = 0; static int[][] map; static boolean[][] visit; static int[] di = {-1, -1, -1, 0, 1, 1, 1, 0}; static int[] dj = {-1, 0, 1, 1, 1, 0, -1, -1}; static class Node{ int i; int j; Node(int i, int j){ this.i = i; this.j = j; } } // 해당 격자에서 bfs로 팔방탐색 static void bfs(int i, int j) { List<Node> list = new ArrayList<>(); Queue<Node> queue = new LinkedList<>(); queue.add(new Node(i, j)); visit[i][j] = true; loop : while(!queue.isEmpty()) { Node now = queue.poll(); list.add(now); for(int d=0; d<8; d++) { int ni = now.i + di[d]; int nj = now.j + dj[d]; if(ni<0 || ni>=N || nj<0 || nj>=M || visit[ni][nj]) continue; if(map[ni][nj] > map[now.i][now.j]) { // 더 높은 곳 만나면 산봉우리 리스트 비우고 리턴 list.clear(); break loop; } else if(map[ni][nj] == map[now.i][now.j]) queue.add(new Node(ni, nj)); visit[ni][nj] = true; } } if(!list.isEmpty()) { // 탐색한 산봉우리 표시해두기 cnt++; for(Node no: list) map[no.i][no.j] = peek; } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); String[] line = br.readLine().split(" "); N = Integer.parseInt(line[0]); M = Integer.parseInt(line[1]); map = new int[N][M]; for(int i=0; i<N; i++) { line = br.readLine().split(" "); for(int j=0; j<M; j++) { map[i][j] = Integer.parseInt(line[j]); } } for(int i=0; i<N; i++) { for(int j=0; j<M; j++) { if(map[i][j] == peek || map[i][j] == 0) continue; // 이미 탐색한 산봉우리나, 평지 제외 visit = new boolean[N][M]; bfs(i, j); // 산봉우리 탐색 } } System.out.println(cnt); } }