05-15 20:52
Recent Posts
Recent Comments
๊ด€๋ฆฌ ๋ฉ”๋‰ด

miinsun

[Programmers] 2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ : ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ JAVA ๋ณธ๋ฌธ

Algorithm/Programmers

[Programmers] 2021 ์นด์นด์˜ค ์ฑ„์šฉ์—ฐ๊ณ„ํ˜• ์ธํ„ด์‹ญ : ๊ฑฐ๋ฆฌ๋‘๊ธฐ ํ™•์ธํ•˜๊ธฐ JAVA

miinsun 2022. 7. 1. 21:16

 

๐Ÿ’ฌ ๋ฌธ์ œ ์„ค๋ช…

๊ฐœ๋ฐœ์ž๋ฅผ ํฌ๋งํ•˜๋Š” ์ฃ ๋ฅด๋””๊ฐ€ ์นด์นด์˜ค์— ๋ฉด์ ‘์„ ๋ณด๋Ÿฌ ์™”์Šต๋‹ˆ๋‹ค.์ฝ”๋กœ๋‚˜ ๋ฐ”์ด๋Ÿฌ์Šค ๊ฐ์—ผ ์˜ˆ๋ฐฉ์„ ์œ„ํ•ด ์‘์‹œ์ž๋“ค์€ ๊ฑฐ๋ฆฌ๋ฅผ ๋‘ฌ์„œ ๋Œ€๊ธฐ๋ฅผ ํ•ด์•ผํ•˜๋Š”๋ฐ ๊ฐœ๋ฐœ ์ง๊ตฐ ๋ฉด์ ‘์ธ ๋งŒํผ์•„๋ž˜์™€ ๊ฐ™์€ ๊ทœ์น™์œผ๋กœ ๋Œ€๊ธฐ์‹ค์— ๊ฑฐ๋ฆฌ๋ฅผ ๋‘๊ณ  ์•‰๋„๋ก ์•ˆ๋‚ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋Œ€๊ธฐ์‹ค์€ 5๊ฐœ์ด๋ฉฐ, ๊ฐ ๋Œ€๊ธฐ์‹ค์€ 5x5 ํฌ๊ธฐ์ž…๋‹ˆ๋‹ค.๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์œ„ํ•˜์—ฌ ์‘์‹œ์ž๋“ค ๋ผ๋ฆฌ๋Š” ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ1๊ฐ€ 2 ์ดํ•˜๋กœ ์•‰์ง€ ๋ง์•„ ์ฃผ์„ธ์š”.๋‹จ ์‘์‹œ์ž๊ฐ€ ์•‰์•„์žˆ๋Š” ์ž๋ฆฌ ์‚ฌ์ด๊ฐ€ ํŒŒํ‹ฐ์…˜์œผ๋กœ ๋ง‰ํ˜€ ์žˆ์„ ๊ฒฝ์šฐ์—๋Š” ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด,
5๊ฐœ์˜ ๋Œ€๊ธฐ์‹ค์„ ๋ณธ ์ฃ ๋ฅด๋””๋Š” ๊ฐ ๋Œ€๊ธฐ์‹ค์—์„œ ์‘์‹œ์ž๋“ค์ด ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ž˜ ๊ธฐํ‚ค๊ณ  ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์‹ถ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ž๋ฆฌ์— ์•‰์•„์žˆ๋Š” ์‘์‹œ์ž๋“ค์˜ ์ •๋ณด์™€ ๋Œ€๊ธฐ์‹ค ๊ตฌ์กฐ๋ฅผ ๋Œ€๊ธฐ์‹ค๋ณ„๋กœ ๋‹ด์€ 2์ฐจ์› ๋ฌธ์ž์—ด ๋ฐฐ์—ด places๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์ง‘๋‹ˆ๋‹ค.

๊ฐ ๋Œ€๊ธฐ์‹ค๋ณ„๋กœ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์œผ๋ฉด 1์„, ํ•œ ๋ช…์ด๋ผ๋„ ์ง€ํ‚ค์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉด 0์„ ๋ฐฐ์—ด์— ๋‹ด์•„ return ํ•˜๋„๋กsolution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด ์ฃผ์„ธ์š”.

 

