알고리즘-문제풀이
[boj] 9613. GCD 합
hy1as
2023. 3. 16. 11:56
[boj] 9613. GCD 합
- 문제 링크 : https://www.acmicpc.net/problem/9613
- 사용 언어 : Node.js
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 문으로 변경 뒤 통과 할 수 있었습니다.
왜 그렇게 되었는지는 아직 답을 찾지 못했네요....