ahlight
개발 저장소
ahlight
전체 방문자
오늘
어제
  • 분류 전체보기 (197)
    • Java (7)
    • Spring (5)
    • JPA (2)
    • JavaScript (0)
    • Computer Science (12)
      • 디자인패턴, 프로그래밍 패러다임 (1)
      • 네트워크 (4)
      • 운영체제 (4)
      • 데이터베이스 (3)
      • 자료구조 (0)
    • 알고리즘 (1)
    • 프로그래머스 (13)
    • 백준 (94)
    • 서평 (3)
    • 회고 (1)
    • TIL (58)
    • 기타 (1)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • Java
  • 넥스트스텝
  • TDD
  • 라즈베리파이4 #홈서버 #포트포워딩 #dhcp
  • 클린코드

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ahlight
백준

백준 2178번 ☆

백준

백준 2178번 ☆

2022. 12. 1. 14:36

문제

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

import java.util.Scanner;

public class Main2178 {
	
	static int N,M;
	static int[][] maze;
	static boolean[][] visited;
	static int[] axisX = {1,-1,0,0};
	static int[] axisY = {0,0,1,-1};
	static int min = Integer.MAX_VALUE;
	
	public static void dfs(int count, int x, int y) {

		visited[x][y] = true;
		
		if (x == N-1 && y == M-1) {
			min = Math.min(min, count);
		}
		
		for (int i=0; i<4; i++) {
			int nx = x + axisX[i];
			int ny = y + axisY[i];

			if (nx>=0 && ny>=0 && nx<N && ny<M) {
				if (maze[nx][ny] == 1 && !visited[nx][ny]) {
					dfs(count+1, nx, ny);
				}
			}
		}
		
		visited[x][y] = false;
	}
 
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt();
		M = sc.nextInt();
		maze = new int[N][M];
		visited = new boolean[N][M];
		
		for (int i=0; i<N; i++) {
			String temp = sc.next();
			for (int j=0; j<M; j++) {
				maze[i][j] = temp.charAt(j)-'0';
			}
		}
		
		sc.close();
		
		dfs(1, 0, 0);
	
		System.out.println(min);
	}
}
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;

public class Main2178_1 {
	
	static int N,M;
	static int[][] maze;
	static boolean[][] visited;
	static int[] axisX = {1,-1,0,0};
	static int[] axisY = {0,0,1,-1};
	
	public static void bfs(int x, int y) {
		Queue<int[]> q = new LinkedList<int[]>();
		q.add(new int[] {x,y});
		
		while(!q.isEmpty()) {
			int[] now = q.poll();
			int noX = now[0];
			int noY = now[1];
			
			for (int i=0; i<4; i++) {
				int neX = noX + axisX[i];
				int neY = noY + axisY[i];
				
				if (neX<0 || neY<0 || neX>=N || neY>=M) {
					continue;
				} 
				if (visited[neX][neY] || maze[neX][neY] == 0) {
					continue;
				} 
				
				q.add(new int[] {neX, neY});
				maze[neX][neY] = maze[noX][noY] + 1;
				visited[neX][neY] = true;
				
			}
		}
		
	}
 
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		N = sc.nextInt();
		M = sc.nextInt();
		maze = new int[N][M];
		visited = new boolean[N][M];
		
		for (int i=0; i<N; i++) {
			String temp = sc.next();
			for (int j=0; j<M; j++) {
				maze[i][j] = temp.charAt(j)-'0';
			}
		}
		
		sc.close();
		
		visited[0][0] = true;
		bfs(0, 0);
	
		System.out.println(maze[N-1][M-1]);
	}
}

1. dfs 문제로 분류가 되어있어 dfs로 접근했으나.. 시간초과 + bfs문제라는 사실을 알게됐다.

 

2. 첫번째 코드는 dfs 두번재는 bfs 둘다 올바른 출력이긴하다. 다만 시간초과라는 조건에서 정답유무가 갈린다.

 

3. 이번문제를 통해 bfs로 푸는 방식을 알게됐다. 개념은 이전에도 cs공부를 하며 익힌바가 있지만 실제 적용하는 것은 이번이 처음이다. 원리 자체는 어렵지 않다. 다만 queue를 내가 자체적으로 구현하려면 아직은 무리인듯 싶다.

 

 

참고 및 출처 : https://wiselog.tistory.com/163

 

[백준 2178] 미로 탐색(Java)

https://www.acmicpc.net/problem/2178 2178번: 미로 탐색 첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다. www.a

wiselog.tistory.com

 

'백준' 카테고리의 다른 글

백준 16236 자바 ☆  (0) 2022.12.05
백준 14502번 ☆  (0) 2022.12.01
백준 2667번 ☆  (0) 2022.11.21
백준 17626번 ☆  (0) 2022.11.19
백준 2503번 ☆  (0) 2022.11.18
    '백준' 카테고리의 다른 글
    • 백준 16236 자바 ☆
    • 백준 14502번 ☆
    • 백준 2667번 ☆
    • 백준 17626번 ☆
    ahlight
    ahlight

    티스토리툴바

    단축키

    내 블로그

    내 블로그 - 관리자 홈 전환
    Q
    Q
    새 글 쓰기
    W
    W

    블로그 게시글

    글 수정 (권한 있는 경우)
    E
    E
    댓글 영역으로 이동
    C
    C

    모든 영역

    이 페이지의 URL 복사
    S
    S
    맨 위로 이동
    T
    T
    티스토리 홈 이동
    H
    H
    단축키 안내
    Shift + /
    ⇧ + /

    * 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.