Skip to content

[Java] 2206 ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐย #15

Description

@peppermintt0504

๋ฌธ์ œ ํ’€์ด
ํ•ด๋‹น ๋ฌธ์ œ๋Š” ๊ธฐ์กด์˜ DFS ๋ฌธ์ œ์™€ ์œ ์‚ฌํ•˜๋‹ค. ํ•˜์ง€๋งŒ ๋ฒฝ์„ ๋ถ€์ˆ  ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜ˆ์™ธ ์ผ€์ด์Šค๊ฐ€ ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— ์ฒ˜์Œ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ์•„๋ž˜์™€ ๊ฐ™์ด Positon class๋ฅผ ๋งŒ๋“ค์–ด ๋ฒฝ์„ ๋ถ€์ˆ  ๊ธฐํšŒ๊ฐ€ ๋‚จ์•„์žˆ๋‹ค๋ฉด ๋ฒฝ๋„ ์ง€๋‚  ์ˆ˜ ์žˆ๋„๋ก ์ง€์ •ํ•ด๋‘์—ˆ๋‹ค.

์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

import java.util.*;
import java.io.*;
public class Main {

	public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

	public static int[][] board;
	public static boolean[][] visited;
	
	public static Queue<Position> qu = new LinkedList<>();
	
	public static int[] dx = {0,1,0,-1};
	public static int[] dy = {-1,0,1,0};
	
	public static class Position {
		int x;
		int y;
		boolean chance = true;
		int distance;
		
		public Position() {
			// TODO Auto-generated constructor stub
		}

		public Position(int x, int y, boolean chance,int distance) {
			super();
			this.x = x;
			this.y = y;
			this.chance = chance;
			this.distance = distance;
		}
	}
	
	public static void main(String[] args) throws IOException{
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int R = Integer.parseInt(st.nextToken());
		int C = Integer.parseInt(st.nextToken());
		int answer = -1;
		
		board = new int[R][C];
		visited = new boolean[R][C];
		
		
		
		for(int i = 0; i < R; i++) 
			board[i] = Arrays.stream(br.readLine().split("")).mapToInt(Integer::parseInt).toArray();
		

		qu.add(new Position(0,0,true,1));
		
		while(!qu.isEmpty()) {
			Position cur = qu.poll();
			
			if(cur.x == C - 1 && cur.y == R - 1) {
				answer = cur.distance;
				break;
			}
			
			if(visited[cur.y][cur.x])continue;
			visited[cur.y][cur.x] = true;
			
			for(int i = 0; i < 4; i++) {
				int mx = cur.x + dx[i];
				int my = cur.y + dy[i];
				
				if(mx < 0 || mx >= C || my < 0 || my >= R)continue;
				
				if(cur.chance) {
					if(board[my][mx] == 0) {
						qu.add(new Position(mx,my,true,cur.distance+1));
					}else {
						qu.add(new Position(mx,my,false,cur.distance+1));
					}
				}else {
					if(board[my][mx] == 0) {
						qu.add(new Position(mx,my,false,cur.distance+1));
					}
				}
			}
		}
		if(R == 1 && C == 1) 
			System.out.println(0);
		else
		System.out.println(answer);
		
	}
	
}

ํ•˜์ง€๋งŒ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค 15%์ฏค ์˜ค๋‹ต์ด ๋‚˜์™”๋‹ค.

์˜ค๋‹ต์ด ๋‚˜์˜ค๋Š” ์ผ€์ด์Šค๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ์ผ€์ด์Šค์˜€๋‹ค.

7 5
00000
11110
00000
01111
00000
11111
00000

