쵼쥬
쵼쥬의 개발공부 TIL
쵼쥬
전체 방문자
오늘
어제
  • 분류 전체보기 (276)
    • 코딩테스트 (192)
      • [알고리즘] 알고리즘 정리 (7)
      • [백준] 코딩테스트 연습 (126)
      • [프로그래머스] 코딩테스트 연습 (59)
    • Spring (71)
      • [인프런] 스프링 핵심 원리- 기본편 (9)
      • [인프런] 스프링 MVC 1 (6)
      • [인프런] 스프링 MVC 2 (4)
      • [인프런] 실전! 스프링 부트와 JPA 활용1 (7)
      • [인프런] 실전! 스프링 부트와 JPA 활용2 (5)
      • [인프런] 실전! 스프링 데이터 JPA (7)
      • [인프런] 실전! Querydsl (7)
      • JWT (5)
      • [인프런] Spring Cloud (17)
      • [인프런] Spring Batch (4)
    • Java (6)
      • [Java8] 모던인자바액션 (4)
      • [부스트코스] 웹 백엔드 (2)
      • [패스트캠퍼스] JAVA STREAM (0)
    • CS (6)
      • 디자인 패턴과 프로그래밍 패터다임 (2)
      • 네트워크 (4)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

  • 코딩테스트
  • spring
  • 타임리프
  • 백준
  • 백분
  • 부스트코스
  • 알고리즘
  • BFS
  • 인프런
  • 비트마스킹
  • 자바
  • 누적합
  • 스프링
  • jpa
  • Spring Data JPA
  • MVC
  • 구현
  • querydsl
  • 위클리 챌린지
  • 프로그래머스

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
쵼쥬

쵼쥬의 개발공부 TIL

벽 부수고 이동하고 - 2206번
코딩테스트/[백준] 코딩테스트 연습

벽 부수고 이동하고 - 2206번

2021. 10. 15. 16:31


풀이 방법

처음에는 그냥 bfs로 풀이했다가 고생했다. 이 문제는 벽을 부수고 이동할때와 그냥 이동했을 경우 따로 visited를 구분해줘야 한다.

부수고 이동했을때 이전 이동한 경로를 다시 가면 안되지만 부수지 않았으면 부수고 이동했을때 갔던 노드를 가도 된다.

방문체크를 구분해서 해주는 것만 생각해주면 되는 문제이다.

 

내 코드

package com.company;

import java.io.*;
import java.util.*;

class Node implements Comparable<Node> {
    int x, y, distance;
    boolean check;

    Node(int x, int y, int distance, boolean check) {
        this.x = x;
        this.y = y;
        this.distance = distance;
        this.check = check;
    }

    @Override
    public int compareTo(Node other) {
        if (this.distance > other.distance)
            return -1;
        return 1;
    }
}

public class Main {
    static int[][] array;
    static boolean[][][] visited;
    static int[][] way = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
    static int N, M;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());

        array = new int[N + 1][M + 1];
        visited = new boolean[2][N + 2][M + 2];

        for (int i = 0; i < visited[0].length; i++) {
            Arrays.fill(visited[0][i], true);
            Arrays.fill(visited[1][i], true);
        }

        for (int i = 1; i < N + 1; i++) {
            String str = br.readLine();
            for (int j = 1; j < M + 1; j++) {
                array[i][j] = str.charAt(j - 1) - '0';
                visited[0][i][j] = false;
                visited[1][i][j] = false;
            }
        }

        System.out.print(bfs());

    }

    static int bfs() {
        Queue<Node> q = new LinkedList<>();
        q.offer(new Node(1, 1, 1, false));

        while (!q.isEmpty()) {
            Node node = q.poll();
            if (node.x == N && node.y == M)
                return node.distance;

            for (int i = 0; i < way.length; i++) {
                if (!node.check) {
                    if (!visited[0][node.x + way[i][0]][node.y + way[i][1]]) {
                        visited[0][node.x + way[i][0]][node.y + way[i][1]] = true;
                        visited[1][node.x + way[i][0]][node.y + way[i][1]] = true;
                        if (array[node.x + way[i][0]][node.y + way[i][1]] == 0) {
                            q.offer(new Node(node.x + way[i][0], node.y + way[i][1], node.distance + 1, node.check));
                        } else if (array[node.x + way[i][0]][node.y + way[i][1]] == 1) {
                            q.offer(new Node(node.x + way[i][0], node.y + way[i][1], node.distance + 1, true));
                        }
                    }
                } else {
                    if (!visited[0][node.x + way[i][0]][node.y + way[i][1]] && !visited[1][node.x + way[i][0]][node.y + way[i][1]]) {
                        visited[1][node.x + way[i][0]][node.y + way[i][1]] = true;
                        if (array[node.x + way[i][0]][node.y + way[i][1]] == 0) {
                            q.offer(new Node(node.x + way[i][0], node.y + way[i][1], node.distance + 1, node.check));
                        }
                    }
                }

            }
        }
        return -1;
    }
}

'코딩테스트 > [백준] 코딩테스트 연습' 카테고리의 다른 글

운동 - 1956번  (0) 2021.10.21
이동하기 - 11048번  (0) 2021.10.19
무기 공학 - 18430번  (0) 2021.10.15
어두운 건 무서워 - 16507번  (0) 2021.10.15
에너지 모으기 - 16198번  (0) 2021.10.08
    '코딩테스트/[백준] 코딩테스트 연습' 카테고리의 다른 글
    • 운동 - 1956번
    • 이동하기 - 11048번
    • 무기 공학 - 18430번
    • 어두운 건 무서워 - 16507번
    쵼쥬
    쵼쥬

    티스토리툴바