DY N DY
알고리즘 저글링 방사능 오염(JAVA) 본문
1078 : 저글링 방사능 오염
제한시간: 1Sec 메모리제한: 64mb
해결횟수: 697회 시도횟수: 2725회
승훈이는 심심한 시간에 스타크래프트(Starcraft) 게임을 하며 놀고 있었다. 스타크래프트 유닛중 하나인 저글링을 한 곳에 몰아세운 뒤, 방사능 오염 공격으로 없애보려고 했다. 그런데 좀 더 재미있게 게임을 하기 위해서 게임을 개조하여 방사능 오염 공격을 가하면 방사능은 1초마다 이웃한 저글링에 오염된다. 그리고 방사능에 오염된 저글링은 3초 후에 죽게 된다. 예를 들어 아래 왼쪽그림과 같이 모여 있는 저글링 중에 빨간 동그라미 표시를 한 저글링에게 방사능 오염공격을 가하면, 총 9초 후에 저글링들이 죽게 된다. 아래 오른쪽에 있는 그림의 숫자들은 각 저글링들이 죽는 시간이다.
저글링을 모아놓은 지도의 크기와 지도상에 저글링들이 놓여 있는 격자 위치가 주어질 때, 총 몇 초 만에 저글링들을 모두 없앨 수 있는지 알아보는 프로그램을 작성하시오.
[Copy]7 8 0010000 0011000 0001100 1011111 1111011 0011100 0011100 0001000 3 5 | [Copy]9 0 |
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.Scanner;
- public class Main {
- @SuppressWarnings("resource")
- public static void main(String[] args) {
- Queue<Point> queue = new LinkedList<Point>();
- int[][] map = null;
- int x = sc.nextInt();
- int y = sc.nextInt();
- map = new int[y][x];
- char[] tmp = null;
- //입력이 붙어서 들어오기 때문에 문자열로 받아서 각각 숫자로 저장.
- sc.nextLine();
- for (int i = 0; i < map.length; i++) {
- tmp = sc.nextLine().toCharArray();
- for (int j = 0; j < map[i].length; j++) {
- map[i][j] = tmp[j] - '0';
- }
- }
- //시작위치 입력
- int stY = sc.nextInt() - 1;
- int stX = sc.nextInt() - 1;
- //queue에 연산할 위치(시작위치) 삽입
- queue.add(new Point(stX, stY));
- //시작위치는 3초후 죽음.
- map[stX][stY] = 3;
- //죽는시간 체크
- // 감염시킬게 없을 때 까지(queue에 더이상 연산 할 게 없을 떄 까지)
- while(!queue.isEmpty())
- {
- count++;
- }
- // 살아남은 저글링수 계산
- int aliveCount = 0;
- for (int i = 0; i < map.length; i++) {
- for (int j = 0; j < map[0].length; j++) {
- if(map[i][j] == 1){
- aliveCount++;
- }
- }
- }
- }
- //bfs
- private static void bfs(int[][] map, Queue<Point> q,
- Point a = null;
- int size = q.size();
- for(int len = 0 ; len < size; ++len)
- {
- a = q.remove();
- if(a.x-1 >= 0)
- {
- if(map[a.x - 1][a.y]== 1)
- {
- q.add(new Point(a.x-1, a.y));
- }
- }
- if(a.x+1 < map.length)
- {
- if(map[a.x + 1][a.y]== 1)
- {
- q.add(new Point(a.x+1, a.y));
- }
- }
- if(a.y-1 >= 0)
- {
- if(map[a.x][a.y-1] == 1)
- {
- q.add(new Point(a.x,a.y-1));
- }
- }
- if(a.y+1 < map[0].length)
- {
- if(map[a.x][a.y+1] == 1)
- {
- q.add(new Point(a.x,a.y+1));
- }
- }
- }
- }
- }
- class Point {
- public int x;
- public int y;
- public Point(int x, int y) {
- this.x = x;
- this.y = y;
- }
- }
이상하게 복사가 되서 탭이 적용이 안됬다.. 이클립스라면 ctrl+a로 전체 선택 후 ctrl+i로 자동 indent를 적용하면 보기 쉬울 것.
너비 우선 탐색(bfs)문제의 기본 문제라고 할 수 있다.
보통 bfs의 경우 queue를 사용해 풀면 쉽게 풀 수 있다.
시작점이 주어지고(queue에 삽입), 주어진 점(queue에서 꺼냄) 더이상 감염될 수 없을 때 까지 반복하여 4방향(위, 아래, 왼쪽, 오른쪽)으로 감염을 시도한다.
이때 저글링이 없거나(0) 바운더리라면 감염하지 않으며, 저글링이 있는 경우 저글링이 죽을 시간을 그 위치에 설정해준다(count변수)
이 저글링은 다시 queue로 삽입해준다.(새로운 시작점이 된다.)
반복하여 queue에 아무 저글링의 위치도 들어와있지 않을 때 함수는 종료되며
map(저글링이 죽는 시간이 써있는 2차원 배열)에 각 저글링이 몇 초에 죽는지 등록되고 이 시간이 등록되지 않은 저글링(1로 남아있는 저글링)이 살아있는 저글링이다.
'PARK > ALGORITHM' 카테고리의 다른 글
실력키우기 대각선 지그재그(JAVA) (0) | 2016.04.12 |
---|---|
실력키우기 문자삼각형1(JAVA) (0) | 2016.04.12 |
실력키우기 달팽이사각형(C++) (0) | 2016.04.12 |
알고리즘 색종이만들기(C++) (0) | 2016.04.11 |
실력키우기 소수구하기(C++) (0) | 2016.04.10 |