๐Ÿšซ ์ œํ•œ ์‚ฌํ•ญ

  • places์˜ ํ–‰ ๊ธธ์ด(๋Œ€๊ธฐ์‹ค ๊ฐœ์ˆ˜) = 5
    • places์˜ ๊ฐ ํ–‰์€ ํ•˜๋‚˜์˜ ๋Œ€๊ธฐ์‹ค ๊ตฌ์กฐ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
  • places์˜ ์—ด ๊ธธ์ด(๋Œ€๊ธฐ์‹ค ์„ธ๋กœ ๊ธธ์ด) = 5
  • places์˜ ์›์†Œ๋Š” P,O,X๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฌธ์ž์—ด์ž…๋‹ˆ๋‹ค.
    • places ์›์†Œ์˜ ๊ธธ์ด(๋Œ€๊ธฐ์‹ค ๊ฐ€๋กœ ๊ธธ์ด) = 5
    • P๋Š” ์‘์‹œ์ž๊ฐ€ ์•‰์•„์žˆ๋Š” ์ž๋ฆฌ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • O๋Š” ๋นˆ ํ…Œ์ด๋ธ”์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
    • X๋Š” ํŒŒํ‹ฐ์…˜์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” 5๊ฐœ ๋Œ€๊ธฐ์‹ค์˜ ํฌ๊ธฐ๋Š” ๋ชจ๋‘ 5x5 ์ž…๋‹ˆ๋‹ค.
  • return ๊ฐ’ ํ˜•์‹
    • 1์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด์— 5๊ฐœ์˜ ์›์†Œ๋ฅผ ๋‹ด์•„์„œ return ํ•ฉ๋‹ˆ๋‹ค.
    • places์— ๋‹ด๊ฒจ ์žˆ๋Š” 5๊ฐœ ๋Œ€๊ธฐ์‹ค์˜ ์ˆœ์„œ๋Œ€๋กœ, ๊ฑฐ๋ฆฌ๋‘๊ธฐ ์ค€์ˆ˜ ์—ฌ๋ถ€๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐฐ์—ด์— ๋‹ด์Šต๋‹ˆ๋‹ค.
    • ๊ฐ ๋Œ€๊ธฐ์‹ค ๋ณ„๋กœ ๋ชจ๋“  ์‘์‹œ์ž๊ฐ€ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์œผ๋ฉด 1์„, ํ•œ ๋ช…์ด๋ผ๋„ ์ง€ํ‚ค์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉด 0์„ ๋‹ด์Šต๋‹ˆ๋‹ค.

 

๐Ÿ”จ ์ž…์ถœ๋ ฅ ์˜ˆ

  1. ์ž…์ถœ๋ ฅ ์˜ˆ
์ฒซ ๋ฒˆ์งธ ๋Œ€๊ธฐ์‹ค
  • ๋ชจ๋“  ์‘์‹œ์ž๊ฐ€ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‘ ๋ฒˆ์งธ ๋Œ€๊ธฐ์‹ค
  • (0, 0) ์ž๋ฆฌ์˜ ์‘์‹œ์ž์™€ (2, 0) ์ž๋ฆฌ์˜ ์‘์‹œ์ž๊ฐ€ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • (1, 2) ์ž๋ฆฌ์˜ ์‘์‹œ์ž์™€ (0, 3) ์ž๋ฆฌ์˜ ์‘์‹œ์ž๊ฐ€ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • (4, 3) ์ž๋ฆฌ์˜ ์‘์‹œ์ž์™€ (4, 4) ์ž๋ฆฌ์˜ ์‘์‹œ์ž๊ฐ€ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์„ธ ๋ฒˆ์งธ ๋Œ€๊ธฐ์‹ค
  • ๋ชจ๋“  ์‘์‹œ์ž๊ฐ€ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋„ค ๋ฒˆ์งธ ๋Œ€๊ธฐ์‹ค
  • ๋Œ€๊ธฐ์‹ค์— ์‘์‹œ์ž๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹ค์„ฏ ๋ฒˆ์งธ ๋Œ€๊ธฐ์‹ค
  • ๋ชจ๋“  ์‘์‹œ์ž๊ฐ€ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ ๋Œ€๊ธฐ์‹ค์„ ์ œ์™ธํ•œ ๋ชจ๋“  ๋Œ€๊ธฐ์‹ค์—์„œ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๊ฐ€ ์ง€์ผœ์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ, ๋ฐฐ์—ด [1, 0, 1, 1, 1]์„ return ํ•ฉ๋‹ˆ๋‹ค.

 

