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

์ฝ”๋”ฉํ…Œ์ŠคํŠธ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[Javascript] ์–‘๊ถ๋Œ€ํšŒ (92342)

๋ฌธ์ œ๋งํฌ

 

์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์—ฐ์Šต - ์–‘๊ถ๋Œ€ํšŒ

๋ฌธ์ œ ์„ค๋ช… ์นด์นด์˜ค๋ฐฐ ์–‘๊ถ๋Œ€ํšŒ๊ฐ€ ์—ด๋ ธ์Šต๋‹ˆ๋‹ค. ๋ผ์ด์–ธ์€ ์ €๋ฒˆ ์นด์นด์˜ค๋ฐฐ ์–‘๊ถ๋Œ€ํšŒ ์šฐ์Šน์ž์ด๊ณ  ์ด๋ฒˆ ๋Œ€ํšŒ์—๋„ ๊ฒฐ์Šน์ „๊นŒ์ง€ ์˜ฌ๋ผ์™”์Šต๋‹ˆ๋‹ค. ๊ฒฐ์Šน์ „ ์ƒ๋Œ€๋Š” ์–ดํ”ผ์น˜์ž…๋‹ˆ๋‹ค. ์นด์นด์˜ค๋ฐฐ ์–‘๊ถ๋Œ€ํšŒ ์šด์˜์œ„์›

programmers.co.kr

 

๊ธฐ์–ตํ•ด์•ผํ•  ๋ถ€๋ถ„

์›๋ณธ ๋ฐฐ์—ด์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„  spread๋ฅผ ์ž˜ ์ด์šฉํ•˜์ž. (newArr = [...arr])

์žฌ๊ท€ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ์—ด์„ ๋ชจ๋‘ ์ˆœํšŒํ•˜๋ฉฐ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

sort๋ฅผ ์—ฌ๋Ÿฌ ๋ฐฉ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•.
   ๋ฐฐ์—ด์„ element๋ณ„๋กœ ๋น„๊ต๋ฅผ ํ•ด์ค˜์•ผํ•˜๊ณ , ๋’ค์—์„œ๋ถ€ํ„ฐ ๋ฐฐ์—ดํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์ตํž˜

 

// ๋ชฉํ‘œ : ๋ผ์ด์–ธ์ด ๊ฐ€์žฅ ํฐ ์ ์ˆ˜ ์ฐจ์ด๋กœ ์šฐ์Šนํ•  ๋•Œ ๋งž์ถ˜ ๊ณผ๋…์˜ ๋ฐฐ์—ด
        // ๋งŒ์•ฝ ๋ฌด์กฐ๊ฑด ์ง€๊ฑฐ๋‚˜ ๋น„๊ธฐ๋Š” ๊ฒฝ์šฐ๋Š” -1 return;
        // ์ด๊ธธ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ผ๋ฉด ๊ฐ€์žฅ ๋‚ฎ์€ ์ ์ˆ˜๋ฅผ ๋” ๋งŽ์ด ๋งžํžŒ ๊ฒฝ์šฐ๋ฅผ return (2๋ฐœ 3์ ๋ณด๋‹ค 1๋ฐœ 1์ , 1๋ฐœ 2์ ์ด ์šฐ์„ )

// ๊ฐ™์€ ๊ฐฏ์ˆ˜๋ฅผ ๋งž์ถ”๋ฉด ์–ดํ”ผ์น˜๊ฐ€ ๊ทธ ์ ์ˆ˜๋ฅผ ๊ฐ€์ ธ๊ฐ
// ๋‘˜๋‹ค ๋งž์ถ”์ง€ ๋ชปํ•˜๋ฉด ์•„๋ฌด๋„ ๊ทธ ์ ์ˆ˜๋ฅผ ๊ฐ€์ ธ๊ฐ€์ง€ ๋ชปํ•จ

// max๋ฅผ ์„ค์ •ํ•ด์„œ ๊ณ„์†ํ•ด์„œ max๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  max๊ฐ€ ๊ฐ™์„๋•Œ ์›์†Œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๋น„๊ตํ•˜๋ฉฐ ์ง„ํ–‰

let maxRyanResult = []

function solution(n, info) {
    var answer = [];
    let ryanInfo = new Array(info.length).fill(0);
    makeRyanInfo(n, ryanInfo, info, 0)
    answer = maxRyanResult.map(e => e[0])
    answer.sort((a,b) => sortLowScore(a,b));
    return answer.length === 0 ? [-1] : answer[0];
}

// ํ™”์‚ด ๋ฐฐ์—ด(info) ๊ตฌํ•˜๊ธฐ
const makeRyanInfo = (n, ryanInfo, apeachInfo, startElement) => {
    if(n === 0){
        const [ryanScore, apeachScore] = sumScore(ryanInfo, apeachInfo)
        let scoreGap = ryanApeachScoreGap(ryanScore, apeachScore);
        
        if(scoreGap > 0){
            if(maxRyanResult.length === 0) maxRyanResult.push([ryanInfo, scoreGap])
            else{
                if(maxRyanResult[0][1] < scoreGap){
                    maxRyanResult = [[ryanInfo, scoreGap]]
                }else if(maxRyanResult[0][1] === scoreGap){
                    maxRyanResult.push([ryanInfo, scoreGap])
                }
            }   
        }
        return;
    }
    
    for(let i = startElement; i<ryanInfo.length; i++){
        const newRyanInfo = [...ryanInfo];
        newRyanInfo[i] += 1;
        makeRyanInfo(n-1, newRyanInfo, apeachInfo, i)
    }
    return;

}

// ๋ผ์ด์–ธ๊ณผ ์–ดํ”ผ์น˜์˜ ๋ฐฐ์—ด์„ ๋ฐ›์•„์™€์„œ score์„ ๊ตฌํ•˜๊ณ  ๊ฐ๊ฐ์˜ score์„ ๋ฐ˜ํ™˜
const sumScore = (ryan, apeach) => {
  let ryanScore = 0;
  let apeachScore = 0;

  for (let i = 0; i < ryan.length; i++){
    if(ryan[i] > apeach[i]){
      ryanScore += (10-i);
    }else if(apeach[i] >= ryan[i] && apeach[i] !== 0){
      apeachScore += (10-i)
    }
  }
  
  return [ryanScore, apeachScore];
}

// ๋ผ์ด์–ธ score์™€ ์–ดํ”ผ์น˜ score์„ ๋น„๊ตํ•˜์—ฌ ์ฐจ์ด๋ฅผ ๋ฐ˜ํ™˜
const ryanApeachScoreGap = (ryanScore, apeachScore) => {
  return ryanScore - apeachScore;
}

// ๋ฐฐ์—ด์˜ ๋‚ฎ์€ ์ ์ˆ˜๊ฐ€ ๋งŽ์„์ˆœ์œผ๋กœ ์ •๋ ฌ
const sortLowScore = (a, b) => {
    for(let i = a.length-1; i >= 0; i--){
        if(a[i] === b[i]) continue;
        return b[i] - a[i]
    }
}