developer-ellen
인간 디버거의 로그 찍기
developer-ellen
전체 방문자
오늘
어제
  • 분류 전체보기 (217)
    • 회고록 (0)
    • 취뽀 및 커리어 여정의 Stack (2)
      • SSAFY 7기 (2)
    • 프로그래밍공부 (24)
      • c++ (0)
      • JAVA (3)
      • Spring (5)
      • design pattern (3)
      • BackDB (1)
      • Servlet&JSP (3)
      • Vue (4)
      • JPA (4)
      • Infra (1)
      • Linux (0)
    • AI (3)
      • papers (3)
      • trend (0)
    • 프로젝트진행 (0)
      • 데이터베이스 (0)
      • 서버개발 (0)
      • 인공지능 (0)
      • 하루정리 (0)
    • 포트폴리오 (0)
    • 알고리즘 (158)
      • 알고리즘문풀 (155)
      • 알고리즘공부 (3)
    • 통계공부 (15)
      • 시계열분석 (15)
      • 회귀분석 (0)
    • CS (14)
      • 컴퓨터네트워크 (4)
      • 운영체제 (8)
      • 데이터베이스 (2)
    • 주저리주저리 (0)
      • 필사 (0)
    • 취업관련정보 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 시계열
  • c++ 빌더 패턴
  • 통계학
  • 삼성코테자바준비
  • 운영체제인터럽트
  • Arima
  • AR모형
  • 데이터분석
  • 삼성코테구현문제추천
  • 백준파이썬풀이
  • 시계열분석
  • 삼성코테파이썬
  • c++디자인패턴
  • 삼성코테준비
  • 삼성코테파이썬준비
  • SW역량테스트파이썬풀이
  • 삼성코테자바꿀팁
  • 삼성코테기출
  • 카카오코테java풀이
  • SW역량테스트파이썬
  • 삼성코테자바풀이
  • 카카오코테
  • 삼성코테기출자바풀이
  • ARIMA모형
  • BOJ파이썬풀이
  • 코테파이썬
  • 삼성코테구현풀이
  • 통계분석
  • 삼성코테파이썬풀이
  • MA모형

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
developer-ellen

인간 디버거의 로그 찍기

알고리즘/알고리즘문풀

BOJ - 연구소 3 17142번 (JAVA)

2022. 4. 29. 22:54

❓ 문제 - 백준 연구소 3 17142번 - JAVA 풀이법

 

출처 

