ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ) 뱀과 사다리 게임
    알고리즘/백준 2020. 6. 30. 14:48
    반응형

    뱀과 사다리 게임

     

    16928번: 뱀과 사다리 게임

    첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으

    www.acmicpc.net

    풀이

     

    이 문제는 BFS를 활용해 푸는 것이 효율적인 문제다.

    딱히 어려운 점은 없었지만, 어이없이 두 번 실수한 부분이 있었다.

    첫번째는 while을 통해서 입력받을 때다.

    for문을 두 번 쓰자니 번거로울 것 같아서 while로 한번에 받으려고 조건을 넣었었는데, 바보같이 or( || ) 조건이 아니라 and( && ) 조건을 걸었었다.

     

    그리고, 처음 시작하는 좌표가 문제에서 1부터라고 제시돼 있었는데, 0부터 시작했던 점이다.

    이 두 부분만 고쳐주니까 바로 통과해서 어이가 없었지만, 이런 실수는 하지 말자.. ㅠㅠ

     

    처음 문제를 봤을 때는 사실, ArrayList를 사용하려고 했다.

    입력받을 때, List에 담아서 뱀을 만나기 전에 사다리로 이동할 수 있는 경우를 가려고 했는데, 뱀을 타는게 더 이득인 경우가 있어서 바로 HashMap으로 변경했다. 이외에는 크게 신경쓴 부분은 없었다.

     

    로직을 보면,

    1. 입력받은 사다리와 뱀 정보를 각각 HashMap에 저장한다.
    2. 1부터 주사위 숫자만큼 더해, 움직이면서 step에 따른 방문 체크를 해준다.
    3. 이 때, 해당 위치가 뱀이나 사다리가 연결된 곳이라면, 같은 스텝에 방문 체크를 해주고, 해당 값으로 바꿔준다.
    4. 100에 도달한 경우 step을 출력해주고 탐색을 종료한다.

    이 4줄로 표시할 수 있을 것 같다.

     

     

    코드

     

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.*;
    
    public class SnakeLadder_16928 {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
            int ladders = Integer.parseInt(st.nextToken());
            int snakes = Integer.parseInt(st.nextToken());
            HashMap<Integer, Integer> snakeMap = new HashMap<>();
            HashMap<Integer, Integer> ladderMap = new HashMap();
    
            while(snakes >0 || ladders >0) {
                st = new StringTokenizer(br.readLine());
                if(ladders-- >0) {
                    ladderMap.put(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
                } else if(snakes-- >0){
                    snakeMap.put(Integer.parseInt(st.nextToken()), Integer.parseInt(st.nextToken()));
                }
            }
    
            solution(snakeMap,ladderMap);
    
            br.close();
        }
    
        private static void solution(HashMap<Integer, Integer> snakeMap, HashMap<Integer, Integer> ladderMap) {
            final int MAX = 100;
            final int DICE = 6;
            boolean[][] visit = new boolean[MAX+1][MAX+1];
    
            LinkedList<MoveInfo> moveList = new LinkedList();
    
            moveList.offer(new MoveInfo(1,0));
    
            while(!moveList.isEmpty()) {
                MoveInfo moveInfo = moveList.poll();
                int now = moveInfo.idx;
                int step = moveInfo.step;
    
                if(now == MAX) {
                    System.out.println(step);
                    break;
                }
                step++;
    
                for(int i=1; i<=DICE; i++) {
                    int next = now+i;
                    if(next <=MAX) { // out of idx 방지
                        if(!visit[next][step]) { // 방문 확인
                            visit[next][step] = true;
                            if(ladderMap.containsKey(next)) {  // 사다리가 있는 경우
                                next = ladderMap.get(next);
                                visit[next][step] = true;
                            } else if(snakeMap.containsKey(next)) { // 뱀이 있는 경우
                                next = snakeMap.get(next);
                                visit[next][step] = true;
                            }
                            moveList.offer(new MoveInfo(next, step));
                        }
                    }
                }
            }
        }
    }
    
    class MoveInfo {
        int idx;
        int step;
    
        public MoveInfo(int idx, int step) {
            this.idx = idx;
            this.step = step;
        }
    }
    반응형

    '알고리즘 > 백준' 카테고리의 다른 글

    BOJ) NM과 K (1)  (0) 2020.07.02
    BOJ) 계란으로 계란치기  (0) 2020.06.30
    BOJ) 두 동전  (0) 2020.06.29
    BOJ) 이모티콘  (0) 2020.06.29
    BOJ) 1,2,3 더하기  (0) 2020.06.29

    댓글

Designed by Tistory.