[ 백준 12887번 ] 경로 게임

2023. 3. 12. 14:49·Algorithm/문제풀이

1. 문제

 

 

12887번: 경로 게임

첫째 줄에 바꿀 수 있는 하얀색 칸의 개수의 최댓값을 출력한다.

www.acmicpc.net

 

2. 풀이

문제가 다속 복잡해보이기 위해 노력했으나 사실 핵심을 간파하기는 쉬운 유형이다.

 

격자판의 하얀색 칸을 검정색 칸으로 바꾼 경우에도 왼쪽-오른쪽 경로가 존재할 수도 있다. 이때, 왼쪽-오른쪽 경로가 존재하면서 바꿀 수 있는 하얀색 칸의 최댓값을 구하는 프로그램을 작성하시오.

왼쪽-오른쪽 경로가 항상 존재하는 게임판만 입력으로 주어진다.

 

이를 다시 정리하자면, 좌측 끝에서 우측 끝으로 가는 경로에서 방문하지 않은 칸의 개수를 최대로 만들라는 말이며, 이는 곧 최소경로를 찾으라는 말과 동일하다. 그렇다면 우리는 아래의 과정을 통해서 본 문제를 풀 수 있게 된다.

 

  • 입력과 동시에, '하얀색' 칸의 개수를 세어둔다.
    • 향후 방문한 최소 경로의 길이를 빼주기 위함
  • map[0][0], map[1][0] 중 흰색 칸을 모두 시작점으로 잡아 BFS를 돌린다.
  • 최소 경로를 찾은 경우, 첫 번째 과정을 수행하기 위해 1을 더해 반환한다.
    • 방문하지 않은 칸을 모두 검정으로 바꿔야 하는데 시작 노드 역시 방문한 노드이므로 1을 더해줌
    • (경로 탐색 시, 경로의 값을 1로 두고 풀이하면 불필요한 과정)

 

세부 구현은 아래 코드를 참고하자.

 

3. 소스코드

더보기
public class Main {
    static final int[] dy = {-1, 0, 1, 0};
    static final int[] dx = {0, 1, 0, -1};
    static final char WHITE = '.', BLACK = '#';
    static char[][] map;
    static int M;

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

        map = new char[2][M];
        int white = 0;
        for (int i = 0; i < 2; i++) {
            String line = br.readLine();
            for (int j = 0; j < M; j++) {
                map[i][j] = line.charAt(j);
                if (map[i][j] == WHITE) {
                    white++;
                }
            }
        }

        int shortestLength = bfs();

        System.out.println(white - shortestLength + "");
        br.close();
    }

    static int bfs() {
        int len = 0;

        Queue<Integer> q = new LinkedList<>();
        boolean[][] visit = new boolean[2][M];
        for (int i = 0; i < 2; i++) {
            if (map[i][0] == WHITE) {
                q.add(i * M);
                visit[i][0] = true;
            }
        }

        while (!q.isEmpty()) {
            int size = q.size();

            while (size-- > 0) {
                int now = q.poll();
                int y = now / M;
                int x = now % M;

                if (x == M - 1) {
                    return len + 1;
                }

                for (int dir = 0; dir < 4; dir++) {
                    int ny = y + dy[dir];
                    int nx = x + dx[dir];

                    if (ny < 0 || nx < 0 || 2 <= ny || M <= nx || visit[ny][nx] || map[ny][nx] == BLACK) continue;

                    visit[ny][nx] = true;
                    q.add(ny * M + nx);
                }
            }

            len++;
        }

        return len;
    }

}

 

 

GitHub - kwanik-kor/BOJ: Baekjoon Online Judge - explanation of solved problems and complete code

Baekjoon Online Judge - explanation of solved problems and complete code - GitHub - kwanik-kor/BOJ: Baekjoon Online Judge - explanation of solved problems and complete code

github.com

 

반응형
저작자표시 비영리 변경금지 (새창열림)

'Algorithm > 문제풀이' 카테고리의 다른 글

[ 백준 4796번 ] 캠핑  (1) 2023.03.13
[ 백준 25513번 ] 빠른 오름차순 숫자 탐색  (0) 2023.03.12
[ 백준 1715번 ] 카드 정렬하기  (1) 2023.03.10
[ 백준 17144번 ] 미세먼지 안녕!  (0) 2023.03.10
[ 백준 15666번 ] N과 M(12)  (1) 2023.03.08
'Algorithm/문제풀이' 카테고리의 다른 글
  • [ 백준 4796번 ] 캠핑
  • [ 백준 25513번 ] 빠른 오름차순 숫자 탐색
  • [ 백준 1715번 ] 카드 정렬하기
  • [ 백준 17144번 ] 미세먼지 안녕!
갈닉
갈닉
중요한 건 엔지니어가 되겠다는 마음. 근데 이제 인문학을 곁들인.
    반응형
  • 갈닉
    KwanIk Devlog
    갈닉
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • Algorithm (41)
        • 알고리즘 개요 (8)
        • 문제풀이 (33)
      • Language (2)
        • Java (1)
        • Javascript (0)
        • Go (0)
        • Rust (1)
      • Framework (0)
        • Spring (0)
        • Spring Security (0)
        • Spring JPA (0)
      • Computer Science (1)
        • 프로그래밍 언어 (0)
        • 자료구조 (1)
        • 보안 (0)
      • DevOps (1)
        • MSA (0)
        • TDD (1)
        • DDD (0)
      • 개발서적 (3)
        • 오브젝트 (3)
      • Life (5)
        • 생각생각 (4)
        • 회고록 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

    • My Github
  • 공지사항

  • 인기 글

  • 태그

    BruteForce
    깊이우선탐색
    백준
    비트마스크
    boj
    백트래킹
    욕심쟁이알고리즘
    구현
    객체지향
    Algorithm
    BFS
    DP
    bitmask
    오브젝트
    backtracking
    알고리즘
    시뮬레이션
    greedy
    java
    너비우선탐색
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
갈닉
[ 백준 12887번 ] 경로 게임
상단으로

티스토리툴바