11. (알고리즘) 최대공약수 구하기(배열)

박은서's avatar
Dec 09, 2025
11. (알고리즘) 최대공약수 구하기(배열)

1. 6의 약수 구하기

package algo; /** * 6의 약수를 구하고, 8의 약수를 구해서 최대공약수 찾기 * (1) 비지니스 (6을 1~6까지 나눠서 떨어지는 약수 - 배열에 담기) * (2) (8을 1~8까지 나눠서 떨어지는 약수 - 배열에 담기) * (3) arr1 = [1,2,3,6] * (4) arr2 = [1,2,4,8] * (5) 두 배열을 비교해서 최대공약수 찾기 * 후보 1 -> 2 int result 담기 (후보 1을 2로 덮어씌움 -> 마지막 후보군이 최대공약수) */ public class Gcd01 { public static void main(String[] args) { int a = 6; int b = 8; int[] arr1 = new int[6]; // [1][2][3][0][0][6] int[] arr2 = new int[8]; if(a%1==0) arr1[0] = 1; if(a%2==0) arr1[1] = 2; if(a%3==0) arr1[2] = 3; if(a%4==0) arr1[3] = 4; if(a%5==0) arr1[4] = 5; if(a%6==0) arr1[5] = 6; } }
약수의 개수가 얼마인지 모르기 때문에 배열 크기를 6, 8로 임의 지정
3, 4번지에 0이 존재. 0을 없애려면 조건이 맞을 때만 arr1[]번지를 ++하도록 조건 추가하기
※ if 사용할 때 중괄호 안 내용이 한 줄이면 중괄호 입력하지 않고 한 줄로 적어도 됨

2. 배열 정리되게 if 수정

package algo; /** * 6의 약수를 구하고, 8의 약수를 구해서 최대공약수 찾기 * (1) 비지니스 (6을 1~6까지 나눠서 떨어지는 약수 - 배열에 담기) * (2) (8을 1~8까지 나눠서 떨어지는 약수 - 배열에 담기) * (3) arr1 = [1,2,3,6] * (4) arr2 = [1,2,4,8] * (5) 두 배열을 비교해서 최대공약수 찾기 * 후보 1 -> 2 int result 담기 (후보 1을 2로 덮어씌움 -> 마지막 후보군이 최대공약수) */ public class Gcd01 { public static void main(String[] args) { int a = 6; int b = 8; int[] arr1 = new int[6]; // [1][2][3][6][0][0] int[] arr2 = new int[8]; int n1 = 0; // 배열의 위치를 나타내는 번호값 = 인덱스 if(a%1==0) { arr1[n1] = 1; n1++; } if(a%2==0) { arr1[n1] = 2; n1++; } if(a%3==0) { arr1[n1] = 3; n1++; } if(a%4==0) { arr1[n1] = 4; n1++; } if(a%5==0) { arr1[n1] = 5; n1++; } if(a%6==0) { arr1[n1] = 6; n1++; } } }
n1++이 없으면 [1][2][3][0][0][6] 이런 식으로 배열 중간에 0이 들어감 → 그럼 불필요한 비교 횟수 늘어남

3. 8의 약수 구하기

package algo; /** * 6의 약수를 구하고, 8의 약수를 구해서 최대공약수 찾기 * (1) 비지니스 (6을 1~6까지 나눠서 떨어지는 약수 - 배열에 담기) * (2) (8을 1~8까지 나눠서 떨어지는 약수 - 배열에 담기) * (3) arr1 = [1,2,3,6] * (4) arr2 = [1,2,4,8] * (5) 두 배열을 비교해서 최대공약수 찾기 * 후보 1 -> 2 int result 담기 (후보 1을 2로 덮어씌움 -> 마지막 후보군이 최대공약수) */ public class Gcd01 { public static void main(String[] args) { int a = 6; int b = 8; int[] arr1 = new int[6]; // [1][2][3][6][0][0] int[] arr2 = new int[8]; // [1][2][4][8][0][0][0][0] // 1. 6의 약수 채우기 ================================================================ int n1 = 0; // 배열의 위치를 나타내는 번호값 = 인덱스 if (a % 1 == 0) { arr1[n1] = 1; n1++; } if (a % 2 == 0) { arr1[n1] = 2; n1++; } if (a % 3 == 0) { arr1[n1] = 3; n1++; } if (a % 4 == 0) { arr1[n1] = 4; n1++; } if (a % 5 == 0) { arr1[n1] = 5; n1++; } if (a % 6 == 0) { arr1[n1] = 6; n1++; } // 2. 8의 약수 채우기 ================================================================ int n2 = 0; if (b % 1 == 0) { arr2[n2] = 1; n2++; } if (b % 2 == 0) { arr2[n2] = 2; n2++; } if (b % 3 == 0) { arr2[n2] = 3; n2++; } if (b % 4 == 0) { arr2[n2] = 4; n2++; } if (b % 5 == 0) { arr2[n2] = 5; n2++; } if (b % 6 == 0) { arr2[n2] = 6; n2++; } if (b % 7 == 0) { arr2[n2] = 7; n2++; } if (b % 8 == 0) { arr2[n2] = 8; n2++; } } // end of main }

4. 6의 약수, 8의 약수 비교하기

1) 배열 비교 - 노가다 & 변수 정리

package algo; /** * 6의 약수를 구하고, 8의 약수를 구해서 최대공약수 찾기 * (1) 비지니스 (6을 1~6까지 나눠서 떨어지는 약수 - 배열에 담기) * (2) (8을 1~8까지 나눠서 떨어지는 약수 - 배열에 담기) * (3) arr1 = [1,2,3,6] * (4) arr2 = [1,2,4,8] * (5) 두 배열을 비교해서 최대공약수 찾기 * 후보 1 -> 2 int result 담기 (후보 1을 2로 덮어씌움 -> 마지막 후보군이 최대공약수) */ public class Gcd02 { public static void main(String[] args) { int a = 6; int b = 8; int[] arr1 = new int[6]; // [1][2][3][6][0][0] int[] arr2 = new int[8]; // [1][2][4][8][0][0][0][0] // 1. 6의 약수 채우기 ================================================================ int n1 = 0; // 배열의 위치를 나타내는 번호값 = 인덱스 if (a % 1 == 0) { arr1[n1] = 1; n1++; } if (a % 2 == 0) { arr1[n1] = 2; n1++; } if (a % 3 == 0) { arr1[n1] = 3; n1++; } if (a % 4 == 0) { arr1[n1] = 4; n1++; } if (a % 5 == 0) { arr1[n1] = 5; n1++; } if (a % 6 == 0) { arr1[n1] = 6; n1++; } // 2. 8의 약수 채우기 ================================================================ int n2 = 0; if (b % 1 == 0) { arr2[n2] = 1; n2++; } if (b % 2 == 0) { arr2[n2] = 2; n2++; } if (b % 3 == 0) { arr2[n2] = 3; n2++; } if (b % 4 == 0) { arr2[n2] = 4; n2++; } if (b % 5 == 0) { arr2[n2] = 5; n2++; } if (b % 6 == 0) { arr2[n2] = 6; n2++; } if (b % 7 == 0) { arr2[n2] = 7; n2++; } if (b % 8 == 0) { arr2[n2] = 8; n2++; } // 3. 최대공약수 구하기 ================================================== int result = 0; int c = 0; if(arr1[c] == arr2[0]) result = arr1[c]; if(arr1[c] == arr2[1]) result = arr1[c]; if(arr1[c] == arr2[2]) result = arr1[c]; if(arr1[c] == arr2[3]) result = arr1[c]; c++; if(arr1[c] == arr2[0]) result = arr1[c]; if(arr1[c] == arr2[1]) result = arr1[c]; if(arr1[c] == arr2[2]) result = arr1[c]; if(arr1[c] == arr2[3]) result = arr1[c]; c++; if(arr1[2] == arr2[0]) result = arr1[2]; if(arr1[2] == arr2[1]) result = arr1[2]; if(arr1[2] == arr2[2]) result = arr1[2]; if(arr1[2] == arr2[3]) result = arr1[2]; if(arr1[3] == arr2[0]) result = arr1[3]; if(arr1[3] == arr2[1]) result = arr1[3]; if(arr1[3] == arr2[2]) result = arr1[3]; if(arr1[3] == arr2[3]) result = arr1[3]; System.out.println("메인끝"); } // end of main }

2) 배열 비교 - for문 정리 1

package algo; /** * 6의 약수를 구하고, 8의 약수를 구해서 최대공약수 찾기 * (1) 비지니스 (6을 1~6까지 나눠서 떨어지는 약수 - 배열에 담기) * (2) (8을 1~8까지 나눠서 떨어지는 약수 - 배열에 담기) * (3) arr1 = [1,2,3,6] * (4) arr2 = [1,2,4,8] * (5) 두 배열을 비교해서 최대공약수 찾기 * 후보 1 -> 2 int result 담기 (후보 1을 2로 덮어씌움 -> 마지막 후보군이 최대공약수) */ public class Gcd03 { public static void main(String[] args) { int a = 6; int b = 8; int[] arr1 = new int[6]; // [1][2][3][6][0][0] int[] arr2 = new int[8]; // [1][2][4][8][0][0][0][0] // 1. 6의 약수 채우기 ================================================================ int n1 = 0; // 배열의 위치를 나타내는 번호값 = 인덱스 if (a % 1 == 0) { arr1[n1] = 1; n1++; } if (a % 2 == 0) { arr1[n1] = 2; n1++; } if (a % 3 == 0) { arr1[n1] = 3; n1++; } if (a % 4 == 0) { arr1[n1] = 4; n1++; } if (a % 5 == 0) { arr1[n1] = 5; n1++; } if (a % 6 == 0) { arr1[n1] = 6; n1++; } // 2. 8의 약수 채우기 ================================================================ int n2 = 0; if (b % 1 == 0) { arr2[n2] = 1; n2++; } if (b % 2 == 0) { arr2[n2] = 2; n2++; } if (b % 3 == 0) { arr2[n2] = 3; n2++; } if (b % 4 == 0) { arr2[n2] = 4; n2++; } if (b % 5 == 0) { arr2[n2] = 5; n2++; } if (b % 6 == 0) { arr2[n2] = 6; n2++; } if (b % 7 == 0) { arr2[n2] = 7; n2++; } if (b % 8 == 0) { arr2[n2] = 8; n2++; } // 3. 최대공약수 구하기 ================================================== int result = 0; int c = 0; for (int i = 0; i < 4; i++) { if(arr1[c] == arr2[0]) result = arr1[c]; if(arr1[c] == arr2[1]) result = arr1[c]; if(arr1[c] == arr2[2]) result = arr1[c]; if(arr1[c] == arr2[3]) result = arr1[c]; c++; } System.out.println("최대공약수 = " + result); System.out.println("메인끝"); } // end of main }

3) 배열 비교 - for문 정리 2

package algo; /** * 6의 약수를 구하고, 8의 약수를 구해서 최대공약수 찾기 * (1) 비지니스 (6을 1~6까지 나눠서 떨어지는 약수 - 배열에 담기) * (2) (8을 1~8까지 나눠서 떨어지는 약수 - 배열에 담기) * (3) arr1 = [1,2,3,6] * (4) arr2 = [1,2,4,8] * (5) 두 배열을 비교해서 최대공약수 찾기 * 후보 1 -> 2 int result 담기 (후보 1을 2로 덮어씌움 -> 마지막 후보군이 최대공약수) */ public class Gcd03 { public static void main(String[] args) { int a = 6; int b = 8; int[] arr1 = new int[6]; // [1][2][3][6][0][0] int[] arr2 = new int[8]; // [1][2][4][8][0][0][0][0] // 1. 6의 약수 채우기 ================================================================ int n1 = 0; // 배열의 위치를 나타내는 번호값 = 인덱스 if (a % 1 == 0) { arr1[n1] = 1; n1++; } if (a % 2 == 0) { arr1[n1] = 2; n1++; } if (a % 3 == 0) { arr1[n1] = 3; n1++; } if (a % 4 == 0) { arr1[n1] = 4; n1++; } if (a % 5 == 0) { arr1[n1] = 5; n1++; } if (a % 6 == 0) { arr1[n1] = 6; n1++; } // 2. 8의 약수 채우기 ================================================================ int n2 = 0; if (b % 1 == 0) { arr2[n2] = 1; n2++; } if (b % 2 == 0) { arr2[n2] = 2; n2++; } if (b % 3 == 0) { arr2[n2] = 3; n2++; } if (b % 4 == 0) { arr2[n2] = 4; n2++; } if (b % 5 == 0) { arr2[n2] = 5; n2++; } if (b % 6 == 0) { arr2[n2] = 6; n2++; } if (b % 7 == 0) { arr2[n2] = 7; n2++; } if (b % 8 == 0) { arr2[n2] = 8; n2++; } // 3. 최대공약수 구하기 ================================================== int result = 0; int c = 0; for (int i = 0; i < 4; i++) { int d = 0; for (int j = 0; j < 4; j++) { if(arr1[c] == arr2[d]) result = arr1[c]; d++; } c++; } System.out.println("최대공약수 = " + result); System.out.println("메인끝"); } // end of main }

5. 약수 구하기 for문 정리

1) 6의 약수, 8의 약수 각각 for문 정리

package algo; /** * 6의 약수를 구하고, 8의 약수를 구해서 최대공약수 찾기 * (1) 비지니스 (6을 1~6까지 나눠서 떨어지는 약수 - 배열에 담기) * (2) (8을 1~8까지 나눠서 떨어지는 약수 - 배열에 담기) * (3) arr1 = [1,2,3,6] * (4) arr2 = [1,2,4,8] * (5) 두 배열을 비교해서 최대공약수 찾기 * 후보 1 -> 2 int result 담기 (후보 1을 2로 덮어씌움 -> 마지막 후보군이 최대공약수) */ public class Gcd03 { public static void main(String[] args) { int a = 6; int b = 8; int[] arr1 = new int[6]; // [1][2][3][6][0][0] int[] arr2 = new int[8]; // [1][2][4][8][0][0][0][0] // 1. 6의 약수 채우기 ================================================================ int n1 = 0; // 배열의 위치를 나타내는 번호값 = 인덱스 int k1 = 1; for (int i = 0; i < a; i++) { if (a % k1 == 0) { arr1[n1] = k1; n1++; } k1++; } // 2. 8의 약수 채우기 ================================================================ int n2 = 0; int k2 = 1; for (int i = 0; i < b; i++) { if (b % k2 == 0) { arr2[n2] = k2; n2++; } k2++; } // 3. 최대공약수 구하기 ================================================== int result = 0; int c = 0; for (int i = 0; i < 4; i++) { int d = 0; for (int j = 0; j < 4; j++) { if(arr1[c] == arr2[d]) result = arr1[c]; d++; } c++; } System.out.println("최대공약수 = " + result); System.out.println("메인끝"); } // end of main }

2) 약수 구하기 2개 for문 → 하나로 합치기(함수)

함수 만들기 → return
package algo; /** * 6의 약수를 구하고, 8의 약수를 구해서 최대공약수 찾기 * (1) 비지니스 (6을 1~6까지 나눠서 떨어지는 약수 - 배열에 담기) * (2) (8을 1~8까지 나눠서 떨어지는 약수 - 배열에 담기) * (3) arr1 = [1,2,3,6] * (4) arr2 = [1,2,4,8] * (5) 두 배열을 비교해서 최대공약수 찾기 * 후보 1 -> 2 int result 담기 (후보 1을 2로 덮어씌움 -> 마지막 후보군이 최대공약수) */ public class Gcd04 { // 공급 (약수를 구할 숫자를 받아 그 숫자의 약수 배열을 리턴) static int[] 약수구하기(int a){ int[] arr1 = new int[a]; int n1 = 0; int k1 = 1; for (int i = 0; i < a; i++) { if (a % k1 == 0) { arr1[n1] = k1; n1++; } k1++; } return arr1; } public static void main(String[] args) { int a = 6; int b = 8; int[] arr1 = 약수구하기(6); // [1][2][3][6][0][0] 약수구하기는 함수의 호출문 int[] arr2 = 약수구하기(8); // [1][2][4][8][0][0][0][0] // 3. 최대공약수 구하기 ================================================== int result = 0; int c = 0; for (int i = 0; i < 4; i++) { int d = 0; for (int j = 0; j < 4; j++) { if(arr1[c] == arr2[d]) result = arr1[c]; d++; } c++; } System.out.println("최대공약수 = " + result); System.out.println("메인끝"); } // end of main }

3) 최대공약수 구하기 함수

package algo; /** * 6의 약수를 구하고, 8의 약수를 구해서 최대공약수 찾기 * (1) 비지니스 (6을 1~6까지 나눠서 떨어지는 약수 - 배열에 담기) * (2) (8을 1~8까지 나눠서 떨어지는 약수 - 배열에 담기) * (3) arr1 = [1,2,3,6] * (4) arr2 = [1,2,4,8] * (5) 두 배열을 비교해서 최대공약수 찾기 * 후보 1 -> 2 int result 담기 (후보 1을 2로 덮어씌움 -> 마지막 후보군이 최대공약수) */ public class Gcd04 { // 책임 : 약수를 구해서 리턴하기 // (함수는 책임을 하나만 가지는게 좋음. 2개 가지면 유지보수 어려움) // 공급 (약수를 구할 숫자를 받아 그 숫자의 약수 배열을 리턴) static int[] 약수구하기(int a){ int[] arr1 = new int[a]; int n1 = 0; int k1 = 1; for (int i = 0; i < a; i++) { if (a % k1 == 0) { arr1[n1] = k1; n1++; } k1++; } return arr1; } static int 최대공약수구하기(int[] arr1, int[] arr2){ int result = 0; int c = 0; for (int i = 0; i < 4; i++) { int d = 0; for (int j = 0; j < 4; j++) { if(arr1[c] == arr2[d]) result = arr1[c]; d++; } c++; } return result; } public static void main(String[] args) { // 1. 약수 구하기 int[] arr1 = 약수구하기(6); // [1][2][3][6][0][0] 약수구하기는 함수의 호출문 int[] arr2 = 약수구하기(8); // [1][2][4][8][0][0][0][0] // 2. 최대공약수 구하기 ================================================== int result = 최대공약수구하기(arr1, arr2); // 3. 결과 확인 System.out.println("최대공약수 : " + result); System.out.println("메인끝"); } // end of main }
notion image
Share article