Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 문자열 압축
- 설탕 배달
- Servlet
- 스프링
- 포두부 보쌈
- Spring
- 스프링 MVC
- 알고리즘
- 백준
- 투어
- 맛집
- HTTP API
- 서블릿
- 다이나믹 프로그래밍
- 동적 프로그래밍
- 프로그래머스
- 완도산회
- 2638
- 1로 만들기
- dp
- 맛집 투어
- 2589
- 양꼬치
- 2020 KAKAO BLIND
- 2839
- 호유동
- 쓰레드 풀
- BFS
- 고모네 콩탕
- mvc
Archives
- Today
- Total
프로그래밍 공방
[백준] 16932번 : 모양 만들기 본문
문제
문제해결방법
이 문제를 해결하기 위해, 0인 곳을 1로 만들어서 상, 하, 좌, 우에 있는 모양들이 연결되도록 하고, 그 결과로 만들어지는 가장 큰 모양을 찾아야 겠다고 생각했다.
1. 처음에 배열을 돌면서 BFS를 통해 연결 요소들을 찾아 각 연결 요소에 번호를 붙이고 Map에 그 번호를 Key로 사이즈를 Value로 해서 저장해줬다.
2. 다시 한 번 배열을 돌면서 0인 곳마다 상, 하, 좌, 우를 탐색하며 만약 인접한 곳이 0이 아닌 다른 값이라면 Map에서 해당 값을 Key로 하는 Value(연결 요소의 사이즈)를 가져와 더해줬다.
* 인접한 요소들이 중복이 될 수 있으므로 Set에 넣어서 중복을 제거해줬다.
3. 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 | package baekjoon; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.ArrayDeque; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Queue; import java.util.Set; import java.util.StringTokenizer; public class Main16932_모양만들기 { public static int N, M, max = 0; public static int[][] map; public static int[][] dir = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; public static Map<Integer, Integer> land = new HashMap<Integer, Integer>(); public static void bfs(int i, int j, int key) { int count = 1; Queue<int[]> q = new ArrayDeque<>(); q.add(new int[]{i, j}); map[i][j] = key; while(!q.isEmpty()) { int[] cur = q.poll(); for(int d=0; d<dir.length; d++) { int x = cur[0] + dir[d][0]; int y = cur[1] + dir[d][1]; if(x>=0 && x<N && y>=0 && y<M && map[x][y]==1) { map[x][y] = key; count++; q.add(new int[]{x, y}); } } } land.put(key, count); } public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); StringTokenizer st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); map = new int[N][M]; for(int i=0; i<N; i++) { String s = br.readLine(); for(int j=0; j<M; j++) map[i][j] = s.charAt(j*2)-'0'; } int key = 2; for(int i=0; i<N; i++) { for(int j=0; j<M; j++) { if(map[i][j]==1) bfs(i, j, key++); } } Set<Integer> keySet = new HashSet<Integer>(); for(int i=0; i<N; i++) { for(int j=0; j<M; j++) { if(map[i][j]==0) { keySet.clear(); int size = 1; for(int d=0; d<dir.length; d++) { int x = i + dir[d][0]; int y = j + dir[d][1]; if(x>=0 && x<N && y>=0 && y<M && map[x][y]!=0) { keySet.add(map[x][y]); } } for(int k : keySet) { size += land.get(k); } if(max<size) max = size; } } } System.out.println(max); } } | cs |
코드에 대한 피드백이나 더 좋은 아이디어는 언제나 환영입니다.
'개발 > 문제해결' 카테고리의 다른 글
[프로그래머스] 비밀지도 (0) | 2020.12.30 |
---|---|
[프로그래머스] 보석 쇼핑 (0) | 2020.12.29 |
[백준] 1113번 : 수영장 만들기 (0) | 2020.12.23 |
[백준] 16234번 : 인구 이동 (0) | 2020.12.17 |
[백준] 1058번 : 친구 (0) | 2020.12.17 |