πŸ₯‡ [Baekjoon / Java] 18428. κ°μ‹œ ν”Όν•˜κΈ°

μ΄ν•˜μ–€Β·2024λ…„ 6μ›” 19일
0

🐣 λ°±μ€€

λͺ©λ‘ 보기
27/37

문제 μ„€λͺ…


πŸ’‘ Info

λ‚΄μš©

NxN 크기의 볡도가 μžˆλ‹€. λ³΅λ„λŠ” 1x1 크기의 칸으둜 λ‚˜λˆ„μ–΄μ§€λ©°, νŠΉμ •ν•œ μœ„μΉ˜μ—λŠ” μ„ μƒλ‹˜, 학생, ν˜Ήμ€ μž₯애물이 μœ„μΉ˜ν•  수 μžˆλ‹€. ν˜„μž¬ λͺ‡ λͺ…μ˜ 학생듀은 μˆ˜μ—…μ‹œκ°„μ— λͺ°λž˜ λ³΅λ„λ‘œ λΉ μ Έλ‚˜μ™”λŠ”λ°, λ³΅λ„λ‘œ λΉ μ Έλ‚˜μ˜¨ 학생듀은 μ„ μƒλ‹˜μ˜ κ°μ‹œμ— 듀킀지 μ•ŠλŠ” 것이 λͺ©ν‘œμ΄λ‹€.

각 μ„ μƒλ‹˜λ“€μ€ μžμ‹ μ˜ μœ„μΉ˜μ—μ„œ 상, ν•˜, 쒌, 우 4가지 λ°©ν–₯으둜 κ°μ‹œλ₯Ό μ§„ν–‰ν•œλ‹€. 단, 볡도에 μž₯애물이 μœ„μΉ˜ν•œ 경우, μ„ μƒλ‹˜μ€ μž₯μ• λ¬Ό λ’€νŽΈμ— μˆ¨μ–΄ μžˆλŠ” 학생듀은 λ³Ό 수 μ—†λ‹€. λ˜ν•œ μ„ μƒλ‹˜μ€ 상, ν•˜, 쒌, 우 4가지 λ°©ν–₯에 λŒ€ν•˜μ—¬, 아무리 멀리 μžˆλ”λΌλ„ μž₯μ• λ¬Όλ‘œ λ§‰νžˆκΈ° μ „κΉŒμ§€μ˜ 학생듀은 λͺ¨λ‘ λ³Ό 수 μžˆλ‹€κ³  κ°€μ •ν•˜μž.

λ‹€μŒκ³Ό 같이 3x3 크기의 λ³΅λ„μ˜ 정보가 주어진 상황을 ν™•μΈν•΄λ³΄μž. λ³Έ λ¬Έμ œμ—μ„œ μœ„μΉ˜ 값을 λ‚˜νƒ€λ‚Ό λ•ŒλŠ” (ν–‰,μ—΄)의 ν˜•νƒœλ‘œ ν‘œν˜„ν•œλ‹€. μ„ μƒλ‹˜μ΄ μ‘΄μž¬ν•˜λŠ” 칸은 T, 학생이 μ‘΄μž¬ν•˜λŠ” 칸은 S, μž₯애물이 μ‘΄μž¬ν•˜λŠ” 칸은 O둜 ν‘œμ‹œν•˜μ˜€λ‹€. μ•„λž˜ κ·Έλ¦Όκ³Ό 같이 (3,1)의 μœ„μΉ˜μ—λŠ” μ„ μƒλ‹˜μ΄ μ‘΄μž¬ν•˜λ©° (1,1), (2,1), (3,3)의 μœ„μΉ˜μ—λŠ” 학생이 μ‘΄μž¬ν•œλ‹€. 그리고 (1,2), (2,2), (3,2)의 μœ„μΉ˜μ—λŠ” μž₯애물이 μ‘΄μž¬ν•œλ‹€.

이 λ•Œ (3,3)의 μœ„μΉ˜μ— μ‘΄μž¬ν•˜λŠ” 학생은 μž₯μ• λ¬Ό λ’€νŽΈμ— μˆ¨μ–΄ 있기 λ•Œλ¬Έμ— κ°μ‹œλ₯Ό ν”Όν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ (1,1)κ³Ό (2,1)의 μœ„μΉ˜μ— μ‘΄μž¬ν•˜λŠ” 학생은 μ„ μƒλ‹˜μ—κ²Œ λ“€ν‚€κ²Œ λœλ‹€.

