๐Ÿ”’Algorithm

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค[JS] > ๋ฌด์ธ๋„ ์—ฌํ–‰

devWarrior 2024. 8. 11. 23:21

๐Ÿ”ฅ๋ฌธ์ œ๋งํฌ

https://school.programmers.co.kr/learn/courses/30/lessons/154540

 

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

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

programmers.co.kr

 

๐Ÿ”ฅ์ฒซ๋ฒˆ์งธ ์‹œ๋„ (๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ) 

ํ˜ธ๊ธฐ๋กญ๊ฒŒ ํ’€์—ˆ์ง€๋งŒ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ... ๐Ÿค”

function solution(maps) {
    var answer = [];

    // visit ๊ด€๋ จ map
    const visit_map = maps.map((str,x)=>{
        let temp = []
        for(let y=0; y<=str.length-1; ++y){
            temp.push(str[y]!=='X')
        }
        return temp
    })

    // {1: 10, 2:1, 3:2 } ์™€ ๊ฐ™์ด ๊ฐ™์€์„ฌ์˜ ์‹๋Ÿ‰์ ์ˆ˜๋ฅผ ๋‹ด์„ obj
    let score_map = {}
    
    // ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋•…์€ ๋ชจ๋‘ ๊ฐ™์€ ์ˆซ์ž๋กœ ํ‘œ๊ธฐ
    const dfs =(position,mark)=>{
        const [x,y] = position
        visit_map[x][y] = false
        if(score_map[mark]){
            score_map[mark]+=Number(maps[x][y])
        }else{
            score_map[mark]=Number(maps[x][y])
        }
             
        // ์ƒํ•˜์ขŒ์šฐ
        let move = [[x+1,y],[x-1,y],[x,y+1],[x,y-1]]
        move.forEach(([new_x,new_y])=>{
            // ์กด์žฌํ•˜๊ณ , true ์ด๋ฉด
            if(visit_map[new_x]&&visit_map[new_x][new_y]===true){
                dfs([new_x,new_y],mark)
            }
        })
    }


    let mark = 0;
    for(let i=0; i<=maps.length-1; ++i){
        for(let j=0; j<=maps[0].length-1; ++j){
            if(visit_map[i][j]===true){
                ++mark
                dfs([i,j],mark)
            }
        }
    }

    answer = Object.values(score_map)    
    return answer.length ? answer.sort((a,b)=> a-b) : [-1] ;

}

 

 

๐Ÿ”ฅ๋‘๋ฒˆ์งธ ์‹œ๋„ ( ์‹คํŒจ - ํŠน์ • ์ผ€์ด์Šค ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ )

๊ฒฐ๊ณผ๋Š” ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋˜ 15, 16, 18, 19๋ฒˆ ์ผ€์ด์Šค ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค.

function solution(maps) {
    var answer = [];
    let score_map = {}
    maps = maps.map((line)=> line.split(''))
    
    // ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋•…์€ ๋ชจ๋‘ ๊ฐ™์€ ์ˆซ์ž๋กœ ํ‘œ๊ธฐ
    const dfs =(position,mark)=>{
        let [x,y] = position
        let score = maps[x][y]
            
        if(answer[mark]){
            answer[mark]+=Number(score)
        }else{
            answer[mark]=Number(score)
        }
        maps[x][y] ='X'
        // ์ƒํ•˜์ขŒ์šฐ
        let move = [[x+1,y],[x-1,y],[x,y+1],[x,y-1]]
        
        
        move.forEach((new_position)=>{
            let [nx,ny] = new_position
            if(nx>=0 && nx<=maps.length-1 && ny>=0 && ny<=maps[0].length-1){
                if(maps[nx][ny]!=='X'){
                    dfs([nx,ny],mark)
                }
            }
        })
    }


    let mark = 0;
    let [max_x,max_y]=[maps.length-1,maps[0].length-1]
    for(let i=0; i<=max_x; ++i){
        for(let j=0; j<=max_y; ++j){
            if(maps[i][j]!=='X'){
                dfs([i,j],mark)
                ++mark
            }
        }
    }

    return answer.length ? answer.sort((a,b)=> a-b) : [-1] ;
}

 

 

๐Ÿ”ฅ์„ธ๋ฒˆ์งธ ์‹œ๋„ ( ์„ฑ๊ณต )

