peacekim
할 수 있는 것과 할 수 없는 것.
peacekim
전체 방문자
오늘
어제
  • 분류 전체보기 (68)
    • 👨‍🏫ps (44)
      • ❄️프로그래머스 (20)
      • 🔟0️⃣백준 (21)
      • leetcode (3)
    • ✍🏻study (20)
      • 👐java (6)
      • 🍃spring (1)
      • 🥇algorithm (0)
      • 🚘oodp (4)
      • 📒 jpa (3)
      • 👣DB (2)
      • 🌂네트워크 (0)
      • 🎸기타 (3)
      • 👊 kotlin (1)
      • 🫥 jvm (0)
    • 📽project (4)
      • 🎀ReBoN (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
peacekim

할 수 있는 것과 할 수 없는 것.

[백준] 16929번 Two Dots 풀어보기 [Java]
👨‍🏫ps/🔟0️⃣백준

[백준] 16929번 Two Dots 풀어보기 [Java]

2022. 3. 6. 00:58
반응형

그래프의 사이클 여부를 찾는 문제였다.

bfs문제였다. 약간 구현에 있어서 복잡한 부분이 있었던 거 같아서, 한번에 못 맞출줄 알았는데, 한번에 "맞았습니다" 나와서 기분이 좋았습니닿ㅎㅎㅎ

 

 

👨‍🏫 풀이

bfs로 풀었고, 이전에 방문 했던 적이 있는 곳을 다시 방문한다면 cycle이 생기기 때문에, 이전에 방문했던 이력이 있다면 cycle이 true로 출력하였다. 

상하좌우로 다 움직이기 때문에, 바로 이전의 방문했던 곳을 방문할 경우에 cycle이 생긴다고 말할 수 있는데, 이때는 cycle이 생기는 것이 아니기 때문에 처리해줘야 됐다. 그래서 이전에 어디서 넘어왔는지에 대한 정보도 queue에 함께 넘겨줘서 이전에 넘어왔던 곳은 체크 안하도록 하였다.

 

👨🏻‍💻 코드

package 번16929;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

public class Main {
    static int N;
    static int M;
    static boolean[] doHaveAlpha;
    static boolean[][] isVisited;
    static int[][] map;
    static int[] mX = {0,-1,0,1};
    static int[] mY = {1,0,-1,0};
    static class Node{
        int dir;
        int n;
        int m;

        public Node(int dir, int n, int m) {
            this.dir = dir;
            this.n = n;
            this.m = 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());
        doHaveAlpha = new boolean[27];
        map = new int[N][M];
        Arrays.fill(doHaveAlpha, false);
        for(int i = 0 ; i < N ; i++){
            String tmp = br.readLine();
            for(int j = 0 ; j < M ; j++){
                doHaveAlpha[tmp.charAt(j) - 'A'] = true;
                map[i][j] = tmp.charAt(j) - 'A';
            }
        }
        boolean isCycle = false;
        isVisited = new boolean[N][M];
        for(int i = 0 ; i < 26 ; i++){
            if(!doHaveAlpha[i]) continue;
            for (int z = 0 ; z < N ; z++){
                Arrays.fill(isVisited[z], false);
            }
            for(int j = 0 ; j < N ; j++){
                for(int k = 0 ; k < M ; k++){
                    if(map[j][k] == i && !isVisited[j][k]){
                        isCycle = bfs(i,j,k);
                        if(isCycle){
                            System.out.println("Yes");
                            return;
                        }
                    }
                }
            }
        }
        System.out.println("No");
    }

    private static boolean bfs(int alpha, int n, int m) {
        Queue<Node> q = new LinkedList<>();
        q.add(new Node(-100,n,m));
        isVisited[n][m] = true;
        while(!q.isEmpty()){
            Node cur = q.poll();
            int prevDir = (cur.dir + 2) % 4;
            for(int i = 0 ; i < 4 ; i++){
                if(i == prevDir) continue;
                int nN = cur.n + mX[i] ; int nM = cur.m + mY[i];
                if(nN < 0 || nN >= N || nM < 0 || nM >= M) continue;
                if(alpha != map[nN][nM]) continue;
                if(isVisited[nN][nM]) return true;
                isVisited[nN][nM] = true;
                q.add(new Node(i,nN,nM));
            }
        }
        return false;
    }
}
반응형

'👨‍🏫ps > 🔟0️⃣백준' 카테고리의 다른 글

[백준] 16964번 DFS 스페셜 저지 풀어보기 [Java]  (0) 2022.03.08
[백준] 1261번 알고스팟 풀어보기 [Java]  (0) 2022.03.07
[백준] 11724번 연결 요소의 개수 풀어보기 [백준]  (0) 2022.03.04
[백준] 15661번 링크와 스타트 풀어보기 [Java]  (0) 2022.03.04
[백준] 1759번 암호 만들기 풀어보기 [Java]  (0) 2022.03.04
    '👨‍🏫ps/🔟0️⃣백준' 카테고리의 다른 글
    • [백준] 16964번 DFS 스페셜 저지 풀어보기 [Java]
    • [백준] 1261번 알고스팟 풀어보기 [Java]
    • [백준] 11724번 연결 요소의 개수 풀어보기 [백준]
    • [백준] 15661번 링크와 스타트 풀어보기 [Java]
    peacekim
    peacekim
    할 수 있는 것과 할 수 없는 것. github: https://github.com/PyeongGangKim

    티스토리툴바