inblog logo
|
DailyCoding
    Practice

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

    박은서's avatar
    박은서
    Dec 09, 2025
    11. (알고리즘) 최대공약수 구하기(배열)
    Contents
    1. 6의 약수 구하기2. 배열 정리되게 if 수정3. 8의 약수 구하기4. 6의 약수, 8의 약수 비교하기5. 약수 구하기 for문 정리

    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
    Contents
    1. 6의 약수 구하기2. 배열 정리되게 if 수정3. 8의 약수 구하기4. 6의 약수, 8의 약수 비교하기5. 약수 구하기 for문 정리

    DailyCoding

    RSS·Powered by Inblog