학생듀은 λ³΅λ„μ˜ 빈 μΉΈ μ€‘μ—μ„œ μž₯애물을 μ„€μΉ˜ν•  μœ„μΉ˜λ₯Ό 골라, μ •ν™•νžˆ 3개의 μž₯애물을 μ„€μΉ˜ν•΄μ•Ό ν•œλ‹€. 결과적으둜 3개의 μž₯애물을 μ„€μΉ˜ν•˜μ—¬ λͺ¨λ“  학생듀을 κ°μ‹œλ‘œλΆ€ν„° ν”Όν•˜λ„λ‘ ν•  수 μžˆλŠ”μ§€ κ³„μ‚°ν•˜κ³ μž ν•œλ‹€. NxN 크기의 λ³΅λ„μ—μ„œ 학생 및 μ„ μƒλ‹˜μ˜ μœ„μΉ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μž₯애물을 μ •ν™•νžˆ 3개 μ„€μΉ˜ν•˜μ—¬ λͺ¨λ“  학생듀이 μ„ μƒλ‹˜λ“€μ˜ κ°μ‹œλ₯Ό ν”Όν•˜λ„λ‘ ν•  수 μžˆλŠ”μ§€ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

예λ₯Ό λ“€μ–΄ N=5일 λ•Œ, λ‹€μŒκ³Ό 같이 μ„ μƒλ‹˜ 및 ν•™μƒμ˜ μœ„μΉ˜ 정보가 μ£Όμ–΄μ‘Œλ‹€κ³  κ°€μ •ν•˜μž.

이 λ•Œ λ‹€μŒκ³Ό 같이 3개의 μž₯애물을 μ„€μΉ˜ν•˜λ©΄, λͺ¨λ“  학생듀을 μ„ μƒλ‹˜μ˜ κ°μ‹œλ‘œλΆ€ν„° ν”Όν•˜λ„λ‘ λ§Œλ“€ 수 μžˆλ‹€.

πŸ“₯μž…λ ₯ 쑰건

  • 첫째 쀄에 μžμ—°μˆ˜ N이 주어진닀. (3 ≀ N ≀ 6)
  • λ‘˜μ§Έ 쀄에 N개의 쀄에 κ±Έμ³μ„œ λ³΅λ„μ˜ 정보가 주어진닀.
  • 각 ν–‰μ—μ„œλŠ” N개의 μ›μ†Œκ°€ 곡백을 κΈ°μ€€μœΌλ‘œ κ΅¬λΆ„λ˜μ–΄ 주어진닀.
  • ν•΄λ‹Ή μœ„μΉ˜μ— 학생이 μžˆλ‹€λ©΄ S, μ„ μƒλ‹˜μ΄ μžˆλ‹€λ©΄ T, 아무것도 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ Xκ°€ 주어진닀.
  • 단, 전체 μ„ μƒλ‹˜μ˜ μˆ˜λŠ” 5μ΄ν•˜μ˜ μžμ—°μˆ˜, 전체 ν•™μƒμ˜ μˆ˜λŠ” 30μ΄ν•˜μ˜ μžμ—°μˆ˜μ΄λ©° 항상 빈 칸의 κ°œμˆ˜λŠ” 3개 μ΄μƒμœΌλ‘œ 주어진닀.
//예1
5
X S X X T
T X S X X
X X X X X
X T X X X
X X T X X
//예2
4
S S S T
X X X X
X X X X
T T T X

πŸ“€μΆœλ ₯ 쑰건

  • 첫째 쀄에 μ •ν™•νžˆ 3개의 μž₯애물을 μ„€μΉ˜ν•˜μ—¬ λͺ¨λ“  학생듀을 κ°μ‹œλ‘œλΆ€ν„° ν”Όν•˜λ„λ‘ ν•  수 μžˆλŠ”μ§€μ˜ μ—¬λΆ€λ₯Ό 좜λ ₯ν•œλ‹€.
  • λͺ¨λ“  학생듀을 κ°μ‹œλ‘œλΆ€ν„° ν”Όν•˜λ„λ‘ ν•  수 μžˆλ‹€λ©΄ "YES", 그렇지 μ•Šλ‹€λ©΄ "NO"λ₯Ό 좜λ ₯ν•œλ‹€.
