반응형
문제 출처
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
}
반응형
'알고리즘 문제 풀기' 카테고리의 다른 글
백준 2138 : 전구와 스위치 - javascript(그리디) (0) | 2024.10.31 |
---|---|
백준 17135 : 캐슬 디펜스 - javascript(완전탐색, dfs, 시뮬레이션) (0) | 2024.10.23 |
백준 1461 : 도서관 - javascript(그리디) (0) | 2024.10.17 |
백준 14500: 테트로미노 - javascript (완탐, dfs) (0) | 2024.10.15 |
백준 2589 : 보물섬 - javascript(bfs) (0) | 2024.10.14 |