• Home
  • About
    • Young's Github Pages photo

      一日不作一日不食

    • About
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

정보처리기사 실기 복습 02

18 May 2019

Reading time ~4 minutes

정보처리기사 실기 복습 02


반복문을 이용한 피보나치 수열

  • 1+1+2+3+5+8+13…의 순서로 나열되는 피보나치 수열
  • 입력받은 수의 항까지 합을 구하기
public class Test12 {
  
  public static void main(String[] args) {
        
    Scanner sc = new Scanner(System.in);
    
    int a=1, b=1, c=0;
    int sum = 2;
    
    int n = sc.nextInt();
    
    for(int i=3; i <= n; i++) {
      c = a + b;
      System.out.println(c);
      
      sum += c;
      
      a = b;
      b = c;
    }
    
    System.out.println(sum);
  }
}
  • 배열 A[99]에 2~100 사이의 정수를 기억시킨 후 이 배열을 이용하여 소수의 개수를 구하시오
    • 배열에 들어 있는 연속된 숫자의 소수 여부를 판별하기 위해서는 정수의 수열에서 처음 나온 소수의 배수들은 소수가 아니라는 원리를 이용
public class Test18 {
  
  public static void main(String[] args) {
        
    int[] A = new int[99];
    int cnt = 0;
    int m = 0;
    
    for (int i=2; i<99; i++) {
      A[i] = i;
    }
    
    for(int j=2; j<99; j++) {
      
      if (A[j] == 0) {
        continue;
      }
      
      cnt++;
      System.out.println("소수입니다 : "+j);
      m = j;
      
      while(true) {
        m += A[j]; // 소수의 배수의 인덱스
        
        if (m > 98) {
          break;
        }
        
        A[m] = 0; // 배수의 위치는 0으로 바꿔 체크를 안함
      }
    }
    
    System.out.println("소수의 개수 : " + cnt);
  }
}

최대공약수, 최소공배수

  • 두 수를 입력 받아 두 수의 최대공약수와 최소공배수를 계산해서 출력하시오
    • 최대공약수(GCD(Greatest Common Divisor) - 공통으로 가지고 있는 약수 중 가장 큰 수
    • 최소공배수LCM(Least Common multiple) - 두 수의 공통인 배수 중 가장 작은 수
    • 최대공약수와 최소공배수를 구할 두 수 중 큰 수와 작은 수를 정한 뒤 큰 수를 작은 수로 나누어 나머지를 구한다
    • 이 때 나머지가 0이면 그 때의 작은 수가 최대공약수이고, 원래의 두 수를 곱한 값을 최대공약수로 나눈 값이 최소공배수이다
    • 만약 큰 수를 작은 수로 나누었을 때 나머지각 0이 아니면, 그 때의 작은 수를 큰 수로 하고 나머지를 작은 수로 하여 나머지가 0이 될 때까지 반복
      • 이와 같이 큰 수를 작은 수로 나눠 나머지가 0이 될 떄까지 반복하여 최대공약수를 구하는 방법을 유클리드 호제법이라 함
public class Test19 {
  
  public static void main(String[] args) {
        
    Scanner sc = new Scanner(System.in);
    
    int num1 = sc.nextInt();
    int num2 = sc.nextInt();
    
    int big = 0, small = 0, gcd = 0, 
      lcm = 0, quotient = 0,  remainder = 0;
    
    if (num1 >= num2) {
      big = num1;
      small = num2;
    } else {
      big = num2;
      small = num1;
    }
    
    while(true) {
      quotient = big/small;
      remainder = big%small;
      
      if (remainder == 0) {
        gcd = small;
        lcm = num1*num2/gcd;
        
        System.out.println("최대 공약수 : "+gcd+", 최소  공배수 : "+lcm);
        break;
      }
      
      big = small;
      small = remainder;
    }
  }
}

약수 구하기

  • 정수를 입력 받아 약수를 구해 출력
  • 약수 - 어떤 수를 나누어 나머지가 없게 할 수 있는 수
public class Test20 {
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    
    int n = sc.nextInt();
    int remainder = 0;
    List<Integer> divisors = new ArrayList<Integer>();
    
    for(int i=1; i<=n; i++) {
      remainder = n%i;
      
      if (remainder == 0) {
        System.out.println("약수 : "+i);
        divisors.add(i);
      }
    }
    
    System.out.println(divisors);
  }
}

