외... JS로 소프티어 푸는 사람 없는건대,,, 구글에 검색해도 잘 안나와서 넘 외롭다,,,
순열! 구하기!
const permutation = (arr, num) => {
// 길이가 1일때는 자기 자신이 담긴 리스트 반환
if(arr.length === 1) return [arr]
const res = []
arr.forEach((v, idx, arr) => {
// 현재 인덱스에 해당하는 원소를 제외, 나머지 원소로 이루어진 rest 배열 생성
const rest = [...arr.slice(0, idx), ...arr.slice(idx+1)]
// rest 배열의 조합 구하기
const permutations = permutation(rest , num-1)
// 현재 인덱스를 배열의 가장 앞쪽에 붙여주기
const attach = permutations.map((permutation) => [v, ...permutation])
// 완성된 순열은 res에 저장하기
res.push(...attach)
})
return res
}
문제
https://softeer.ai/practice/info.do?idx=1&eid=581
코드
const readline = require('readline')
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
})
let input = []
rl.on('line', (line) => {
input.push(line.split(' ').map(Number))
}).on('close', () => {
const permutation = (arr, num) => {
if(arr.length === 1) return [arr]
const res = []
arr.forEach((v, idx, arr) => {
const rest = [...arr.slice(0, idx), ...arr.slice(idx+1)]
const permutations = permutation(rest , num-1)
const attach = permutations.map((permutation) => [v, ...permutation])
res.push(...attach)
})
return res
}
const [N, M, K] = input[0]
let minV = Infinity
// 현재 레일로 만들 수 있는 모든 순열을 구하기
const permutations = permutation(input[1], N)
// 모든 경우를 순회
permutations.forEach((arr) => {
// 무게의 총 합
let sumV = 0
// 인덱스를 저장할 변수
let now = 0
// K번 일하기
for(let i = 0; i < K; i++) {
let bucket = 0
while(true) {
// 바구니에 담기
bucket += arr[now]
// 레일이 반복되므로 나머지 연산
now = (now + 1) % N
// 다음 레일의 상자를 담았을 때 M을 초과하면 break
if(bucket + arr[now] > M) break
}
// 택배 바구니의 무게 더해주기
sumV += bucket
}
// 최소한의 무게를 구하기
minV = Math.min(minV, sumV)
})
console.log(minV)
})
주어진 테스트케이스는 시간초과라고 나오지만 채점 해보면 맞았다고 해준다..!
중요한건 시간초과 나와도 걍 제출하는 마음,, 킼킼
댓글