[소프티어] 나무 섭지 풀이에 관하여.java

2024. 3. 20. 22:27·알고리즘/문제풀이
목차
  1. ✍문제 해결 핵심 전략탈출 여부의 요인 정확히 분석하기
  2. 👨‍💻Code 구현

https://softeer.ai/practice/7726

 

Softeer - 현대자동차그룹 SW인재확보플랫폼

 

softeer.ai

 

 

✍문제 해결 핵심 전략탈출 여부의 요인 정확히 분석하기

  1. 남우가 탈출하기 위해서는 유령에게 잡히지 않고 탈출구를 찾아가야 합니다.
  2. 남우와 유령 사이의 관계 명확히 파악하기 (벽 넘기의 유무)

 

 

 

🔍'유령에게 잡히지 않는다'

 

▶ 유령보다 탈출구에 더 빨리 도착해야한다.

 

🔍'탈출구를 찾아간다.'

 

▶ 탐색을 통해 탈출구에 도달할 수 있는가?.

 

🔍'벽을 넘을 수 있다.'를 위의 내용과 연관시키면

 

▶ 벽의 유무를 고려한 뒤 남우가 최단거리로 출구에 가야 한다.

 

 

 

 

한 줄 요약

 

유령과 탈출구 사이 거리, 남우와 탈출구 사이 거리 (남우는 벽을 고려)

비교를 통해 탈출의 유무를 확인할 수 있다.

 

 

 

 

 

👨‍💻Code 구현

import java.util.*;

public class Softeer_나무섭지 {
    static int Dr, Dc, Nr, Nc, Wr, Wc, ghost_num, n, m, Min_distanceDoortoGhost,Min_distanceDoortoNam, distanceDoortoNam;
    static int[] dr = {0, -1, 0, 1};
    static int[] dc = {-1, 0, 1, 0};

    static int[][] visited ;
    static char[][] maze;
    static List<int[]> ghostPos = new ArrayList<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        n = sc.nextInt(); //행
        m = sc.nextInt(); //열

        maze = new char[n][m];
        visited = new int[n][m];
        ghost_num = 0;
        Dr = 0;Dc = 0;
        Nr = 0;Nc = 0;
        Wr = 0;Wc = 0;
        Min_distanceDoortoGhost = Integer.MAX_VALUE;
        Min_distanceDoortoNam = Integer.MAX_VALUE ;
        for (int i = 0; i < n; i++) {
            String str = sc.next();
            for (int j = 0; j < m; j++) {
                maze[i][j] = str.charAt(j);
                if (maze[i][j] == 'G') {
                    int[] arr = new int[2];
                    arr[0] = i;
                    arr[1] = j;
                    ghostPos.add(arr);
                    ghost_num++;
                } else if (maze[i][j] == 'D') {
                    Dr = i;
                    Dc = j;
                } else if (maze[i][j] == 'N') {
                    Nr = i;
                    Nc = j;
                } else if (maze[i][j] == '#') {
                    Wr = i;
                    Wc = j;
                }
            }
        }// idx 미리 찾기

        //유령과 문사이 최소거리 구하기
        for (int ghost = 0; ghost < ghost_num; ghost++) {
            int[] arr = ghostPos.get(ghost);
            int sum = Math.abs(Dr - arr[0]) + Math.abs(Dc - arr[1]);

            if (sum < Min_distanceDoortoGhost)
                Min_distanceDoortoGhost = sum;
        }

        if (cal_distanceDoortoNam(Nr, Nc) > 0 && cal_distanceDoortoNam(Nr, Nc) < Min_distanceDoortoGhost)
            System.out.println("Yes");
        else System.out.println("No");
    }
    public static int cal_distanceDoortoNam( int Nr, int Nc) { //BFS로 칸마다 걸리는 이동 거리 확인하기

        Queue<int[]> q = new LinkedList<>();
        q.add(new int[]{Nr,Nc});
        visited[Nr][Nc] = 0;

        while (!q.isEmpty()){
            int[] currentNam = q.poll();
            int curR = currentNam[0];
            int curC = currentNam[1];
            for(int i =0; i<4 ; i++){
                int nR = curR + dr[i];
                int nC = curC + dc[i];

                if(nR >= n || nR < 0 || nC >= m || nC < 0 || maze[nR][nC] == '#') continue; //경계조건 or 벽 발견

                if(visited[nR][nC] == 0 ){
                    visited[nR][nC] = visited[curR][curC] + 1 ; //이동한 거리를 칸마다 갱신한다.
                    q.add(new int[]{nR,nC}); 
                }
            }
        }
        return visited[Dr][Dc];
    }
}

 

 

 

 

 

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

[백준_15683] 감시.java  (0) 2024.04.03
[백준_14891] 톱니바퀴.java  (0) 2024.04.02
[백준_17136] 색종이 붙이기.java  (0) 2024.03.30
[백준_2606] 바이러스.java  (0) 2024.03.18
[9663_백준] N-Queen 문제풀이 (java)  (0) 2024.03.01
  1. ✍문제 해결 핵심 전략탈출 여부의 요인 정확히 분석하기
  2. 👨‍💻Code 구현
'알고리즘/문제풀이' 카테고리의 다른 글
  • [백준_14891] 톱니바퀴.java
  • [백준_17136] 색종이 붙이기.java
  • [백준_2606] 바이러스.java
  • [9663_백준] N-Queen 문제풀이 (java)
지화자_
지화자_
나만의 글로 기록하기
지화자_
냉정과열정사이
지화자_
전체
오늘
어제
  • 분류 전체보기 (47)
    • 알고리즘 (18)
      • 개념정복 (6)
      • 문제풀이 (12)
    • ComputerScience (5)
      • 데이터베이스 (3)
      • 네트워크 (0)
      • OS (2)
    • SSAFY (2)
    • Java (6)
    • Server (10)
    • Spring (3)
    • 일상 (1)
    • OpenSource (2)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 병합정렬
  • 백트래킹
  • 알고리즘
  • AOP
  • 추상클래스
  • OOP
  • 빌드
  • 분할정복
  • 나무섭지
  • 소프티어
  • 배포
  • 조합
  • 비트마스크
  • 재귀함수
  • 구현
  • 아니안무서워
  • 부분집합
  • CI
  • 백준
  • cd
  • 백준바이러스
  • 인터페이스
  • n-queen
  • BFS
  • dfs

최근 댓글

최근 글

hELLO· Designed By정상우.v4.5.2
지화자_
[소프티어] 나무 섭지 풀이에 관하여.java
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.