๐ŸŒžAlgorithm/๐Ÿ”ฅBaekjoon

[Baekjoon] 16948_๋ฐ์Šค ๋‚˜์ดํŠธ

๋ฟŒ์•ผ._. 2022. 4. 15. 13:06

Silver I

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

<๋ฐ์Šค ๋‚˜์ดํŠธ>

๋ฌธ์ œ 

 

๊ฒŒ์ž„์„ ์ข‹์•„ํ•˜๋Š” ํ๋ธŒ ๋Ÿฌ๋ฒ„๋Š” ์ฒด์Šค์—์„œ ์‚ฌ์šฉํ•  ์ƒˆ๋กœ์šด ๋ง "๋ฐ์Šค ๋‚˜์ดํŠธ"๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค. ๋ฐ์Šค ๋‚˜์ดํŠธ๊ฐ€ ์žˆ๋Š” ๊ณณ์ด (r, c)๋ผ๋ฉด, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํฌ๊ธฐ๊ฐ€ N×N์ธ ์ฒด์ŠคํŒ๊ณผ ๋‘ ์นธ (r1, c1), (r2, c2)๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋ฐ์Šค ๋‚˜์ดํŠธ๊ฐ€ (r1, c1)์—์„œ (r2, c2)๋กœ ์ด๋™ํ•˜๋Š” ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ๊ตฌํ•ด๋ณด์ž. ์ฒด์ŠคํŒ์˜ ํ–‰๊ณผ ์—ด์€ 0๋ฒˆ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.

๋ฐ์Šค ๋‚˜์ดํŠธ๋Š” ์ฒด์ŠคํŒ ๋ฐ–์œผ๋กœ ๋ฒ—์–ด๋‚  ์ˆ˜ ์—†๋‹ค.

 

 

์ž…๋ ฅ

 

์ฒซ์งธ ์ค„์— ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ N(5 ≤ N ≤ 200)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‘˜์งธ ์ค„์— r1, c1, r2, c2๊ฐ€ ์ฃผ์–ด์ง„๋‹ค.

 

 

์ถœ๋ ฅ 

 

์ฒซ์งธ ์ค„์— ๋ฐ์Šค ๋‚˜์ดํŠธ๊ฐ€ (r1, c1)์—์„œ (r2, c2)๋กœ ์ด๋™ํ•˜๋Š” ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ์—๋Š” -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

 

 

๋ฌธ์ œ ํ’€์ด

   - my solution (Python)

import sys
from collections import deque

if __name__=='__main__':
    n=int(input()) # ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ
    x1,y1,x2,y2=map(int,sys.stdin.readline().split())

    queue=deque([[x1,y1]])
    dx=[-2,-2,0,0,2,2] # ์ด๋™
    dy=[-1,1,-2,2,-1,1]
    visited=[[0] * n for i in range(n)] # ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
    cnt = [[-1] * n for i in range(n)] # ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜

    visited[x1][y1]=1
    cnt[x1][y1]=0 # ์‹œ์ž‘ ์œ„์น˜
    flag=0


    while queue:
        temp=queue.popleft()
        for i in range(6):
            x=temp[0]+dx[i]
            y=temp[1]+dy[i]
            if x>=0 and x<n and y>=0 and y<n: # ์ฒด์ŠคํŒ ๋ฒ”์œ„ ์•ˆ
                if visited[x][y]==0: # ์•„์ง ๋ฐฉ๋ฌธ x
                    visited[x][y]=1 # ๋ฐฉ๋ฌธ
                    cnt[x][y]=cnt[temp[0]][temp[1]]+1 # ์ด๋™ ํšŸ์ˆ˜ +1
                    queue.append([x,y])
                if x==x2 and y==y2: # ์ข…๋ฃŒ ์กฐ๊ฑด
                    flag=1
                    break
        if flag==1:
            break

    print(cnt[x2][y2])

 