์ด๋ฒˆ์—” ์กฐ๊ธˆ ๋”ฐ๋กœ ์„ฌ๋งˆ๋‹ค์˜ ์ ์ˆ˜๋ฅผ ๋ฆฌ์ŠคํŠธ์—… ํ•˜๊ธฐ ์œ„ํ•œ score_map ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋‹ค์ด๋ ‰ํŠธ๋กœ answer์— ์„ฌ๋งˆ๋‹ค์˜ ํ•ฉ์‚ฐ ์ ์ˆ˜๋ฅผ ์ง์ ‘ push ํ•ด์คฌ๋‹ค. ํ  .... ์•„๋ฌด๋ž˜๋„ ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์ดˆ๊ณผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜ํƒ€๋‚ฌ๋˜๊ฑฐ ๊ฐ™๋‹ค.

function solution(maps) {
    var answer = [];
    maps = maps.map((line)=> line.split(''))

    const dfs =(position)=>{
        let [x,y] = position
        if(x>=0 && x<maps.length && y>=0 && y<maps[0].length && maps[x][y]!=='X'){
            let score = Number(maps[x][y])
            maps[x][y] = 'X'
            return score + dfs([x+1,y]) + dfs([x-1,y]) + dfs([x,y+1]) + dfs([x,y-1])
        }else{
            return 0
        }
    }



    let [max_x,max_y]=[maps.length-1,maps[0].length-1]
    for(let i=0; i<=max_x; ++i){
        for(let j=0; j<=max_y; ++j){
            if(maps[i][j]!=='X'){
                answer.push(dfs([i,j]))
            }
        }
    }

    return answer.length ? answer.sort((a,b)=> a-b) : [-1] ;
}

 

๐Ÿ”ฅํ›„๊ธฐ

1,2 ๋ฒˆ์งธ ํŠน์ • ์ผ€์ด์Šค ๋Ÿฐํƒ€์ž„ ์—๋Ÿฌ๋Š” ์•„๋งˆ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ดˆ๊ณผํ•ด์„œ ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด 1,2 ๋ฒˆ ํ’€์ด์™€ 3๋ฒˆ ํ’€์ด์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ? ๊ทธ๊ฑด ๋ฐ”๋กœ ์žฌ๊ท€ํ•จ์ˆ˜๊ฐ€ ๋Œ ๋•Œ๋งˆ๋‹ค ์ ์ˆ˜๋ฅผ ๋‹ด๋Š” ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์— ํŠน์ • key๋‚˜ index๋กœ ์ ‘๊ทผํ•˜์—ฌ ๊ฐ’์„ ๊ณ„์†ํ•ด์„œ ๊ฐฑ์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 3๋ฒˆ์งธ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ์žฌ๊ท€ํ•จ์ˆ˜๋ฅผ ๋Œ๋•Œ๋งˆ๋‹ค ๊ฐ์ฒด์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ดํ•ฉ์„ ๊ตฌํ•œ๋‹ค์Œ ์ตœ์ข…์ ์œผ๋กœ ์ ์ˆ˜๋ฅผ ๋‹ด๋Š” answer ๋ฐฐ์—ด์— ๋‹ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ๋” ์ ๋‹ค๊ณ  ์ดํ•ดํ•˜๋ฉด ๋  ๊ฒƒ์ด๋‹ค.  

 

๋ณ„๋„๋กœ ์ฒ˜์Œ์— maps[1] = 'abcd' ์ธ ๊ฒฝ์šฐ maps[1][0] = '9' ๋ผ๊ณ  ์„ ์–ธํ•ด๋„ maps[1]์€ ๊ทธ๋Œ€๋กœ 'abcd' ์ž„์„ (๋ฌธ์ž์—ด ํŠน์ • ๋ฐฐ์—ด ์ˆ˜์ • ๋ถˆ๊ฐ€๋Šฅ) ๊ฐ„๊ณผํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ’€์–ด์„œ ์“ธ๋•Œ์—†๋Š” ๋ฐ ์‹œ๊ฐ„์„ ๋งŽ์ด ํ—ˆ๋น„ํ–ˆ๋Š”๋ฐ ๋‹ค์Œ์— ๋ฌธ์ž์—ด์„ ๋‹ค๋ฃฐ ๋•Œ ์ด ์ ๋„ ์ฃผ์˜ ํ•ด์•ผ๊ฒ ๋‹ค.