본문 바로가기
  • 살짝 구운 김 유나
Algorithm/Softeer

[Lv.3] 택배 마스터 광우 - JavaScript (근데 이제 Permutation을 곁들인..)

by yunae 2023. 6. 2.

외... 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 

 

Softeer

연습문제를 담을 Set을 선택해주세요. 취소 확인

softeer.ai

 

코드

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)
})

 

주어진 테스트케이스는 시간초과라고 나오지만 채점 해보면 맞았다고 해준다..! 

중요한건 시간초과 나와도 걍 제출하는 마음,, 킼킼 

 

 

 

싸피 끝! 이별은 언제나 어려워요ㅜㅜ 겨울에 서울에서 다같이 방어 먹기,,,약속해

 

댓글