- 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 _16948_๋ฐ์Šค๋‚˜์ดํŠธ {

	public static void main(String[] args) throws IOException{
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		
		int n=Integer.parseInt(bf.readLine()); // ์ฒด์ŠคํŒ์˜ ํฌ๊ธฐ
		int x1=0;
		int y1=0;
		int x2=0;
		int y2=0;
		String s=bf.readLine();
		for(int i=0; i<4; i++) {
			x1=Integer.parseInt(s.split(" ")[0]);
			y1=Integer.parseInt(s.split(" ")[1]);
			x2=Integer.parseInt(s.split(" ")[2]);
			y2=Integer.parseInt(s.split(" ")[3]);
		}
		
		Queue<int []>queue=new LinkedList<>();
		int dx[]= {-2,-2,0,0,2,2}; // ์ด๋™
		int dy[]= {-1,1,-2,2,-1,1};
		int visited[][]=new int[n][n]; // ๋ฐฉ๋ฌธ ์—ฌ๋ถ€
		int cnt[][]=new int[n][n]; // ์ตœ์†Œ ์ด๋™ ํšŸ์ˆ˜
		
		queue.add(new int[] {x1,y1});
		visited[x1][y1]=1; 
		int flag=0;
		
		while(queue.size()!=0) {
			int temp[]=queue.poll();
			for(int i=0; i<6; i++) {
				int x=temp[0]+dx[i];
				int y=temp[1]+dy[i];
				if(x>=0 && x<n && y>=0 && y<n) { // ์ฒด์ŠคํŒ ๋ฒ”์œ„ ์•ˆ
					if(visited[x][y]==0) { // ์•„์ง ๋ฐฉ๋ฌธ x
						visited[x][y]=1; // ๋ฐฉ๋ฌธ
						cnt[x][y]=cnt[temp[0]][temp[1]]+1; // ์ด๋™ ํšŸ์ˆ˜ +1
						queue.add(new int[] {x,y});
					}
					if(x==x2 && y==y2) { // ์ข…๋ฃŒ ์กฐ๊ฑด
						flag=1;
						break;
					}
				}
			}
			if(flag==1) {
				break;
			}
		}
		if(cnt[x2][y2]==0) {
			System.out.println(-1);
		}else {
			System.out.println(cnt[x2][y2]);
		}
	}
}

 

 

์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋งŒํผ ์ด๋™ํ•˜์—ฌ ๋ฒ”์œ„ ํ™•์ธ ํ›„ ์ฒด์ŠคํŒ ๋ฒ”์œ„ ์•ˆ์ด๋ผ๋ฉด ์ด๋™ํ•˜์—ฌ ์ด๋™ ํšŸ์ˆ˜ +1์„ ํ•ด์ฃผ๋ฉด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

  • n = ์ฒด์ŠคํŒ ํฌ๊ธฐ
  • x1, y1, x2 , y2 = ์‹œ์ž‘ ์œ„์น˜, ์ด๋™ํ•˜๋ ค๋Š” ์œ„์น˜
  • dx, dy = ํ•œ ๋ฒˆ์— ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ๋ฆฌ
  • visited = ๋ฐฉ๋ฌธ ์—ฌ๋ถ€  -> ์‹œ์ž‘ ์œ„์น˜ (x1, y1) = 1
  • cnt = ์ด๋™ ํšŸ์ˆ˜ ์ €์žฅ -> ์‹œ์ž‘ ์œ„์น˜ (x1, y1) = 0
  • flag = ์ข…๋ฃŒ ์กฐ๊ฑด
  • queue๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต -> ์ œ์ผ ์ฒ˜์Œ ๊ฐ’์„ pop -> ์ด๋™ํ•˜์—ฌ ์ฒด์ŠคํŒ ๋ฒ”์œ„ ์•ˆ์ด๋ฉฐ ์•„์ง ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๋ฐฉ๋ฌธ check ๋ฐ ์ด๋™ ํšŸ์ˆ˜ +1, queue  ์ถ”๊ฐ€/ ์ด๋™ํ•  ์œ„์น˜์™€ ์ด๋™ํ•ด์•ผ ํ•˜๋Š” ์œ„์น˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ข…๋ฃŒ
  • cnt [x2][y2] ์ถœ๋ ฅ

์ƒ๊ฐ๐Ÿค”

 

๋‹ค๋ฅธ ๋ฌธ์ œ ํ’€๋‹ค๊ฐ€.. ์–ด๋ ค์›Œ์„œ ๋„๋ง์ณ์™”๋‹ค.. ๐Ÿ˜ฅ

๋ฌธ์ œ ํ•ด๊ฒฐํ•ด์„œ ๋„ˆ๋ฌด ๋‹คํ–‰