(https://www.acmicpc.net/problem/17142)

 

17142번: 연구소 3

인체에 치명적인 바이러스를 연구하던 연구소에 승원이가 침입했고, 바이러스를 유출하려고 한다. 바이러스는 활성 상태와 비활성 상태가 있다. 가장 처음에 모든 바이러스는 비활성 상태이고

www.acmicpc.net

 

 

📝 문제해결법

1. 이 문제는 DFS(조합) + BFS로 풀었다.

  • 바이러스 중 M개의 활성 바이러스로 시킬 것들의 조합을 만든 후 해당 조합에서 다른 바이러스가 아닌 곳까지 다 퍼트리는데 얼만큼 시간이 걸리는지의 최솟값을 계속 갱신한다.
  • BFS 내에서는 선택된 바이러스를 활성으로 만들고 큐에 넣고 인접한 4방향으로 탐색하면서 만약 바이러스가 아닌 곳(0)이라면 퍼트리는 시간을 해당 노드를 방문하는데 걸리는 거리만큼 계속 최대값 갱신해준다. 만약 비활성 바이러스인 곳을 만났다면 큐에만 넣어주고 방문처리 해준다.

 

2. 느낀점

  • 처음에 비활성 바이러스와 바이러스가 아닌 빈칸의 차이점을 몰랐는데 그냥 비활성 바이러스도 하나의 빈칸으로 취급하고, 바이러스를 다 퍼트리는데 걸리는 최대 시간을 반영할 때는 빈칸에 도달했을 때만 맞춰서 구현해주면 됐다..!
  • 앞으로 잘 구현한 것 같은데 테케에 맞지 않는다면 테케 하나씩 분석해서 왜 이런 출력값이 나오는지 역 분석해서 맞춰서 코딩하자 ! 그리고.. 문제를 잘 읽자 ^_^

 

💻 소스코드

// BOJ - 연구소3(17142번)
// DFS + BFS
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main_17142 {
	public static int n, m, ans, zero_cnt;
	public static int[][] map;
	public static int[] dx = {-1, 1, 0, 0};
	public static int[] dy = {0, 0, -1, 1};
	public static class Node {
		int x;
		int y;
		int dis;
		public Node(int x, int y) {
			this.x = x;
			this.y = y;
		}
		
		public Node(int x, int y, int dis) {
			this.x = x;
			this.y = y;
			this.dis = dis;
		}

	}
	public static ArrayList<Node> virus;
	
	public static void main(String[] args) throws IOException{
		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][n];
		ans = Integer.MAX_VALUE;
		virus = new ArrayList<>();
		zero_cnt = 0;
		for(int i=0;i<n;i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for(int j=0;j<n;j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				if(map[i][j] == 2) {
					virus.add(new Node(i, j));
				} else if(map[i][j] == 0) {
					zero_cnt++;
				}

			}
		}
		
		dfs(0, 0, new int[m]);
		
		if(ans == Integer.MAX_VALUE) {
			System.out.println(-1);
		} else {
			System.out.println(ans);
		}
		
	}
	
	public static void dfs(int depth, int start, int[] arr) {
		if(depth == m) {
			int time = bfs(arr);
			if(time != -1) {
				ans = Math.min(ans, time);
			}
			return;
		}
		
		for(int i=start;i<virus.size();i++) {
			arr[depth] = i;
			dfs(depth+1, i+1, arr);
		}
	}
	
	public static int bfs(int[] arr) {
		Queue<Node> q = new LinkedList<>();
		boolean[][] visited = new boolean[n][n];
		for(int a:arr) {
			Node node = virus.get(a);
			node.dis = 0;
			visited[node.x][node.y] = true;
			q.add(node);
		}
		int time = 0;
		int cnt = 0;
		while(!q.isEmpty()) {
			Node node = q.poll();
			for(int d=0;d<4;d++) {
				int nx = node.x + dx[d];
				int ny = node.y + dy[d];
				if(0 <= nx && nx < n && 0 <= ny && ny < n) {
				if(!visited[nx][ny]) {
					if(map[nx][ny] == 0) {
						visited[nx][ny] = true;
						cnt++;
						time = Math.max(time, node.dis+1);
						q.add(new Node(nx, ny, node.dis+1));
					} else if(map[nx][ny] == 2){
						visited[nx][ny] = true;
						q.add(new Node(nx, ny, node.dis+1));
					}
				}
			}
			}
		}
		
		if(cnt != zero_cnt) return -1;
		
		return time;
		
		
	}

}

'알고리즘 > 알고리즘문풀' 카테고리의 다른 글

BOJ - 원판 돌리기 17822번 (JAVA)  (0) 2022.04.30
BOJ - 새로운 게임2 17837번 (JAVA)  (0) 2022.04.29
BOJ - 이차원 배열과 연산 17140번 (JAVA)  (0) 2022.04.29
BOJ - 낚시왕 17143번 (JAVA)  (0) 2022.04.29
BOJ - 미세먼지 안녕! 17144번 (JAVA)  (0) 2022.04.29
    '알고리즘/알고리즘문풀' 카테고리의 다른 글
    • BOJ - 원판 돌리기 17822번 (JAVA)
    • BOJ - 새로운 게임2 17837번 (JAVA)
    • BOJ - 이차원 배열과 연산 17140번 (JAVA)
    • BOJ - 낚시왕 17143번 (JAVA)
    developer-ellen
    developer-ellen

    티스토리툴바