๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 7562_๋‚˜์ดํŠธ์˜ ์ด๋™

๋ฟŒ์•ผ._. 2022. 4. 4. 11:28

Silver I

๋ฌธ์ œ(์ถœ์ฒ˜: https://www.acmicpc.net/problem/7562)

<๋‚˜์ดํŠธ์˜ ์ด๋™>

๋ฌธ์ œ 

 

์ฒด์ŠคํŒ ์œ„์— ํ•œ ๋‚˜์ดํŠธ๊ฐ€ ๋†“์—ฌ์ ธ ์žˆ๋‹ค. ๋‚˜์ดํŠธ๊ฐ€ ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์€ ์•„๋ž˜ ๊ทธ๋ฆผ์— ๋‚˜์™€์žˆ๋‹ค. ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์ด ์ฃผ์–ด์ง„๋‹ค. ๋‚˜์ดํŠธ๋Š” ๋ช‡ ๋ฒˆ ์›€์ง์ด๋ฉด ์ด ์นธ์œผ๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ์„๊นŒ?

 

์ž…๋ ฅ

 

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ์„ธ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค. ์ฒซ์งธ ์ค„์—๋Š” ์ฒด์ŠคํŒ์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด l(4 ≤ l ≤ 300)์ด ์ฃผ์–ด์ง„๋‹ค. ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ๋Š” l × l์ด๋‹ค. ์ฒด์ŠคํŒ์˜ ๊ฐ ์นธ์€ ๋‘ ์ˆ˜์˜ ์Œ {0,..., l-1} × {0,..., l-1}๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ๋‘˜์งธ ์ค„๊ณผ ์…‹์งธ ์ค„์—๋Š” ๋‚˜์ดํŠธ๊ฐ€ ํ˜„์žฌ ์žˆ๋Š” ์นธ, ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์ด ์ฃผ์–ด์ง„๋‹ค.

 

 

์ถœ๋ ฅ 

 

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค ๋‚˜์ดํŠธ๊ฐ€ ์ตœ์†Œ ๋ช‡ ๋ฒˆ๋งŒ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

   - my solution (Python)

import sys
from collections import deque

def bfs(l, start, end, depth):
    dx=[-2,-2,-1,-1,2,2,1,1] # ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ
    dy=[-1,1,-2,2,-1,1,-2,2]

    queue=deque([start])
    visited=[[0]*l for i in range(l)] # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    visited[start[0]][start[1]]=1

    flag=0

    while queue:
        temp=queue.popleft()
        for i in range(8):
            x=temp[0]+dx[i]
            y=temp[1]+dy[i]
            if x>=0 and x<l and y>=0 and y<l: # ์ฒด์ŠคํŒ ๋ฒ”์œ„ ์•ˆ์ด๋ผ๋ฉด
                if visited[x][y]==0:
                    visited[x][y]=1 # ๋ฐฉ๋ฌธ
                    depth[x][y]=depth[temp[0]][temp[1]]+1 # ์ด๋™ ์ˆ˜
                    queue.append([x,y])
                    if x==end[0] and y==end[1]: # ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์— ๋„์ฐฉ
                        flag=1
                        break
        if flag==1:
            break


if __name__=='__main__':
    t=int(input())

    for i in range(t):
        l=int(sys.stdin.readline().strip())
        x,y=map(int, sys.stdin.readline().split()) # ํ˜„์žฌ ์œ„์น˜
        a,b=map(int, sys.stdin.readline().split()) # ์ด๋™ ์œ„์น˜

        depth=[[0]*l for j in range(l)]
        bfs(l, [x,y], [a,b], depth)

        print(depth[a][b])

 

- my solution (JAVA)

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

public class _7562_๋‚˜์ดํŠธ์˜์ด๋™ {
	static void bfs(int l, int start[], int end[], int depth[][]) {
		int dx[]= {-2,-2,-1,-1,2,2,1,1}; // ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ
		int dy[]= {-1,1,-2,2,-1,1,-2,2};
		
		int visited[][]=new int[l][l]; // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
		visited[start[0]][start[1]]=1;
		
		Queue<int []> queue=new LinkedList<>();
		queue.add(start);
		
		int flag=0;
		
		while(queue.size()!=0) {
			 int temp[]=queue.poll();
			 for(int i=0; i<8; i++) {
				 int x=temp[0]+dx[i];
				 int y=temp[1]+dy[i];
				 if(x>=0 && x<l && y>=0 && y<l) { // ์ฒด์ŠคํŒ ๋ฒ”์œ„ ์•ˆ์ด๋ผ๋ฉด
					 if(visited[x][y]==0) {
						 visited[x][y]=1; // ๋ฐฉ๋ฌธ
						 queue.add(new int[] {x,y});
						 depth[x][y]=depth[temp[0]][temp[1]]+1;
						 if(x==end[0] && y==end[1]) { // ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์— ๋„์ฐฉ
							 flag=1;
							 break;
						 }
					 }
				 }
			 }
			 if(flag==1) {
				 break;
			 }
		}
	}

	public static void main(String[] args) throws IOException {
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		
		int t=Integer.parseInt(bf.readLine()); // ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค
		
		for(int i=0; i<t; i++) {
			int l=Integer.parseInt(bf.readLine()); // ์ฒด์ŠคํŒ์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด
			
			int start[]=new int[2]; // ํ˜„์žฌ ์žˆ๋Š” ์นธ
			String s=bf.readLine();
			start[0]=Integer.parseInt(s.split(" ")[0]);
			start[1]=Integer.parseInt(s.split(" ")[1]);
			
			int end[]=new int[2]; // ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ
			s=bf.readLine();
			end[0]=Integer.parseInt(s.split(" ")[0]);
			end[1]=Integer.parseInt(s.split(" ")[1]);
			
			int depth[][]=new int[l][l];
			bfs(l,start,end,depth);
			
			System.out.println(depth[end[0]][end[1]]);
		}
	}
}

 

์‹œ์ž‘ ์œ„์น˜์—์„œ ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ๋งŒํผ ์›€์ง์—ฌ ๋‚˜์ดํŠธ๊ฐ€ ์ด๋™ํ•˜๋ ค๊ณ  ํ•˜๋Š” ์นธ์— ๋„์ฐฉํ•˜๋ฉด ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•ด์ค€๋‹ค

 

  • bfs
    : dx, dy = ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ
    : flag = break ์กฐ๊ฑด
    : queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต -> ์ œ์ผ ์ฒ˜์Œ ๊ฐ’์„ pop -> ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์ธ์ง€ ํ™•์ธํ•˜์—ฌ ์ฒด์ŠคํŒ ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด queue์— ์ถ”๊ฐ€ ๋ฐ ๋ฐฉ๋ฌธ check, ์ด๋™ํ•  ์œ„์น˜์˜ depth=ํ˜„์žฌ ์œ„์น˜์˜ depth+1
    : ์ด๋™ํ•  ์œ„์น˜๊ฐ€ ์ด๋™ํ•˜๋ ค๋Š” ์œ„์น˜์™€ ๊ฐ™๋‹ค๋ฉด ์ข…๋ฃŒ
  • main
    : t = ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค
    : l = ์ฒด์ŠคํŒ์˜ ํ•œ ๋ณ€์˜ ๊ธธ์ด
    : x, y = ํ˜„์žฌ ์œ„์น˜
    : a, b = ์ด๋™ํ•˜๋ ค๋Š” ์œ„์น˜
    : depth = ์ด๋™ ํšŸ์ˆ˜ ( result = depth [a][b] )

 


์ƒ๊ฐ๐Ÿค”

 

๋ฌธ์ œ์—์„œ ํŠน๋ณ„ํ•œ ์˜ˆ์™ธ๋Š” ์—†์—ˆ๋‹ค. ๋”ฑ ์ฃผ์–ด์ง„ ์กฐ๊ฑด์„ ๊ฐ€์ง€๊ณ  ๊ทธ๋ž˜ํ”„ ํƒ์ƒ‰ํ•˜๋ฉด ํ•ด๊ฒฐ -!

์ปดํŒŒ์ผ ์—๋Ÿฌ๋Š”... java๋กœ ์ œ์ถœํ•ด์•ผ ํ•˜๋Š”๋ฐ python์œผ๋กœ ์ œ์ถœํ•ด์„œ ๋ฐœ์ƒ...