이 영역을 누르면 첫 페이지로 이동
쿄코코 블로그의 첫 페이지로 이동

쿄코코

페이지 맨 위로 올라가기

쿄코코

얼레벌레 생활🤯

백준 16948(데스나이트) - Python(파이썬),자바(Java)

  • 2022.05.24 21:43
  • [백준] Python,Java로 풀기📖/DFS&BFS
    반응형
     

    16948번: 데스 나이트

    게임을 좋아하는 큐브러버는 체스에서 사용할 새로운 말 "데스 나이트"를 만들었다. 데스 나이트가 있는 곳이 (r, c)라면, (r-2, c-1), (r-2, c+1), (r, c-2), (r, c+2), (r+2, c-1), (r+2, c+1)로 이동할 수 있다. 크

    www.acmicpc.net

     

    BFS - duque 메서드 - Python(파이썬),Java(자바)

    DFS 설명 스택, 큐, 재귀함수, DFS 탐색(Search) :  많은 양의 데이터 중에서 원하는 데이터를 찾는 과정 대표적인 탐색 알고리즘으로 DFS, BFS , 이 두 알고리즘을 이해하기 위해서 스택, 큐, 재귀 함

    coooco.tistory.com

    풀이 방법

    ① 이차원 배열로 nxn graph 생성 ( -> 이동 거리를 표현하는 그래프) 

    ② bfs 방식으로 큐 안에 값이 없어질 때까지 처음 시작점 (r1,c1)에서 갈수 있는 점의 모든 리스트의 값을 변경 , 이 때 변경 시에는 방금 시작점의 graph의 값(graph[r1][c1]) +1 

    # BFS
    import sys
    from collections import deque
    
    # 체스판의 크기 입력 받기
    n = int(sys.stdin.readline())
    # 체스판에 모든 값을 0으로 설정해서 만들기
    graph = [[0 for _ in range(n)] for _ in range(n)]
    # r1,c1,r2,c2 입력 받기
    r1, c1, r2, c2 = map(int, sys.stdin.readline().split())
    
    # 데스나이트가 이동할 수 있는 방법
    dr = [-2, -2, 0, 0, 2, 2]
    dc = [-1, 1, -2, 2, -1, 1]
    
    
    def bfs(r1, c1):
        # 큐 구현
        queue = deque()
        # 큐에 r1,c2 집어 넣기
        queue.append((r1, c1))
        while queue:  # 큐가 빌때까지
            r1, c1 = queue.popleft()  # 큐에서 꺼냄
            for i in range(6):
                nr = r1 + dr[i]
                nc = c1 + dc[i]
                # 넣은 값이 체스판을 넘어 가는 경우 무시
                if nr < 0 or nc < 0 or nr >= n or nc >= n:
                    continue
                # 체스판에 처음 접근 한 경우에만 방금 있었던 이동 거리 +1 && 큐에 삽입
                if graph[nr][nc] == 0:
                    graph[nr][nc] = graph[r1][c1] + 1
                    queue.append((nr, nc))
    
    
    # 함수 실행
    bfs(r1, c1)
    # 시작점으로부터 갈 수 없는 경우에는 0이 설정되어 있으므로 0인 경우 -1 출력
    if graph[r2][c2] == 0:
        print(-1)
    else:
        print(graph[r2][c2])

    약간의 수정 

    ※ dr,dc를 다르게 받았다면 ->  d =[(-2,-1),,,,,,]  for dr,dc in d:이렇게 for문 사용

    ※ 위에서는 그래프의 초기값을 0으로 설정했다면 밑에서는 -1로 처음부터 설정한 후에 bfs를 실행 시 graph의 값을 0으로 변경한다.

    #BFS
    import sys
    from collections import deque
    
    #체스판의 크기 입력 받기
    n = int(sys.stdin.readline())
    #체스판에 모든 값을 -1으로 설정해서 만들기
    graph = [[-1 for _ in range(n)] for _ in range(n)]
    #r1,c1,r2,c2 입력 받기
    r1,c1,r2,c2=map(int,sys.stdin.readline().split())
    
    #데스나이트가 이동할 수 있는 방법
    d = [(-2, -1), (-2, 1), (0, -2), (0, 2), (2, -1), (2, 1)]
    
    def bfs(r1,c1):
        #큐 구현
        queue = deque()
        #큐에 r1,c2 집어 넣기
        queue.append((r1,c1))
        #0으로 설정
        graph[r1][c1]=0
        while queue:#큐가 빌때까지
            r1,c1 = queue.popleft()#큐에서 꺼냄
            for dr,dc in d:
                nr = r1+dr
                nc = c1+dc
                #넣은 값이 체스판을 넘어 가는 경우 무시
                if nr<0 or nc<0 or nr>=n or nc>=n:
                    continue
                #체스판에 처음 접근 한 경우에만 방금 있었던 이동 거리 +1 && 큐에 삽입
                if graph[nr][nc]==-1:
                    graph[nr][nc]=graph[r1][c1]+1
                    queue.append((nr,nc))
    
    #함수 실행
    bfs(r1,c1)
    print(graph[r2][c2])

    자바로 푼 경우 

    import java.util.*;
    import java.io.*;
    
    public class Main {
        static int r1,r2,c1,c2;
        //이차원 배열 설정
        static int n;
        static int[][] graph;
        static int[][] d = {{-2,-1},{-2,1},{0,-2},{0,2},{2,-1},{2,1}};
        static void bfs(int x,int y){
            Queue<int[]> q = new LinkedList<>();
            q.offer(new int[] {x,y});
            while(!q.isEmpty()){
                int[] tmp=q.poll();
                graph[x][y]=0;
                for(int drc[]:d){
                    int nr = tmp[0]+drc[0];
                    int nc = tmp[1]+drc[1];
                    if(nr>=0 && nr<n && nc>=0 && nc<n && graph[nr][nc]==-1){
                        graph[nr][nc]=graph[tmp[0]][tmp[1]]+1;
                        q.offer(new int[] {nr,nc});
                    }
                }
            }
        }
        public static void main(String[] args) throws IOException{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            n = Integer.parseInt(br.readLine());
            StringTokenizer st = new StringTokenizer(br.readLine()," ");
            r1 = Integer.parseInt(st.nextToken());
            c1=Integer.parseInt(st.nextToken());
            r2 = Integer.parseInt(st.nextToken());
            c2 = Integer.parseInt(st.nextToken());
            graph=new int[n][n];
            //-1로 모두 초기화
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    graph[i][j]=-1;
                }
            }
            bfs(r1,c1);
            System.out.println(graph[r2][c2]);
        }
    }
    반응형

    '[백준] Python,Java로 풀기📖 > DFS&BFS' 카테고리의 다른 글

    백준 24479(깊이 우선 탐색 1) - Python(파이썬),Java(자바) - DFS  (2) 2022.06.01
    백준 18352(특정 거리의 도시 찾기) - Python(파이썬) -BFS  (0) 2022.05.25
    백준 4936(섬의 개수) - BFS 풀기  (0) 2022.05.21
    백준 14716(현수막) - 파이썬(Python),자바(Java) - DFS(재귀함수),sys.setrecursionlimit(10**6),BFS  (0) 2022.05.20
    백준 1260(DFS와 BFS) - DFS & BFS  (0) 2022.05.18

    댓글

    이 글 공유하기

    • 구독하기

      구독하기

    • 카카오톡

      카카오톡

    • 라인

      라인

    • 트위터

      트위터

    • Facebook

      Facebook

    • 카카오스토리

      카카오스토리

    • 밴드

      밴드

    • 네이버 블로그

      네이버 블로그

    • Pocket

      Pocket

    • Evernote

      Evernote

    다른 글

    • 백준 24479(깊이 우선 탐색 1) - Python(파이썬),Java(자바) - DFS

      백준 24479(깊이 우선 탐색 1) - Python(파이썬),Java(자바) - DFS

      2022.06.01
    • 백준 18352(특정 거리의 도시 찾기) - Python(파이썬) -BFS

      백준 18352(특정 거리의 도시 찾기) - Python(파이썬) -BFS

      2022.05.25
    • 백준 4936(섬의 개수) - BFS 풀기

      백준 4936(섬의 개수) - BFS 풀기

      2022.05.21
    • 백준 14716(현수막) - 파이썬(Python),자바(Java) - DFS(재귀함수),sys.setrecursionlimit(10**6),BFS

      백준 14716(현수막) - 파이썬(Python),자바(Java) - DFS(재귀함수),sys.setrecursionlimit(10**6),BFS

      2022.05.20
    다른 글 더 둘러보기

    정보

    쿄코코 블로그의 첫 페이지로 이동

    쿄코코

    • 쿄코코의 첫 페이지로 이동

    검색

    메뉴

    • 홈

    카테고리

    • 분류 전체보기 (168)
      • Python (24)
        • 😈 99클럽 코테 스터디 4기 TIL (23)
        • 궁금한거 정리 (1)
      • SQL (16)
        • HackerRank (15)
      • [백준] Python,Java로 풀기📖 (71)
        • 정렬(Sorting) (6)
        • 그리디 (5)
        • 문자열 (7)
        • 수학 (3)
        • DFS&BFS (10)
        • 구현 (4)
        • 다이나믹 (17)
        • 이분탐색 (1)
        • 자료구조 (10)
        • 최단거리 (5)
        • 인덱스트리 (0)
      • [프로그래머스]Python,Java로 풀기 (6)
        • Level 1 (4)
        • Level 2 (2)
      • Study Platform📚 (25)
        • (운영체제) - 블로그 및 강의 참고 (0)
        • 김영한👨🏻‍🏫의 스프링 부트와 JPA 실무 완전 .. (5)
        • (알고리즘)- [이코테] 이것이 코딩테스트다 정리 (10)
        • 그림으로 배우는 Http&Network Basic (10)
      • 까먹을까봐 적는 것들 (4)
      • 테스트 보고 난 후..🤔 (0)
      • kt 에이블스쿨 (18)

    최근 글

    인기 글

    댓글

    공지사항

    아카이브

    태그

    • TiL
    • 오블완
    • 항해99
    • 코딩테스트준비
    • 99클럽
    • 티스토리챌린지
    • 프로그래머스
    • 백준

    나의 외부 링크

    정보

    쿄코코의 쿄코코

    쿄코코

    쿄코코

    블로그 구독하기

    • 구독하기
    • RSS 피드

    방문자

    • 전체 방문자
    • 오늘
    • 어제

    티스토리

    • 티스토리 홈
    • 이 블로그 관리하기
    • 글쓰기
    Powered by Tistory / Kakao. © 쿄코코. Designed by Fraccino.

    티스토리툴바