개발👩‍💻/알고리즘

백준 js 6913: GCD 합

gigibean 2021. 5. 7. 21:33
728x90

문제

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

입력

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

출력

각 테스트 케이스마다 가능한 모든 쌍의 GCD의 합을 출력한다.

예제 입력 1

3

4 10 20 30 40

3 7 5 12

3 125 15 25

예제 출력 1

70

3

35

풀이

1번째 줄에 총 몇개의 테스트 케이스가 주어지는 지가 나와있고,

1번째 줄 제외 모든 줄 맨 앞에는 각 몇개의 수가 올지 나와있다.

그렇기 때문에 이 두 수를 제외한 모든 수의 쌍을 만들어서 그 쌍의 최대공약수를 구하면 된다.

예를 들면

두번 째 줄에 10, 20, 30, 40 에선

10, 20

10, 30,

10, 40

20, 30

20, 40

30, 40

로 총 6개의 쌍을 만들 수 있고, 각 쌍의 최대공약수들의 합을 출력하면 된다.

 

+ 이 문제에서 엄청 헤맸었는데, 

아무리 봐도 맞았고, 테스트 케이스도 다 맞다고 나오는데, 제출하면 계속 틀렸다고 나왔다..

결국 문제는 인풋값에 trim을 해줘야 했던 것이다..🤬

 

다른 js로 알고리즘 푼 사람들을 보면 trim()을 꼭 해주던데, 

그 전까지는 그 이유를 딱히 몰랐는데..

 

유클리드 호제법을 이용해서 GCD를 구할 수 있는 함수를 만들어준다.

const getGCD = (a, b) => {
	let r;
    while(b) {
    	r = a%b;
        a = b;
        b = r;
    }
    return a;
}

 

각 쌍을 구해 그 값의 최대공약수를 구하는 부분

/*
input = [
  [ '10', '20', '30', '40' ],
  [ '7', '5', '12' ],
  [ '125', '15', '25' ]
]
*/

// input loop
for (let i = 0; i < input.length; i++) {
	// input[i] loop: length - 1은 i와 i+1를 비교하기 때문
    for (let j = 0; j < input[i].length - 1; j++) {
    	for (let k = i + 1; k < input.[i].length; k++) {
        	eachResult += getGCD(+input[i][j],+input[i][k]);
        }
    }
    console.log(eachResult);
    eachResult = 0;
}

 

전체 코드

 

반응형