알고리즘 문제 풀기

백준 17281 : 야구 - javascript(완전탐색)

Fo_rdang 2024. 10. 29. 11:27
반응형

문제 출처 

https://www.acmicpc.net/problem/17281

 

정답 풀이 

 

- 순열 함수로 타순을 정한다. 

- 정한 타순으로 모든 이닝을 거친 후의 점수를 구한다. 

- 각 점수중 최댓값을 출력한다. 

 

정답 코드 

//9명 
//총 N이닝 
//한 이닝에 3아웃 발생 => 종료 
//타순 정함 (변경 x)
//이닝 안끝났으면 다시 1번 타자 
//이닝이 변경되도 이어서 타순 
//이닝 시작할 때 주자 x 

//타순 정할 것 
//1번 선수를 4번 타자로 미리 결정함 
//return 가장 많은 득점

let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n'); 
const n = Number(input.shift()) 
const scores = input.map(el => el.split(' ').map(v => +v)); 

//순열로 순서 정하고 
//0번 박고 
//게임 함수 

const players = [1,2,3,4,5,6,7,8]
const permutations = getPermutation(players, 8)

let max = 0 ; 
permutations.forEach((permutation) => {
    const battingOrder = [...permutation.slice(0,3),0,...permutation.slice(3)]
    let order = 0; 
    let totalScore = 0
    
    for(let i=0; i<n; i++){
       const [score, lastOrder] = inning(scores[i], battingOrder, order)
       order = lastOrder
       totalScore += score; 
    }
    max = Math.max(max, totalScore)
  })
console.log(max)

//점수, 배팅 순서, idx 시작 순서 
function inning(scores, battingOrder, order){
    let idx = order
    let score = 0; 
    let out = 0; 
    let bases = [0,0,0]
    
    while(out < 3){
        const player = battingOrder[idx]
        const result = scores[player]
        
        if(result === 0){
            out++; 
        }else{
            for(let i=2; i>=0; i--){
                if(bases[i]){
                    if(i + result >= 3){
                        score++; 
                    }else{
                        bases[i+result] = 1
                    }
                    bases[i] = 0; 
                }
            }
            if(result === 4){
                score++; 
            }else{
                bases[result-1] = 1
            }
        }
        idx = (idx+1)%9 
    }
    
    return [score, idx]
}

function getPermutation(arr, selectNum){
    if(selectNum === 1) return arr.map(v => [v]); 
    let results = []; 
    
    arr.forEach((fixed, idx, origin) => {
        const rest = [...origin.slice(0,idx), ...origin.slice(idx+1)]
        const permutations = getPermutation(rest, selectNum-1) 
        const attached = permutations.map(permu => [fixed, ...permu])
        results.push(...attached)
    })
    return results
}
반응형