//예1
YES
//예2
NO


문제 이해


  • N X N 크기의 λ³΅λ„μ—μ„œ 학생과 μ„ μƒλ‹˜μ˜ μœ„μΉ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, μž₯애물을 μ •ν™•νžˆ 3개 μ„€μΉ˜ν•˜μ—¬ λͺ¨λ“  학생이 μ„ μƒλ‹˜μ˜ κ°μ‹œλ₯Ό ν”Όν•  수 μžˆλŠ”μ§€ 좜λ ₯ν•˜λŠ” ν”„λ‘œκ·Έλž¨


μ•Œκ³ λ¦¬μ¦˜


μ‹€μ œ 풀이 μ‹œκ°„ : 50λΆ„

  • μž…λ ₯

    • μ „μ—­λ³€μˆ˜ μ„ μ–Έ: N, arr, dx, dy, result
    • N μž…λ ₯λ°›κΈ°
    • λ°°μ—΄ arr μž…λ ₯λ°›κΈ°
  • 계산

    • BFS μ‹€ν–‰ν•˜κΈ°
  • 좜λ ₯

    • λ§Œμ•½ μ›ν•˜λŠ” κ²°κ³Ό -> YES 좜λ ₯
    • 그렇지 μ•Šλ‹€λ©΄ -> NO 좜λ ₯
  • 별도 λ©”μ„œλ“œ

    • BFS
      • 큐 생성
        • 곡간 λ°–μœΌλ‘œ λ‚˜κ°ˆ 경우 -> λ¬΄μ‹œ
        • μž₯μ• λ¬Ό μ„€μΉ˜
      • 빈 곡간 확인
import java.util.*;

public class Main {

    static int N;
    static int[][] arr;

    static int[] dx = {-1, 1, 0 ,0};
    static int[] dy = {0, 0, -1, 1};
    static boolean result;

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

        N = sc.nextInt();
        
        sc.nextLine();

        arr = new int[N][N];
        for(int i=0; i<N; i++){
            String map = sc.nextLine();
            for(int j=0; j<N; j++){
                arr[i][j] = map.charAt(0) - '0';
            }
        }

        result = bfs();

        if(result == true){
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }
    }

    public static boolean bfs(){
        Queue<int[]> queue = new LinkedList<>();

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (arr[i][j] == 2) {
                    queue.offer(new int[]{i, j});
                }
            }
        }

        while(!queue.isEmpty()){
            int[] now = queue.poll();
            int x = now[0];
            int y = now[1];

            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 >=N){
                    continue;
                }

                arr[nx][ny] = 2;
                queue.offer(new int[]{nx,ny});
            }
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (arr[i][j] == 0) {
                    return false;
                }
            }
        }
        return true;
    }
}


μ˜€λ‹΅μ²΄ν¬


  • μž…λ ₯κ³Ό 관계 없이 YES만 좜λ ₯λ˜λŠ” 문제
    • map.charAt(0) - '0' -> map.charAt(j)둜 λ³€κ²½
    • μ„ μƒλ‹˜μ˜ μœ„μΉ˜ 정보λ₯Ό T둜 λ³€κ²½
    • ν•™μƒμ˜ μœ„μΉ˜ 정보λ₯Ό S둜 λ³€κ²½
    • arr μž…λ ₯ ν˜•νƒœλ₯Ό Stringμ—μ„œ char둜 λ³€κ²½
    • β­οΈκ°μ‹œλ₯Ό ν”Όν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λ©”μ„œλ“œ μΆ”κ°€ν•˜κΈ°β­οΈ
...

public static boolean check() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (arr[i][j] == 'T') {
                    for (int k = 0; k < 4; k++) {
                        int nx = i + dx[k];
                        int ny = j + dy[k];
                        while (nx >= 0 && nx < N && ny >= 0 && ny < N) {
                            if (arr[nx][ny] == 'S') return true;
                            if (arr[nx][ny] == 'O') return false;
                            nx += dx[k];
                            ny += dy[k];
                        }
                    }
                }
            }
        }
        return true;
    }


μ΅œμ’… 풀이


