알고리즘 기초 2/1 - 301

lejehwan·2022년 2월 13일
0

baekjoon

목록 보기
5/8

301 - 수학 1(연습)


GCD합 - 9613

나의 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int n = Integer.parseInt(br.readLine());
		for (int i = 0; i < n; i++) {
			long sum = 0;
			String[] input = br.readLine().split(" ");
			for (int j = 1; j < Integer.parseInt(input[0]); j++) {
				for (int k = j + 1; k < Integer.parseInt(input[0]) + 1; k++) {
					sum += GCD(Integer.parseInt(input[j]), Integer.parseInt(input[k]));
				}
			}
			sb.append(sum + "\n");
		}
		System.out.println(sb.toString());
	}

	public static int GCD(int x, int y) {
		while (y != 0) {
			int temp = x % y;
			x = y;
			y = temp;
		}
		return x;
	}

}

if(GCD.equals("최대공약수")) return true


숨바꼭질 6 - 17087

나의 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String[] input = br.readLine().split(" ");
		int n = Integer.parseInt(input[0]);
		int s = Integer.parseInt(input[1]);
		int[] brother = new int[n];
		input = br.readLine().split(" ");
		for (int i = 0; i < n; i++) {
			brother[i] = Math.abs(Integer.parseInt(input[i]) - s);
		}
		int answer = brother[0];
		for (int i = 1; i < brother.length; i++) {
			answer = GCD(answer, brother[i]);
		}
		System.out.println(answer);
	}

	public static int GCD(int x, int y) {
		int temp = 0;
		while (y != 0) {
			temp = x % y;
			x = y;
			y = temp;
		}
		return x;
	}

}

동생의 위치에서 자기의 위치를 뺀, 즉 간격만큼의 최대공약수를 찾으면 된다.


2진수 8진수 - 1373

나의 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class 진수2진수8 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		String[] input = br.readLine().split("");
		if (input.length % 3 == 1) {
			sb.append(input[0]);
		} else if (input.length % 3 == 2) {
			sb.append(Integer.parseInt(input[0]) * 2 + Integer.parseInt(input[1]));
		}
		for (int i = input.length % 3; i < input.length; i += 3) {
			sb.append(Integer.parseInt(input[i]) * 4 
					+ Integer.parseInt(input[i + 1]) * 2 
					+ Integer.parseInt(input[i + 2]));
		}
		System.out.println(sb.toString());
	}
}

8진수 -> 2진수는 뒤에서 부터 3개씩 잘라서 계산해주면 됨


8진수 2진수 - 1212

나의 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class 진수8진수2 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		String[] input = br.readLine().split("");
		String answer = "";
		if (input[0].equals("0") && input.length == 1) {
			answer = "0";
		}else {
			for (int i = 0; i < input.length; i++) {
				int temp = Integer.parseInt(input[i]);
				sb.append(temp / 4);
				if (temp >= 4) {
					temp -= 4;
				}
				sb.append(temp / 2);
				if (temp >= 2) {
					temp -= 2;
				}
				sb.append(temp / 1);
			}
			answer = sb.toString();
			if (answer.split("")[0].equals("0")) {
				answer = (String) answer.subSequence(1, answer.length());
			}
			if (answer.split("")[0].equals("0")) {
				answer = (String) answer.subSequence(1, answer.length());
			}
		}
		System.out.println(answer);
	}

}

각 숫자별로 Integer.toBianryString()을 사용하면 편하긴 하지만 전 문제도 그냥 풀어서 이번에도 그냥 풀어봄


-2진수 - 2089

나의 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class _2진수 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		int input = Integer.parseInt(br.readLine());
		if (input == 0) {
			sb.append(0);
		}else {
			while (input != 1) {
				sb.append(Math.abs(input % -2));
				input = (int) Math.ceil((double) input / -2);
			}
			sb.append(input);
		}
		System.out.println(sb.reverse());
	}
}

이 문제는 잘 몰라서 찾아봤는데, 나머지 값 계산 후에 올림처리를 해줘야 함. 나머지 값을 항상 양수로 계산 할 때, -3 = (2 * -2) + 1 처럼 계산을 해주므로 몫을 올림 처리해주는 방법으로 사용


골드바흐 파티션 - 17103

나의 풀이

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class 골드바흐파티션 {

	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		boolean[] check = new boolean[1000001];
		check[0] = check[1] = true;
		for (int j = 2; j <= Math.sqrt(1000000); j++) {
			if (!check[j]) {
				for (int k = 2; k * j <= 1000000; k++) {
					check[j * k] = true;
				}
			}
		}
		int n = Integer.parseInt(br.readLine());
		for (int i = 0; i < n; i++) {
			int m = Integer.parseInt(br.readLine());
			int cnt = 0;
			for (int j = 2; j <= m / 2; j++) {
				if (!check[j] && !check[m - j]) {
					cnt++;
				}
			}
			sb.append(cnt + "\n");
		}
		System.out.println(sb.toString());
	}
}

check 배열에 소수 판별 후 소수의 합이 일치하는 것들을 추출하면 됨.


수학 관련 문제는 풀이 방법을 생각해내는 사고가 어려움
ps. -2진수

profile
hello world:)

0개의 댓글