개발자 톡

연습문제 톡 [HSAT 4회 정기 코딩 인증평가 기출] 슈퍼컴퓨터 클러스터

JS

등록일
2024-11-12 11:20:15
조회수
34
작성자
vavoya6324

이번 문제는 수학적 방법을 통해 중복 연산을 없애고, 실패 지점을 기록하는 방법으로 설계했습니다


증가된 성능들이

a b c d e 로 존재한다면

비용은 a^2 + b^2 + ...이 됩니다.

그럼 여기서 1을 증가시킨다면

(a+1)^2 + ... 이 되고, 이 식을 전개시키면

a^2 + b^2 +... +2(a+b+c+...) + 1*n 이 됩니다.

문자로 치환해보자면

(이전 비용) + 2 * (전체 성능 향상 값 합) + (성능 향상된 컴퓨터 개수)

이것을 기반으로 설계하고 코딩했습니다.



// 입력처리
const fs = require('fs')
const input = fs.readFileSync('input.txt', 'utf8')
    .trim()
    .split(/\n+/)
const [computerNum, budget] = input[0].split(' ').map(BigInt)
const clusterObj = {}
const cluster = input[1].split(' ').map(Number).sort((a, b) => a - b)
cluster.forEach(performance => {
    if (clusterObj[performance] >= 1) {
        clusterObj[performance]++
    }
    else {
        clusterObj[performance] = 1
    }
})
const clusterObjKeys = Object.keys(clusterObj)


// 목표 최소 성능
let targetPerformance = 0
// 최소 성능 비용
let cost = 0
let enhancedComputerCount = 0
let sumOfEnhancedPerformances = 0


/*
a b c d e
(a+1) b+1 c+1
a^2 + b^2 + c^2.... +2(a+b+c+d...) + n
기존 비용 합 + 2(추가된 성능 합) + 관련 컴퓨터 개수
+ 1*m (성능 향상에 추가된 컴퓨터 개수
 */
function updateCost(m) {
    // 새로운 비용
    const newCost = cost + 2 * sumOfEnhancedPerformances + enhancedComputerCount + m
    // 새로 추가된 컴퓨터 개수
    enhancedComputerCount += m
    // 선택된 컴퓨터의 성능이 1씩 추가로 증가
    sumOfEnhancedPerformances += enhancedComputerCount
    // 업데이트 된 비용이 허용 범위 이내
    if (newCost <= budget) {
        // 비용 업데이트
        cost = newCost
        // 최소 성능 올리기
        targetPerformance++
        // 성공 반환
        return true
    }
    // 비용이 초과
    else {
        // 실패 반환
        return false


    }
}




for (let i = 0; i < clusterObjKeys.length; i++) {
    // 현재 성능
    const currentPerformance = clusterObjKeys[i]
    let extraCount = clusterObj[currentPerformance]
    // 다음 성능
    const nextPerformance = clusterObjKeys[i + 1]

    // 초기 설정
    // 주어진 성능 중 제일 적은 성능에서 + 1 한 것을 최소 성능으로 목표로 초기 설정
    targetPerformance = Number(currentPerformance) + 1

    // 다음 퍼포먼스로 넘어가지않고 계속 기존 컴퓨터 성능 + 1 씩 증가
    // 배열의 마지막인 경우에는 예산 초과할때까지 반복
    while (nextPerformance === undefined || targetPerformance <= nextPerformance) {
        // 추가되는 숫자 넣기
        const isSuccess = updateCost(extraCount)
        // 예산 초과!
        if (!isSuccess) {
            console.log(targetPerformance - 1)
            return true
        }
        // 그리고 지우기
        extraCount = 0
    }
}

/*
흠..
(a + b) ^ 2 를 이용하면 방법이 있다!
(a + b) ^ 2 = a^2 + 2ab + b^2
(c + b) ^ 2 = c^2 + 2cb + b^2
두 컴퓨터에 b만큼 새로 다시 성능을 올린다면 기존 비용에서의 얼만큼?
(a^2 + c^2) 기존 비용
2b^2 + 2b(a+c)는 새로 추가되는 비용
그렇다면 성능을 추가할때, 배열이 아니라. 추가한 성능들의 함(a+c === sum)를 기록해두는게 중요
그리고 nb^2 + nb(sum)를 해주면 됨
그리고 sum은 n*b를 더해주면됨. 단순히 추가


시뮬은, 단순히 최소 성능에서 + 1 하는걸 단계적으로


let sum = 0, 기본
제일 작은 값에 + 1을 한것을 현 스탭의 최소 성능으로 설정
연산시작
+1로 최소성능에 도달하는 m개의 컴퓨터.
m
b=1 (성능 추가 증가)
sum === a + c + b * m === 0 (여기서 a,c의 개수는 기존에 성능을 늘렸던 컴퓨터들, b * m에서 m은 처음으로 성능 증가가 된 컴퓨터들의 개수, b === 1은 성능 증가 폭
money. 현재까지의 비용


기존에는 n 만큼 성능을 증가했었고, 다음 + 1(b) 최소 성능에는 m개의 추가 컴퓨터가 들어가짐
전개된 식에 의하면
기존 비용(mb^2 money^2) + 새 비용((n+m)b^2 + (n+m)(sum 전체 증가된 성능 합))
초기에는 n은 0, 연산한번되면 n=m으로 계승되고, m은 다시 배열 탐색하며 검사.

 */
#[HSAT_4회_정기_코딩_인증평가_기출]_슈퍼컴퓨터_클러스터
#js
#풀이

이 카테고리의 톡 더보기