๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค[Java] - (Level3)๋ฐฉ๋ฌธ ๊ธธ์ด

by ์ฃผ๋ฐœ2 2020. 3. 17.
๋ฐ˜์‘ํ˜•

https://programmers.co.kr/learn/courses/30/lessons/49994

 

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

์ฝ”๋“œ ์ค‘์‹ฌ์˜ ๊ฐœ๋ฐœ์ž ์ฑ„์šฉ. ์Šคํƒ ๊ธฐ๋ฐ˜์˜ ํฌ์ง€์…˜ ๋งค์นญ. ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๊ฐœ๋ฐœ์ž ๋งž์ถคํ˜• ํ”„๋กœํ•„์„ ๋“ฑ๋กํ•˜๊ณ , ๋‚˜์™€ ๊ธฐ์ˆ  ๊ถํ•ฉ์ด ์ž˜ ๋งž๋Š” ๊ธฐ์—…๋“ค์„ ๋งค์นญ ๋ฐ›์œผ์„ธ์š”.

programmers.co.kr

์ฝ”๋“œ

class Solution {
    // U,D,R,L - ์œ„,์•„๋ž˜,์˜ค๋ฅธ์ชฝ,์™ผ์ชฝ ์ˆœ
    public static int[] dx = {0, 0, 1, -1};
    public static int[] dy = {-1, 1, 0, 0};
    // ๋งต์˜ ํฌ๊ธฐ = -5 ~ 5๊นŒ์ง€์ด๋ฏ€๋กœ 11x11
    public static boolean[][][][] visit = new boolean[11][11][11][11];
    
    public int solution(String dirs) {
        int answer = 0;
        
        /* x,y = ์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋™ํ•˜๊ธฐ ์ „ ์œ„์น˜, nextX, nextY = ์บ๋ฆญํ„ฐ๊ฐ€ ์ด๋™ํ•œ ํ›„ ์œ„์น˜ */
        int x = 0;
        int y = 0;
        // ๋ฌธ์ œ์˜ ๋ฒ”์œ„๋Š” -5~5์ด๊ณ , ๋ฐฐ์—ด์˜ํฌ๊ธฐ๋Š”0~10์ด๋ฏ€๋กœ ์‹œ์ž‘ ์œ„์น˜๋ฅผ +5๋กœ ์žก์•„์ค€๋‹ค.
        int nextX = 5;
        int nextY = 5;
        
        int index = 0;
        
        for(int i=0; i<dirs.length(); i++){
            // ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜ ์ €์žฅ
            x = nextX;
            y = nextY;
            if(dirs.charAt(i) == 'U') 
                index = 0;
            else if(dirs.charAt(i) == 'D')  
                index = 1;
            else if(dirs.charAt(i) == 'R')  
                index = 2;
            else if(dirs.charAt(i) == 'L')  
                index = 3;
            
            // U, D, R, L์— ๋งž๋Š” ์บ๋ฆญํ„ฐ ์œ„์น˜ ์ด๋™
            nextX += dx[index];
            nextY += dy[index];
            
            // ์ด์ „์— ์›€์ง์ธ ๋ฒ”์œ„์— ์˜ํ•ด ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜๊ฐ€ ์ง€๋„๋ฅผ ๋ฒ—์–ด๋‚ฌ์„ ๊ฒฝ์šฐ
            if(nextX < 0 || nextY < 0 || nextX > 10 || nextY > 10){
                // ๋‹ค์‹œ ์บ๋ฆญํ„ฐ๋ฅผ ์ „์˜ ์œ„์น˜๋กœ ์ด๋™
                nextX -= dx[index];
                nextY -= dy[index];
                continue;
            }
            
            // ์บ๋ฆญํ„ฐ๊ฐ€ ์ฒ˜์Œ ๊ฑธ์–ด๋ณธ ๊ธธ์ผ๊ฒฝ์šฐ
            if(!visit[x][y][nextX][nextY] && !visit[nextX][nextY][x][y]){
                // ๊ฑธ์–ด์˜จ ๊ธธ ์ฒดํฌ(์ ์ด ์•„๋‹Œ ๊ธธ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ฒดํฌํ•œ๋‹ค.)
                visit[x][y][nextX][nextY] = true;
                visit[nextX][nextY][x][y] = true;
                answer ++;
            }
        }
        return answer;
    }
}

ํ’€์ด

U: ์œ„์ชฝ์œผ๋กœ ํ•œ์นธ

D: ์•„๋ž˜์ชฝ์œผ๋กœ ํ•œ์นธ

R: ์˜ค๋ฅธ์ชฝ์œผ๋กœ ํ•œ์นธ

L: ์™ผ์ชฝ์œผ๋กœ ํ•œ์นธ

https://blog.naver.com/PostView.nhn?blogId=jaeyoon_95&logNo=221790432130&categoryNo=74&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=postView

 

๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ๊ทธ๋Œ€๋กœ ํ•ด๊ฒฐํ•˜๋ฉด ๋œ๋‹ค.

๋จผ์ € ์บ๋ฆญํ„ฐ๊ฐ€ ์›€์ง์ผ์ˆ˜ ์žˆ๋Š” ↑(y+1) , ↓(y-1) , →(x+1) , ←(x-1) ๋ฐฉํ–ฅ์— ๋งž๊ฒŒ dx, dy ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด์ฃผ๊ณ ,

๋งต์€ -5๋ถ€ํ„ฐ 5๊นŒ์ง€์ด์ง€๋งŒ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐํ•˜๋ฏ€๋กœ, +5์”ฉ ๋”ํ•ด์„œ 0~10๊นŒ์ง€ ๋งต์„ ์„ค์ •ํ• 

