1. 문제

www.acmicpc.net/problem/2564

 

2564번: 경비원

첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄�

www.acmicpc.net

 

 

2. 접근방법

맵을 만들어서 현재 위치부터 bfs돌리면서 상점을 만나면 거리를 result에 계속 더해주는 식으로 풀었다.

 

가로와 세로의 길이가 주어지기 때문에 맵 크기는 map[세로+1][가로+1]로 지정해준다.

그리고 맵의 테두리가 갈 수 있는 길임을 알려주려고 1로 채워 넣었다.

그리고 상점의 위치에는 2를 넣어준다.

상점의 위치는 동서남북 위치에 거리를 잘 계산하면 된다.

 

이제 내 위치부터 시작해서 bfs로 돌며 상점을 만나면 지금까지의 dist만큼 result에 더하고 모든 상점을 만나면 종료한다

 


3. 풀이

1. 맵 만들어서 테두리에 1넣고 상점 위치에 2 넣기

2. 내 위치부터 bfs를 돌리며 상점을 만나면 지금까지 dist만큼 result에 더하기

3. 모든 상점을 만나면 끝내고 result 출력

 

4. 자바 코드

package Silver;

import java.awt.Point;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class P2564경비원 {
	static int G,S;
	static int dr[] = {1,-1,0,0};
	static int dc[] = {0,0,1,-1};
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		G = Integer.parseInt(st.nextToken());// 가로
		S = Integer.parseInt(st.nextToken());// 세로

		int map[][] = new int[S+1][G+1];
		boolean visited[][] = new boolean[S+1][G+1];
		for (int i = 0; i < S+1; i++) {
			map[i][0] = 1;
			map[i][G] = 1;
		}
		for (int i = 0; i < G+1; i++) {
			map[0][i] = 1;
			map[S][i] = 1;
		}
		int N = Integer.parseInt(br.readLine());
		for (int i = 0; i < N; i++) {
			st = new StringTokenizer(br.readLine());
			int direct = Integer.parseInt(st.nextToken());
			int dist = Integer.parseInt(st.nextToken());
			Point xy = makexy(direct, dist);
			map[xy.x][xy.y] = 2;
		}
		
		
		st = new StringTokenizer(br.readLine());
		Point me = makexy(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
		visited[me.x][me.y] = true;
		int result = 0;
		Queue<Point> que = new LinkedList<Point>();
		que.add(me);
		que.add(new Point(-1, -1));
		int dist = 1;
		int cnt = 0;
		gg:while (true) {
			Point now = que.poll();
			if (now.x == -1) {
				dist++;
				if(que.isEmpty())
					break;
				que.add(new Point(-1,-1));
			}
			
			for(int i = 0 ; i < 4 ;i++) {
				int row = now.x+ dr[i];
				int col = now.y+ dc[i];
				if(row<0 || col<0 || row>= S+1 || col>=G+1)
					continue;
				if(map[row][col] == 0)
					continue;
				if(visited[row][col])
					continue;
				
				visited[row][col] = true;
				if(map[row][col] == 2) {
					result+=dist;
					if(++cnt == N)
						break gg;
				}
				que.offer(new Point(row,col));
			}
		}
		System.out.println(result);

	}
	static Point makexy(int direct,int dist) {
		if(direct == 1) 
			return new Point(0,dist);
		
		else if(direct == 2)
			return new Point(S,dist);
		
		else if(direct == 3) 
			return new Point(dist,0);
		
		else if(direct == 4)
			return new Point(dist,G);
		return null;
	}

}

5. 마치며

처음엔 bfs안쓰고 공식을 만들어서 풀어보려 했는데 생각보다 신경써줘야 하는 부분이 많길래 그냥 맵만들어서 bfs로 풀어버렸다.

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

[백준] 2477 참외밭  (1) 2020.09.23
[백준] 1244 스위치 켜고 끄기  (0) 2020.09.19
[백준] 2563 색종이  (0) 2020.09.19
[백준] 17135 캐슬디펜스  (0) 2020.09.13
[백준] 16174 점프왕쩰리(Large)  (0) 2020.09.04

+ Recent posts