알고리즘-문제풀이

[boj] 9613. GCD 합

hy1as 2023. 3. 16. 11:56

[boj] 9613. GCD 합

 

9613번: GCD 합

첫째 줄에 테스트 케이스의 개수 t (1 ≤ t ≤ 100)이 주어진다. 각 테스트 케이스는 한 줄로 이루어져 있다. 각 테스트 케이스는 수의 개수 n (1 < n ≤ 100)가 주어지고, 다음에는 n개의 수가 주어진

www.acmicpc.net

양의 정수 n개가 주어졌을 때, 가능한 모든 쌍의 GCD의 합을 구하는 프로그램을 작성하시오.

 

1. 문제 분석

이번 문제는 최대공약수를 구하는 함수를 구현할 수 있다면 쉽게 풀 수 있는 문제입니다.
큰 수를 작은수로 나머지 연산 해야한다는 것만 주의해 주세요!

 


 

2. 솔루션

const fs = require('fs')
const [N, ...cases] = fs.readFileSync(process.platform ===
                                      'linux' ? '/dev/stdin' : 'input.txt')
                        .toString().split('\n').map((input) => input.trim())

// 최대 공약수 (GCD)를 구하는 함수
function getGCD(a, b) {
    if (b === 0) return a
    return getGCD(b, a % b)
}
// 테스트 케이스 수
const countOfCases = +N
// 테스트 케이스 배열
const groupOfCases = cases.map(c => c.trim().split(' ').map(el => +el))
// 제출 배열
const answer = []

// 테스트 케이스 배열 순회
for (let caseIndex = 0; caseIndex < countOfCases; caseIndex++) {
    // 현재 테스트 케이스
    const c = groupOfCases[caseIndex]
    // 테스트 케이스 내 원소의 개수
    const countOfCaseElements = c[0]
    // 테스트 케이스 대상 원소
    const groupOfCaseElements = c.slice(1)
    // 최대공약수의 합
    let sumOfGCD = 0
    // 중복 없이 짝을 짓기 위해 내부 반복문 인덱스 초기화에 외부 반복문 인덱스 사용, 마지막 원소는 외부 반복문 순회에서 제외
    for (let i = 0; i < countOfCaseElements - 1; i++) {
        for (let j = i + 1; j < countOfCaseElements; j++) {
            sumOfGCD += getGCD(groupOfCaseElements[i], groupOfCaseElements[j])
        }
    }
    answer.push(sumOfGCD)
}

console.log(answer.join('\n'))

 


마치며

처음 테스트 케이스 배열을 순회할 때  for... of 반복문을 사용하였습니다.
로직에는 문제가 없는데 계속 실패하더군요;;
일반 for 문으로 변경 뒤 통과 할 수 있었습니다.
왜 그렇게 되었는지는 아직 답을 찾지 못했네요....