Algorithm

[Algo] 백준 3010 페그 JAVA

조핑구 2024. 5. 8. 13:34

문제 바로가기 : https://www.acmicpc.net/problem/3010

메모리 : 14176KB

시간 : 120ms

언어 : Java 11


코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static int[][] two = { { 0, 2 }, { 0, -2 }, { 2, 0 }, { -2, 0 } };
    static int[][] one = { { 0, 1 }, { 0, -1 }, { 1, 0 }, { -1, 0 } };

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        char[][] map = new char[7][7];
        for (int i = 0; i < 7; i++) {
            String str = br.readLine();
            for (int j = 0; j < 7; j++) {
                map[i][j] = str.charAt(j);
            }
        }
        int ans = 0;
        for (int i = 0; i < 7; i++) {
            for (int j = 0; j < 7; j++) {
                if (map[i][j] == 'o') {
                    for (int k = 0; k < 4; k++) {
                        int x = i + two[k][0];
                        int y = j + two[k][1];
                        // 두 칸 다음이 비었다면
                        if (x >= 0 && y >= 0 && x < 7 && y < 7 && map[x][y] == '.') {
                            // 사이에 먹을 수 있는 칩이 있는지 검사
                            if (map[i + one[k][0]][j + one[k][1]] == 'o') {
                                ans++;
                            }
                        }
                    }
                }
            }
        }
        System.out.println(ans);
    }
}

풀이

칩-칩-빈칸 순서로 배치되어있어야 이동할 수 있다.

  1. 이중for문으로 모든 보드판을 탐색한다. 칩이 있으면 사방탐색으로 두 칸 뒤에 빈 칸이 있는지, 즉 점프할 수 있는지 확인한다.

    • 점프할 수 있는 경우 칩과 빈 칸 사이에 다른 칩이 있는지 확인한다.
  2. 조건을 만족하는 경우의 수를 센다.