4์ฐจ์› boolean ๋ฐฐ์—ด์„ ์„ ์–ธํ•ด ์ฃผ์—ˆ๋‹ค.[ํ˜„์žฌ์œ„์น˜(2์ฐจ์›), ์ด๋™์œ„์น˜(2์ฐจ์›) ์ฒดํฌ๋ฅผ ํ•ด์•ผํ•œ๋‹ค.]

    public static int[] dx = {0, 0, 1, -1};
    public static int[] dy = {-1, 1, 0, 0};
    // ๋งต์˜ ํฌ๊ธฐ = -5 ~ 5๊นŒ์ง€์ด๋ฏ€๋กœ 11x11
    public static boolean[][][][] visit = new boolean[11][11][11][11];

 

๊ทธ ํ›„ ์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜(x,y) ์™€ ์ด๋™ ํ›„ ์œ„์น˜๋ฅผ ์ €์žฅํ•  ๋ณ€์ˆ˜(nx, ny)์„ ์„ ์–ธํ•œ๋‹ค.

์ด๋•Œ ๋งต์„ ์šฐ์ธก์œผ๋กœ 5์นธ์”ฉ ์ด๋™ํ–ˆ์œผ๋ฏ€๋กœ, ์ด๋™ํ›„์˜ ๋ณ€์ˆ˜ ์ดˆ๊ธฐ๊ฐ’์„ 5๋กœ ์„ค์ •ํ•œ๋‹ค.

์ด์ œ ์ฃผ์–ด์ง„ ๋ฌธ์ž์—ด์˜ ๊ฐ ๋ฌธ์ž๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•œ๋‹ค.

์บ๋ฆญํ„ฐ์˜ ํ˜„์žฌ ์œ„์น˜๋Š” (5,5) ์ด๋ฏ€๋กœ x, y ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค.

            x = nx;
            y = ny;

 

๊ทธ ํ›„ ๊ฐ ๋ฌธ์ž๊ฐ€ U, D, R, L์— ๋”ฐ๋ผ ์œ„์—์„œ ์„ค์ •ํ•œ dx, dy์˜ ์ธ๋ฑ์Šค์— ๋งž๊ฒŒ 0, 1, 2, 3๋กœ ์ €์žฅํ•˜๊ณ , ์บ๋ฆญํ„ฐ์˜ ์œ„์น˜๋ฅผ ์ด๋™์‹œํ‚จ๋‹ค.

 

๋งŒ์•ฝ ์บ๋ฆญํ„ฐ์˜ ์ด๋™ ์œ„์น˜๊ฐ€ ๋งต์„ ๋ฒ—์–ด๋‚ฌ์„ ๊ฒฝ์šฐ(๋งต์˜ ๋ฒ”์œ„๋Š” 0 ~ 10๊นŒ์ง€)

์ด์ „์— ์ด๋™์‹œํ‚จ ์บ๋ฆญํ„ฐ๋ฅผ ์›์œ„์น˜ ์‹œํ‚จ๋‹ค.

 

๋‹ค์Œ์œผ๋กœ ์บ๋ฆญํ„ฐ๊ฐ€ ์ฒ˜์Œ ์™”๋˜ ๊ธธ์ธ๊ฒฝ์šฐ, ์ด์ „์˜ ๊ธธ + ํ˜„์žฌ์˜ ๊ธธ ๋ชจ๋‘ ์ฒดํฌํ‘œ์‹œ๋ฅผ ํ•œ๋‹ค.

 

 

 

* *

๋งต์˜ ํฌ๊ธฐ๋Š” 10x10์ด๊ณ , ์ฒ˜์Œ์—๋Š” ์•„๋ฌด ์ƒ๊ฐ์—†์ด ๋กœ๋ด‡์ด ์ด๋™ํ•˜๋Š” ์œ„์น˜๋ฅผ 2์ฐจ์› boolean ๋ฐฐ์—ด์— ์ฒดํฌํ•ด์ฃผ๊ณ ,

๋งŒ์•ฝ ์ฒดํฌ๋˜์–ด ์žˆ๋Š” ๊ธธ์ผ๊ฒฝ์šฐ ๊ธธ์ด๋ฅผ ์ค„์ด๋Š” ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ—€๋Š”๋ฐ,,

๋‹น์—ฐํžˆ ๋ฐฐ์—ด์—๋Š” ๋งˆ์ด๋„ˆ์Šค ์ธ๋ฑ์Šค๊ฐ€ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ’€๋ฉด์„œ ์ขŒํ‘œํ‰๋ฉด๊ณผ 2์ฐจ์›ํ–‰๋ ฌ๊ณผ์˜ x, y์ถ• ์ขŒํ‘œ๊ฐ’์ด ์กฐ๊ธˆ ํ—ท๊ฐˆ๋ ธ๋‹ค.

2์ฐจ์› ๋ฐฐ์—ด์˜ ์ด๋™ ์ „ + ์ด๋™ ํ›„ ์ฒดํฌ๋ฅผ 4์ฐจ์› ๋ฐฐ์—ด๋กœ ์ฒดํฌํ•ด ์ค„ ์ˆ˜ ์žˆ๊ณ , ์ฃผ์–ด์ง„ ๋ฌธ์ œ์˜ ํ‰๋ฉด์„ ์•ฝ๊ฐ„ ์ด๋™์‹œ์ผœ์„œ ํ’€ ์ˆ˜ ์žˆ๋Š”๋ฒ•์„ ๋ฐฐ์› ๋‹ค.

๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€