나의 풀이
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
나의 풀이
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;
}
}
동생의 위치에서 자기의 위치를 뺀, 즉 간격만큼의 최대공약수를 찾으면 된다.
나의 풀이
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개씩 잘라서 계산해주면 됨
나의 풀이
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()을 사용하면 편하긴 하지만 전 문제도 그냥 풀어서 이번에도 그냥 풀어봄
나의 풀이
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 처럼 계산을 해주므로 몫을 올림 처리해주는 방법으로 사용
나의 풀이
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진수