๐Ÿ’ป Solution.java

  • ์ขŒํ‘œ ์ •๋ณด์™€ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ํด๋ž˜์Šค Point๋ฅผ ์ƒ์„ฑํ•œ๋‹ค
  • isKeepDistance() ํ•จ์ˆ˜๋กœ ํ•œ ๋Œ€๊ธฐ์‹ค์”ฉ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๊ฐ€ ์ œ๋Œ€๋กœ ๋˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
    • ์‘์‹œ์ž์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„ bfs๋ฅผ ์‹œ์ž‘ํ•œ๋‹ค.
  • ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ bfs ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ–ˆ๋‹ค.
    • ์‘์‹œ์ž ์œ„์น˜๋ฅผ ์‹œ์ž‘์œผ๋กœ ์ขŒํ‘œ๋ฅผ ์ €์žฅํ•œ๋‹ค
    • ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋‹ค์Œ์œผ๋กœ ๊ฐˆ ์ขŒํ‘œ๋Š” ์‹ญ์ž๋กœ๋งŒ ์›€์ง์ด๊ณ , ๊ฑฐ๋ฆฌ๋ฅผ point.dist์— ์ €์žฅํ•œ๋‹ค
      • ์‘์‹œ์ž์™€ ๋–จ์–ด์ง„ ๊ฑฐ๋ฆฌ(point.dist + 1)๊ฐ€ 2๋ณด๋‹ค ์ปค์ง€๊ฒŒ ๋˜๋ฉด bfs๋ฅผ ์ค‘์ง€ํ•œ๋‹ค
      • ํŒŒํ‹ฐ์…˜์„ ์ ‘ํ•˜๋ฉด ์Šคํ‚ต
      • ๋งจํ•ดํŠผ ๊ฑฐ๋ฆฌ 2์ดํ•˜์— ๋‹ค๋ฅธ ์‘์‹œ์ž๋ฅผ ๋งŒ๋‚˜๋ฉด bfs ์ค‘์ง€, 0๋ฆฌํ„ด
import java.util.*;

class Point{
    int x;
    int y;
    int dist;
    
    Point(int x, int y, int dist){
        this.x = x;
        this.y = y;
        this.dist = dist;
    }
}

class Solution {
    static int[] dy = {-1,0,1,0};
    static int[] dx = {0,1,0,-1};
    
    public int bfs(int x, int y, String[] place){
        boolean[][] visited = new boolean[5][5];
        Queue<Point> q = new LinkedList<>();
        q.add(new Point(x, y, 0));  // ์‘์‹œ์ž ์œ„์น˜๋ฅผ ์‹œ์ž‘์ ์œผ๋กœ ์ง€์ •
                    
        while(!q.isEmpty()){
            Point cur = q.poll();
            visited[x][y] = true;
            for(int k = 0; k < 4; k++){
                int ny = cur.y + dy[k];
                int nx = cur.x + dx[k];

                // ์‘์‹œ์ž์˜ ๋‹ค์Œ ๊ฑฐ๋ฆฌ๊ฐ€ 2๋ณด๋‹ค ํด ๊ฒฝ์šฐ ์ •์ง€ 
                if(cur.dist + 1 > 2)
                    break;

                // ๋Œ€๊ธฐ์‹ค์˜ ๋ฒ”์œ„ ๊ฒ€์‚ฌ์™€ ์ค‘๋ณต ๊ฒ€์‚ฌ
                if(nx < 5 && ny < 5 && nx >= 0 && ny >= 0 && !visited[nx][ny]){
                    // ํŒŒํ‹ฐ์…˜์ผ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์žฌ์ง€ ์•Š๋Š”๋‹ค
                    if(place[nx].charAt(ny) == 'X')
                        continue;
                    // ๊ฑฐ๋ฆฌ๋‘๊ธฐ๊ฐ€ ์ด๋ค„์ง€์ง€ ์•Š์œผ๋ฉด '0'๋ฆฌํ„ด
                    else if(place[nx].charAt(ny) == 'P')
                        return 0;
                    // ๋นˆ ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์žฌ์ค€๋‹ค
                    else
                        q.add(new Point(nx, ny, cur.dist + 1));
                }
            }
        }
        
        return 1;
    }
    
    public int isKeepDistance(String[] place){
        for(int i = 0; i < 5; i++){
            for(int j = 0; j < 5; j++){
                // ์‘์‹œ์ž๋ฅผ ์ค‘์‹ฌ์œผ๋กœ bfs ์‹œ์ž‘
                if(place[i].charAt(j) == 'P'){ 
                    // ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ์ง€ํ‚ค์ง€ ์•Š๊ณ  ์žˆ์œผ๋ฉด 0 ๋ฆฌํ„ด
                    if(bfs(i, j, place) == 0){
                        return 0;
                    }
                }                
            }
        }

        // ๋ชจ๋‘ ๊ฑฐ๋ฆฌ๋‘๊ธฐ๋ฅผ ํ•˜๊ณ  ์žˆ์œผ๋ฉด 1 ๋ฆฌํ„ด
        return 1;
    }
    
    public int[] solution(String[][] places) {
        int[] answer = new int[5];
        
        for(int i = 0; i < 5; i++){
            answer[i] = isKeepDistance(places[i]);
        }
        
        return answer;
    }
}
Comments