본문 바로가기

코딩테스트

[JAVA] 약수, 배수와 소수

5086 배수와 약수

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    while (true){
      StringTokenizer st =  new StringTokenizer(br.readLine(), " ");
      int a = Integer.parseInt(st.nextToken());
      int b = Integer.parseInt(st.nextToken());

      if (a==b && b==0) break;
      if (b%a==0) System.out.println("factor");
      else if (a%b==0) System.out.println("multiple");
      else System.out.println("neither");
    }
    br.close();
  }
}

 


2501 약수 구하기

브루트포스 알고리즘이란?

가능한 모든 경우의 수를 모두 탐색하면서 요구조건에 충족하는 결과만을 가져온다.

알고리즘 분류에 적혀있어서 그냥 단순무식하게 풀었다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    StringTokenizer st =  new StringTokenizer(br.readLine(), " ");
    int a = Integer.parseInt(st.nextToken());
    int b = Integer.parseInt(st.nextToken());

    int j=0;
    int[] n = new int[a];
    
    for (int i=1;i<=a;i++){
      if(a%i==0){
        n[j]=i;
        j++;
      }
    }

    if(n[b]==0) System.out.println(0);
    else System.out.println(n[b-1]);

    br.close();
  }
}

 


9506 약수들의 합

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    while(true){
      int a = Integer.parseInt(br.readLine());
      if (a == -1) break;

      int sum=0;
      int[] n = new int[a];
      int j=0;


      for (int i=1; i<a; i++){
        if (a%i==0){
          n[j++] = i;
          sum+=i;
        }
      }

      if(sum != a) {
        System.out.println(a + " is NOT perfect.");
        continue;
      }

      System.out.print(a + " = ");

      for (int i=0;i<a;i++){
        if(n[i+1]==0){
          System.out.print(n[i]);
          break;
        }
        else{
          System.out.print(n[i] + " + ");
        }
      }
      System.out.println();
    }

  }
}

코드는 문제대로 천천히 짜면 된다. 배열을 사용해서 순서대로 약수를 저장했다.

마지막 출력이 약간 어려웠음.

입력받은 수가 -1이면 break로 while문을 나가야 하는데 조건문을 배열 선언보다 뒤에 놔서 NegativeArraySize error가 나왔다;; 이거때문에 시간 낭비함.

 


1978 소수찾기

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {

  public static boolean is_true(int x){
    for (int i=2; i<x;i++){
      if (x%i==0) return false;
    }
    return true;
  }
  
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int n=0;
    int a = Integer.parseInt(br.readLine());
    StringTokenizer st = new StringTokenizer(br.readLine(), " ");

    for (int i=0;i<a;i++){
      int k = Integer.parseInt(st.nextToken());
      if (k==1) continue;
      if (is_true(k)) n++;
    }

    System.out.println(n);

  }
}

새로 메서드 is_true()를 선언해서 풀어주었다.

 


2581 소수

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {

  public static boolean is_true(int x){
    if (x==1) return false;
    for (int i=2; i<x;i++){
      if (x%i==0) return false;
    }
    return true;
  }
  
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int a = Integer.parseInt(br.readLine());
    int b = Integer.parseInt(br.readLine());
    int sum=0;
    int j=0;
    int[] arr = new int[b-a+1];

    for (int i=a;i<=b;i++){
      if (is_true(i)){
        sum+=i;
        arr[j++]=i;
      }
    }

    if (arr[0]!=0){
      System.out.println(sum);
      System.out.println(arr[0]);
    }
    else System.out.println(-1);

  }
}

전 메서드 반복

아마 이거말고 에라토스테의 체였나?? 그걸 쓰면 소수 더 빠르게 판별할 수 있는걸로 아는데

아마 뒤에 수가 커지면 시간 제한때문에 쓸거같아서 안썼다.

 


11653 소인수분해

 

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;
//import java.io.BufferedWriter;
//import java.io.OutputStreamWriter;


public class Main {

  public static void fac(int x){
    int d=2;
    while (d<=x){
      if (x%d==0){
        System.out.println(d);
        x = x/d;
      }
      else d = d+1;
    }
  }
  
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int a = Integer.parseInt(br.readLine());
    fac(a);

  }
}

소인수분해 할 X가 주어지면 X가 소수인 수(d)로 나누어 떨어질때마다 그 수를 출력한다.

어느 한 소수에서 다 나누어지면 d+1로 다음 나누어질 소수를 찾는다.

간단한 문제였다.


# 회고

 

처음으로 메서드를 이용해 문제를 풀었다.

멤버 접근 지정(public/private/protected/default),

static/non-static 설정과

return (void, boolean, int 등) 및 입력받을 인자를 사용해 메서드를 이용한다.

 

자바는 따로 클래스가 있는데, 메소드는 클래스의 기능 구현이라고 보면 된다. 만약 다른 클래스의 메소드를 활용하고 싶다면, 클래스 생성을 먼저 한 후 메소드를 호출해야 한다.

클래스는 코드의 구조, 기능들을 명세하는 것이고 메소드는 기능을 상세하게 기술하는 것이라 생각하자.

클래스의 구조에 따라 새로운 객체를 생성할 수 있고, 이를 인스턴스라 한다.

생성자는 객체가 생성될 때 초기화 목적으로 실행되는 메소드로, 객체가 생성되면 자동 호출된다. 클래스 이름과 동일함.

 

옛날에 배운 기억이 난다...

'코딩테스트' 카테고리의 다른 글

[JAVA] 시간 복잡도 단계  (0) 2024.01.24
[JAVA] 기하: 직사각형과 삼각형  (1) 2024.01.23
[JAVA] 일반 수학 1단계  (0) 2024.01.19
[JAVA] 2차원 배열  (0) 2024.01.18
[JAVA] 심화 1  (0) 2024.01.17