소인수 분해하기

  • 정수를 입력 받아 소인수를 구해 출력
  • 소인수 - 어떤 수를 구성하는 인수 중에서 소수인 것
    • 어떤 수의 약수중에서 소수인 녀석들만 가리켜서 소인수라 칭함
  • 소인수 분해 - 소수를 이용하여 그 수를 만드는 곱의 형태로 표현하는 것.
  • 어떤수 n을 소인수 분해하려면 n을 2부터 차례대로 n의 제곱근까지의 숫자로 나누어 떨어지는지 검사하면 됨
    • 제곱근까지의 수 중 n을 처음으로 나누어 떨어지게 하는 수가 있으면 그 수는 소수
      • n의 소인수가 됨
    • 소인수를 구했으면 그 때의 몫을 n로 하여 2부터 다시 n의 제곱근까지의 숫자로 나누는 작업을 반복
    • 만약 제수가 n의 제곱근보다 커지면 그때는 몫인 n자체가 그 수의 소인수가 된다
public class Test21 {
  public static void main(String[] args) {
        
    Scanner sc = new Scanner(System.in);
    
    // 정수 n을 입력받아 소인수 구해 출력
    int n = sc.nextInt();
    int sqrt = 0, quotient = 0, remainder = 0;
    int d = 2; // 제수
    
    // 소인수를 저장할 리스트
    List<Integer> prime = new ArrayList<Integer>();
    
    while(true) {
      
      sqrt = (int)Math.sqrt(n);
      
      while(true) {
        // 제수가 제곱근보다 커지면 피제수 자체가  입력받은 수의 소인수
        if (d > sqrt) {
          d = n;
          break;
        }
        
        quotient = n/d; // 몫
        remainder = n%d; // 나머지
        
        if (remainder == 0) {
          // 처음으로 나머지가 0이 되게 하는 수가  소인수
              break;
        } else {
          d++; // 제수를 2부터 제곱근(sqrt)까지  증가시킴
        }
      }
      
      System.out.println("소인수 : "+d);
      prime.add(d);
      
      if (n == d) {
        // 제수가 입력값과 같으면 소인수분해 과정이 모두  마친 것
        break;
      }
      
      // 소인수를 구했으면 그 때의 몫에 대해 다시 소인수를  구하기 위한 처리
      n = quotient;
    }
    
    System.out.println(prime); // 소인수 분해된 결과 출력
  }
}

진법변환 - 10진수를 2진수로 변환하기

  • 10진수를 입력 받아 2진수로 변환하시오
  • 10진수를 2진수로 변환하려면 10진수를 2로 나누어 나머지를 구한 후 저장,
    • 다시 몫을 2로 나누어 나머지를 구해 저장하는 과정을 반복.
    • 몫이 0이 될 때까지 이 작업을 반복
    • 마지막에 구한 나머지부터 거꾸로 출력.
public class Test22 {
  
  public static List<Integer> revserList(List<Integer>  reversed_binary) {
    Stack<Integer> binary_stack = new Stack<Integer>();
    List<Integer> binary_list = new ArrayList<Integer>();
    
    for (Integer i : reversed_binary) {
      binary_stack.push(i);
    }
    
    int size = binary_stack.size();
    for(int i=0; i<size; i++) {
      binary_list.add(binary_stack.pop());
    }
    
    return binary_list;
  }
  
  public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    
    int n = sc.nextInt();
    
    int quotient = 0, remainder = 0;
    List<Integer> reversed_binary = new ArrayList<Integer>();
    
    do {
      quotient = n/2;
      remainder = n%2;
      
      reversed_binary.add(remainder);
      n = quotient;
    } while(quotient != 0);
    
    reversed_binary = revserList(reversed_binary);
    System.out.println(reversed_binary);
  }
}


정보처리기사실기