3N + 1 수열 만들기

문제

  • 자연수 N에서 시작하여 N이 짝수면 2로 나누고, N이 홀수면 3을 곱하고 1을 더하는 것을 N이 1이 되기 전까지 계속 반복할때, 총 몇 번을 반복해야 1이 되는지를 계산. 단, 재귀함수 이용.

풀이

  • 점화식을 생각하자
  • f(n)의 정의
    • n에서 시작해서 1이 되기 위해 필요한 횟수
  • f(1) = 0
  • n이 짝수면, f(n) = f(n / 2) + 1
  • n이 홀수면, f(n) = f(n * 3 + 1) + 1
import java.util.Scanner;
 
public class Main {    
    // a가 3n + 1 수열을 총 몇번 반복해야 1이 되는지 반환합니다.
    public static int countNumber(int a) {
        if(a == 1)
            return 0;
    
        if(a % 2 == 0)
            return countNumber(a / 2) + 1;
        else
            return countNumber(3 * a + 1) + 1;
    }
 
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // 변수 선언 및 입력:
        int n = sc.nextInt();
 
        System.out.print(countNumber(n));
    }
}
 

풀이2

  • 재귀 답지 못한 재귀랄까?
import java.util.*;
import java.io.*;
public class Main {
    static int n,cnt;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
 
        recur(n);
 
        System.out.print(cnt);
    }
 
    static void recur(int num){
        if(num == 1) return;
        if(num%2==0) {
            num /= 2;
            cnt++;
        }
        else{
            num = num * 3 + 1;
            cnt++;
        }
 
        recur(num);
 
    }
}

100으로 나눈 나머지의 수열

문제

  • 첫 번째는 2, 두 번째는 4, 세 번째부터는 앞의 두 수의 곱을 100으로 나눈 나머지로 이루어진 수열이 있을때, 100 이하의 정수 N을 입력받아 재귀함수를 이용하여 N번째 값을 구하여 출력 코멘트
  • 재귀 감 잡기 좋았다 풀이
  • 문제를 쪼개서 위임하기
import java.util.*;
import java.io.*;
public class Main {
    static int n;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
 
        System.out.println(recur(n));
    }
 
    static int recur(int cnt){
        if(cnt==2) return 4;
        if(cnt==1) return 2;
 
        return (recur(cnt-1) * recur(cnt-2)) % 100;
    }
}

자연수 배열의 최소공배수

문제

  • n개의 수가 주어졌을때 이 수들의 최소공배수는? 풀이
  • 틀렸던 이유 int lcm = 0; 으로 초기화 하면, n이 1로 입력될때, 0을 출력하게됨. 원소 개수 1개이므로 첫번째 원소로 초기화 해야 함.
import java.util.*;
import java.io.*;
 
public class Main {
    static int n, arr[];
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        n = Integer.parseInt(br.readLine());
        arr = new int[n];
 
        StringTokenizer st = new StringTokenizer(br.readLine());
        for (int i = 0; i < n; i++){
            arr[i] = Integer.parseInt(st.nextToken());
        }
 
        int lcm = arr[0];
        for(int i = 1; i < n ; i++){
            lcm = arr[i-1] * arr[i] / gcd(arr[i-1],arr[i]);
            arr[i] = lcm;
        }
 
        System.out.print(lcm);
 
    }
 
    static int gcd(int a, int b){
        if(b==0) return a;
        return gcd(b,a%b);
    }
}