์œ„์™€ ๊ฐ™์€ ์ผ€์ด์Šค์—์„œ๋Š” (1,0)์„ ๋ฒฝ์œผ๋กœ ๋ถ€์ˆ˜๊ณ  ์•„๋ž˜๋กœ ์ง„์ถœ ํ•  ๋•Œ visited[1][0]์—์„œ ๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š๊ณ  ๋Œ์•„์„œ ์ง„์ถœํ–ˆ์„ ๋•Œ ์ง„ํ–‰์„ ํ•˜์ง€ ๋ชปํ•˜์—ฌ -1์„ ์ถœ๋ ฅํ•˜์˜€๋‹ค.

๋นจ๊ฐ„ ์ผ€์ด์Šค(๋ฒฝ์„ ๋ถ€์ˆœ ๊ฒฝ์šฐ)๋กœ ์ธํ•ด ํŒŒ๋ž€ ์ผ€์ด์Šค(๋ฒฝ์„ ๋ถ€์ˆ˜์ง€ ์•Š์€ ๊ฒฝ์šฐ)๊ฐ€ ๋ง‰ํ˜€ ๋‹ต์ด ๋‚˜์˜ค์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋ ‡๊ธฐ์— ๋ฒฝ์„ ๋ถ€์ˆœ ๊ฒฝ์šฐ๋Š” visited๋ฅผ ๋ณ„๋„๋กœ ๋งŒ๋“ค์–ด์„œ ๊ตฌํ˜„ํ•ด๋ณด์•˜๊ณ , ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํ•ด๊ฒฐ ์ฝ”๋“œ

import java.util.*;
import java.io.*;
public class Main {

	public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	public static BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

	public static int[][] board;
	public static boolean[][] visited;
	public static boolean[][] visited2;
	
	public static Queue<Position> qu = new LinkedList<>();
	
	public static int[] dx = {0,1,0,-1};
	public static int[] dy = {-1,0,1,0};
	
	public static class Position {
		int x;
		int y;
		boolean chance = true;
		int distance;
		
		public Position() {
			// TODO Auto-generated constructor stub
		}

		public Position(int x, int y, boolean chance,int distance) {
			super();
			this.x = x;
			this.y = y;
			this.chance = chance;
			this.distance = distance;
		}

		@Override
		public String toString() {
			return "Position [x=" + x + ", y=" + y + ", chance=" + chance + ", distance=" + distance + "]";
		}
	}
	
	public static void main(String[] args) throws IOException{
		
		StringTokenizer st = new StringTokenizer(br.readLine());
		
		int R = Integer.parseInt(st.nextToken());
		int C = Integer.parseInt(st.nextToken());
		int answer = -1;
		
		board = new int[R][C];
		visited = new boolean[R][C];
		visited2 = new boolean[R][C];
		
		
		for(int i = 0; i < R; i++) 
			board[i] = Arrays.stream(br.readLine().split("")).mapToInt(Integer::parseInt).toArray();
		

		qu.add(new Position(0,0,true,1));
		
		while(!qu.isEmpty()) {
			Position cur = qu.poll();
			if(cur.x == C - 1 && cur.y == R - 1) {
				answer = cur.distance;
				break;
			}
			
			if(cur.chance) {
				if(visited[cur.y][cur.x])continue;
				else {
					visited2[cur.y][cur.x] = true;
					visited[cur.y][cur.x] = true;
				}
				
			}else {
				if(visited2[cur.y][cur.x])continue;
				else 
					visited2[cur.y][cur.x] = true;
			}
			
			
			
			for(int i = 0; i < 4; i++) {
				int mx = cur.x + dx[i];
				int my = cur.y + dy[i];
				
				if(mx < 0 || mx >= C || my < 0 || my >= R)continue;
				
				if(cur.chance) {
					if(board[my][mx] == 0) {
						qu.add(new Position(mx,my,true,cur.distance+1));
					}else {
						qu.add(new Position(mx,my,false,cur.distance+1));
					}
				}else {
					if(board[my][mx] == 0) {
						qu.add(new Position(mx,my,false,cur.distance+1));
					}
				}
			}
		}
		System.out.println(answer);
		
	}
	
}

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions