-
코딩테스트 연습 - 게임 맵 최단거리
[[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,1],[0,0,0,0,1]] 11 [[1,0,1,1,1],[1,0,1,0,1],[1,0,1,1,1],[1,1,1,0,0],[0,0,0,0,1]] -1
programmers.co.kr
문제
해당 문제는 1,1 이세 시작해서 n, m으로 도착하는 이동 횟수를 구하는 문제다 이동이 불가능할 경우 -1을 출력한다.
조건
- maps는 n x m 크기의 게임 맵의 상태가 들어있는 2차원 배열로, n과 m은 각각 1 이상 100 이하의 자연수입니다.
- n과 m은 서로 같을 수도, 다를 수도 있지만, n과 m이 모두 1인 경우는 입력으로 주어지지 않습니다.
- maps는 0과 1로만 이루어져 있으며, 0은 벽이 있는 자리, 1은 벽이 없는 자리를 나타냅니다.
- 처음에 캐릭터는 게임 맵의 좌측 상단인 (1, 1) 위치에 있으며, 상대방 진영은 게임 맵의 우측 하단인 (n, m) 위치에 있습니다.
풀이
해당 문제는 bfs를 이용해서 해결했으며 기본적인 bfs개념을 적용시켜주고 큐에 넣는 데이터가 좌표값뿐만 아니라 이동 값도 넣어줬기 때문에 따로 클래스를 이용해서 큐에 데이터를 넣어주었다.
큐에는 좌표값만 넣고 방문 배열을 int형으로 이동 횟수를 갱신하는 방식으로도 문제가 해결 가능할 것으로 보인다.
코드
import java.util.LinkedList; import java.util.Queue; class Solution { public static int solution(int[][] maps) { int answer = 0; boolean[][] visit = new boolean[maps.length][maps[0].length]; answer = dfs(maps, visit); return answer; } private static int dfs(int[][] maps, boolean[][] visit) { int dy[] = {-1,1,0,0}, dx[] = {0,0,-1,1}; //4방 탐색 Queue<Node> q = new LinkedList<>(); q.offer(new Node(0,0,1)); visit[0][0] = true; while(!q.isEmpty()) { Node n = q.poll(); if(n.y == maps.length-1 && n.x == maps[0].length-1) { // 끝점에 도착하면 리턴 return n.cnt; } for (int i = 0; i < 4; i++) { int ny = n.y + dy[i]; int nx = n.x + dx[i]; if(ny < 0 || nx < 0 || ny >= maps.length || nx >= maps[0].length || visit[ny][nx] || maps[ny][nx] == 0) continue; q.offer(new Node(ny,nx,n.cnt+1)); visit[ny][nx] = true; } } return -1; //여기 까지오면 실패한경우 } static class Node{ int y, x, cnt; Node(int y, int x, int cnt){ this.y =y; this.x = x; this.cnt = cnt; } } }
GitHub - JUNGSOONIL/JAVA: JAVA 소스 코드
JAVA 소스 코드. Contribute to JUNGSOONIL/JAVA development by creating an account on GitHub.
github.com
728x90'알고리즘 > 프로그래머스' 카테고리의 다른 글
프로그래머스 가장 먼 노드 JAVA (0) 2022.05.01 프로그래머스 땅따먹기 JAVA (0) 2022.04.30 프로그래머스 JadenCase 문자열 만들기 JAVA (0) 2022.04.28 프로그래머스 소수 찾기 JAVA (0) 2022.04.27 프로그래머스 프린터 JAVA (0) 2022.04.26 댓글
- maps는 n x m 크기의 게임 맵의 상태가 들어있는 2차원 배열로, n과 m은 각각 1 이상 100 이하의 자연수입니다.