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

๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/Programmers

[Javascript/PGS] Lv.2 : ์กฐ์ด์Šคํ‹ฑ (Greedy) ๐ŸŽฎ๐Ÿ”ฅ

728x90
๋ฐ˜์‘ํ˜•

 

https://school.programmers.co.kr/learn/courses/30/lessons/42860?language=javascript#

 

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

SW๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ํ‰๊ฐ€, ๊ต์œก, ์ฑ„์šฉ๊นŒ์ง€ Total Solution์„ ์ œ๊ณตํ•˜๋Š” ๊ฐœ๋ฐœ์ž ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฒ ์ด์Šค์บ ํ”„

programmers.co.kr


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

๊ทผ๋ฐ ๊ฝค ์–ด๋ ค์› ๋‹ค ใ… ใ…  ๊ผญ ํƒ์š•๋ฒ•์œผ๋กœ ํ’€์ง€ ์•Š์•„๋„ ๋˜๋Š” ๊ฒƒ ๊ฐ™์•˜๋‹ค

์ด์ •๋„ ๋‚œ์ด๋„๋ฉด ๋ ˆ๋ฒจ3 ์•„๋‹ˆ๋ƒ๊ณ ,,

1. ์ฒซ๋ฒˆ์งธ ํ’€์ด : 74.1์  ๐Ÿ˜ต

๋ฐ˜๋ก€ : "BBBBAAAAAAB"

๊ธฐ๋Œ“๊ฐ’ 10, ๊ฒฐ๊ณผ๊ฐ’ 12

 

function solution(Name) {
    let name = Name.split('');
    let answer = 0;
    console.log('A'.charCodeAt(),'Z'.charCodeAt()); // 65~90
    // abcdefghijklm-n(13)-opqrstuvwxyz
    let n = 0;
    let i = 0;
    let cnt = 0; // A์˜ ๊ฐฏ์ˆ˜
    for(let k=0; k<name.length; ++k){
        if(name[k]=='A') cnt++;
    }
    if(cnt===name.length) return 0;
    while(1){
        console.log(i, name[i] ,answer)
        n = String(name[i]).charCodeAt();
        if(n!==65) cnt++;
        if((n-65)>13){
            answer += (90-n+1);
        }
        else answer += (n-65);
        name.splice(i,1,'A')
        if(cnt == name.length) break;
        
        // ์•ž์ชฝ์œผ๋กœ ๊ฐ€์•ผํ•˜๋Š” ์ˆ˜, ๋’ค์ชฝ์œผ๋กœ ๊ฐ€์•ผํ•˜๋Š” ์ˆ˜ ๋น„๊ต (A์˜ ๊ฐœ์ˆ˜)
        let front=1; let back=1;
        let j = i+1;
        while(1){
            if(j>name.length-1) j = 0;
            if(name[j]=='A') front++;
            else break;
            j++;
        }
        let k = i-1;
        while(1){
            if(k<0) k = name.length-1;
            if(name[k]=='A') back++;
            else break;
            k--;
        }
        console.log("front", front, "back" ,back)
        if(front > back) {
            i = k;
            answer += back;
        }
        else {
            i = j;
            answer += front;
        }
    }
    
    return answer;
}

 


2. ๋‘๋ฒˆ์งธ ํ’€์ด : ์ •๋‹ต โœ…

์•ŒํŒŒ๋ฒณ ๋ณ€๊ฒฝ ํšŸ์ˆ˜ ์นด์šดํŠธ๋Š” ์‰ฌ์› ๋Š”๋ฐ, ์ด๋™ํšŸ์ˆ˜ min ๊ฐฑ์‹ ์ด ์–ด๋ ค์› ๋‹ค!!!

 

<์ฃผ์š” ์ฝ”๋“œ>
        let rightFirst = j * 2 + (name.length - nextIdx);
        let leftFirst = (name.length - nextIdx) * 2 + j;
        minMove = Math.min(minMove, rightFirst, leftFirst);

 

์œ„ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ํ’€์ดํ•ด๋ณด๋ฉด, ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

์˜ˆ์‹œ ) "BBBBAAAAAAB"

 

1๏ธโƒฃ ์ธ๋ฑ์Šค 0๋ถ€ํ„ฐ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ”๋‹ค๊ฐ€ ๋˜๋Œ์•„์™€์„œ ๋’ค๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ (rightFirst)

-> 0์„ ๊ธฐ์ค€์œผ๋กœ, right - left ์™•๋ณต ํ›„ ๋’ค๋กœ ๋„˜์–ด๊ฐ€์„œ ๋๋ถ€๋ถ„ 9๋กœ ๊ฐ

• j = 3 (์—ฌ๊ธฐ๊นŒ์ง€ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€์•ผ ํ•จ)

• nextIdx = 9 (๋‹ค์Œ B๊ฐ€ ์žˆ๋Š” ์œ„์น˜)

• ๊ณ„์‚ฐ: 3 * 2 + (10 - 9) = 6 + 1 = 7

 

2๏ธโƒฃ ์ธ๋ฑ์Šค 0์—์„œ ์™ผ์ชฝ(๋’ค)์œผ๋กœ ๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ ๋Œ์•„์™€์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ (leftFirst)

-> 0์„ ๊ธฐ์ค€์œผ๋กœ, 9๋ฒˆ์งธ ์ธ๋ฑ์Šค๋กœ ๊ฐ”๋‹ค๊ฐ€ ๋‹ค์‹œ 0์œผ๋กœ ๋Œ์•„์™€์„œ(์™•๋ณต) ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ

• nextIdx = 9 (๋‹ค์Œ B๊ฐ€ ์žˆ๋Š” ์œ„์น˜)

• name.length - nextIdx = 10 - 9 = 1

• ๊ณ„์‚ฐ: (1 * 2) + 3 = 2 + 3 = 5

 

์ฆ‰, ๊ณฑํ•˜๊ธฐ 2๋ฅผ ํ•ด์ฃผ๋Š”๊ฑด ์™•๋ณต์šด๋™์ด๊ธฐ ๋•Œ๋ฌธ!

 

๋‚˜์˜ ํ’€์ด

function solution(name) {
    let answer = 0;
    console.log('A'.charCodeAt(),'Z'.charCodeAt()); // 65~90
    // abcdefghijklm-n(13)-opqrstuvwxyz
    let n = 0;
    let i = 0;
    let cnt = 0; // A๊ฐ€ ์•„๋‹Œ ๊ฐ’์˜ ๊ฐœ์ˆ˜
    // 1. ์•ŒํŒŒ๋ฒณ ์ด ๋ณ€๊ฒฝ ํšŸ์ˆ˜
    for(let k=0; k<name.length; ++k){
        if(name[k]!=='A'){
            answer += Math.min(name[k].charCodeAt()-65, 
                        90-name[k].charCodeAt()+1);
            cnt++;
            min = k;
        }
    }
    if(cnt===0) return 0;
    
    // 2. ์ตœ์ˆ˜ ์ด๋™ ํšŸ์ˆ˜
    let minMove = name.length - 1;
    for (let j = 0; j < name.length; j++) {
        let nextIdx = j + 1;
        while (nextIdx < name.length && name[nextIdx] === 'A') {
            nextIdx++;
        }
        let rightFirst = j * 2 + (name.length - nextIdx);
        let leftFirst = (name.length - nextIdx) * 2 + j;
        minMove = Math.min(minMove, rightFirst, leftFirst);
    }
    answer += minMove;
    return answer;
}

 

728x90
๋ฐ˜์‘ํ˜•