μ‹€μ œ 풀이 μ‹œκ°„ : 1μ‹œκ°„ 48λΆ„(μ‹€μ œ 풀이 μ‹œκ°„ 포함)

  • μž…λ ₯

    • μ „μ—­λ³€μˆ˜ μ„ μ–Έ: N, arr, dx, dy, result
    • N μž…λ ₯λ°›κΈ°
    • λ°°μ—΄ arr μž…λ ₯λ°›κΈ°
  • 계산

    • BFS μ‹€ν–‰ν•˜κΈ°
  • 좜λ ₯

    • λ§Œμ•½ μ›ν•˜λŠ” κ²°κ³Ό -> YES 좜λ ₯
    • 그렇지 μ•Šλ‹€λ©΄ -> NO 좜λ ₯
  • 별도 λ©”μ„œλ“œ

    • BFS

      • μž₯μ• λ¬Ό 3개 μ„€μΉ˜: κ°μ‹œλ₯Ό ν”Όν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λ©”μ„œλ“œλ‘œ 확인(check)
      • N의 λ²”μœ„ λ‚΄μ—μ„œ 빈 곡간('X')인 경우 μž₯μ• λ¬Ό μ„€μΉ˜ 진행 -> count+1
      • λ°±νŠΈλž˜ν‚ΉμœΌλ‘œ μž₯μ• λ¬Ό 제거
    • check

      • κ°μ‹œλ₯Ό ν”Όν•  수 μžˆλŠ”μ§€λ₯Ό ν™•μΈν•˜λŠ” λ©”μ„œλ“œ
      • μ„ μƒλ‹˜(T) μœ„μΉ˜μ—μ„œ μƒν•˜μ’Œμš° 확인
        • 학생 발견 -> κ°μ‹œλ₯Ό ν”Όν•  수 μ—†μŒ 좜λ ₯(true)
        • μž₯애물이 μžˆλŠ” 경우 -> false
      • κ°μ‹œλ₯Ό λͺ¨λ‘ ν”Όν•œ 경우 -> true
import java.util.*;

public class Main {

    static int N;
    static char[][] arr;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static boolean foundSolution;

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

        N = sc.nextInt();
        sc.nextLine();

        arr = new char[N][N];
        for (int i = 0; i < N; i++) {
            String map = sc.nextLine();
            for (int j = 0; j < N; j++) {
                arr[i][j] = map.charAt(j * 2); // 곡백
            }
        }

        foundSolution = false;
        dfs(0);

        if (foundSolution) {
            System.out.println("YES");
        } else {
            System.out.println("NO");
        }
    }

    public static void dfs(int count) {
        if (count == 3) { // μž₯μ• λ¬Ό 3개 μ„€μΉ˜
            if (check()) {
                foundSolution = true;
            }
            return;
        }

        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (arr[i][j] == 'X') {
                    arr[i][j] = 'O';
                    dfs(count + 1);
                    
                    if (foundSolution) return;
                    arr[i][j] = 'X';
                }
            }
        }
    }

    // κ°μ‹œλ₯Ό ν”Όν•  수 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” λ©”μ„œλ“œ
    public static boolean check() {
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if (arr[i][j] == 'T') {
                    for (int k = 0; k < 4; k++) {
                        int nx = i + dx[k];
                        int ny = j + dy[k];
                        while (nx >= 0 && nx < N && ny >= 0 && ny < N) {
                            if (arr[nx][ny] == 'S') {
                                return false; // 학생 발견 μ‹œ false
                            }
                            if (arr[nx][ny] == 'O') {
                                break; // μž₯μ• λ¬Ό 발견 μ‹œ 쀑지
                            }
                            nx += dx[k];
                            ny += dy[k];
                        }
                    }
                }
            }
        }
        return true; // λͺ¨λ“  μ„ μƒλ‹˜μ΄ 학생을 λ°œκ²¬ν•˜μ§€ λͺ»ν•˜λŠ” κ²½μš°μ— ν•΄λ‹Ή
    }
}

profile
μ–Έμ  κ°€ λ‚΄ μ½”λ“œλ‘œ 세상에 κΈ°μ—¬ν•  수 μžˆλ„λ‘, BE&Data Science 개발 기둝 λ…ΈνŠΈβ˜˜οΈ

0개의 λŒ“κΈ€