🌞Algorithm/🔥Baekjoon

[Baekjoon] 17129_윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유

뿌야._. 2023. 3. 9. 23:24

Silver I

문제(출처: https://www.acmicpc.net/problem/17129)

< 윌리암슨수액빨이딱따구리가 정보섬에 올라온 이유 >

 

문제 풀이

 

bfs를 활용하며 가장 빨리 도착할 수 있는 음식까지의 최단 거리를 구하였다.

 

 

 - my solution (Java)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class _17129_ {
	static int n,m, arr[][], result;
	static boolean visited[][];
	static int dx[]= {-1,1,0,0};
	static int dy[]= {0,0,-1,1};

	public static void main(String[] args) throws IOException {
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st=new StringTokenizer(bf.readLine());
		
		n=Integer.parseInt(st.nextToken());
		m=Integer.parseInt(st.nextToken());
		
		arr=new int[n][m];
		visited=new boolean[n][m];
		result=-1;
		
		int x=-1, y=-1;
		for(int i=0; i<n; i++) { // input
			String str=bf.readLine();
			for(int j=0; j<m; j++) {
				arr[i][j]=str.charAt(j)-'0';
				if(arr[i][j]==1) visited[i][j]=true;
				if(arr[i][j]==2) { // 윌리암슨수액빨이딱따구리 위치
					x=i;
					y=j;
				}
			}
		}
		search(x,y);
		if(result>-1) {
			System.out.println("TAK");
			System.out.println(result);
		}else System.out.println("NIE");
	}

	private static void search(int x, int y) {
		Queue<int[]>queue=new LinkedList<>();
		queue.add(new int[] {x,y,0});
		visited[x][y]=true;
		
		while(!queue.isEmpty()) {
			int temp[]=queue.poll();
			for(int i=0; i<4; i++) {
				int num1=temp[0]+dx[i];
				int num2=temp[1]+dy[i];
				if(num1>=0 && num1<n && num2>=0 && num2<m && !visited[num1][num2]) {
					visited[num1][num2]=true;
					if(arr[num1][num2]==3 || arr[num1][num2]==4 || arr[num1][num2]==5) {
						result=temp[2]+1;
						break;
					}
					queue.add(new int[] {num1, num2, temp[2]+1});
				}
			}
			if(result>-1) break;
		}
	}
}

 

Main

- 정보섬의 크기 n과 m 입력

- 정보섬 정보를 입력받으며 장애물로 막힌 부분은 이동할 수 없으므로 방문 표시를 하고, 시작 위치인 윌리암슨수액빨리딱따구리 위치를 저장해 둔다.

- search 함수 호출

- 음식을 먹을 수 있으면 TAK과 최단 거리 출력, 음식을 먹을 수 없으면 NIE 출력

 

Search

- queue에 [x좌표, y좌표, 거리]를 넣어준다.

- queue가 빌 때까지 반복하며 상하좌우를 탐색하여 정보섬 내부이며 아직 방문하지 않은 곳이면 방문 표시 및 queue에 넣어준다. 만약 음식에 도달했으면 reuslt에 값을 넣어준 후 바로 종료해 준다.


생각🤔

 


'🌞Algorithm > 🔥Baekjoon' 카테고리의 다른 글

[Baekjoon] 22352_항체 인식  (0) 2023.03.20
[Baekjoon] 13549_숨바꼭질 3  (0) 2023.03.12
[Baekjoon] 15558_점프 게임  (0) 2023.03.09
[Baekjoon] 14395_4연산  (0) 2023.03.05
[Baekjoon] 12761_돌다리  (0) 2023.03.03