Algorithm/baekjoon

Two Dots=========

마닐라 2022. 3. 2. 13:05

📍 문제 설명

https://www.acmicpc.net/problem/16929

 

16929번: Two Dots

첫째 줄에 게임판의 크기 N, M이 주어진다. 둘째 줄부터 N개의 줄에 게임판의 상태가 주어진다. 게임판은 모두 점으로 가득차 있고, 게임판의 상태는 점의 색을 의미한다. 점의 색은 알파벳 대문

www.acmicpc.net

 

💡 접근

모든 좌표에 대해서 상하좌우로 뻗어나간 후 사이클이 만들어지는지 확인하고 만들어지면 바로 끝내버리면 되는 문제

문제 조건에서 사이클은 점이 현재 3개 이상 연결되어 있고 다음 지점이 첫 지점이면 사이클이 된다.

 

👩‍💻 코드

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

public class Main {
    static int n, m, v, e, k, r, answer, cnt, max = Integer.MIN_VALUE, min = Integer.MAX_VALUE, firstX, firstY;
    static int[] arr, dx = {1,0,-1,0}, dy = {0,-1,0,1};
    static long[] dp;
    static char[][] board, clone;
    static boolean[][] visited;
    static ArrayList<String> list;
    static TreeSet<Character> set;
    static StringBuilder sb;
    static StringTokenizer st;

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

        st = new StringTokenizer(br.readLine());

        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        board = new char[n][m];
        for(int i = 0; i < n; i++) {
            String[] s = br.readLine().split("");
            for (int j = 0; j < s.length; j++) {
                board[i][j] = s[j].charAt(0);
            }
        }

        //모든 좌표에 대해서 사이클 가능한지 확인인
       for(int i = 0; i < n; i++) {
            for(int j = 0; j < m; j++) {
                firstX = i;
                firstY = j;
                visited = new boolean[n][m];
                visited[i][j] = true;
                T.solution(i, j, 1);
            }
        }
        System.out.println("No");
    }

    private void solution(int x, int y, int cnt) {
        //4방향에 대해서 재귀 호출
        for(int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];

            if(nx<0 || ny<0 || nx>=n || ny>=m || board[x][y] != board[nx][ny]) continue;

            if(!visited[nx][ny]) {
                visited[nx][ny] = true;
                solution(nx, ny, cnt+1);
            }
            //방문했던 곳이면 사이클인지 확인하고 맞으면 끝내기
            else {
                if(nx == firstX && ny == firstY && cnt >= 4) {
                    System.out.println("Yes");
                    System.exit(0);
                }
            }
        }
    }


}

'Algorithm > baekjoon' 카테고리의 다른 글

상어 초등학교  (0) 2022.03.02
스택 수열  (0) 2022.03.02
2048  (0) 2022.03.01
가르침  (0) 2022.03.01
부분수열의 합  (0) 2022.03.01