목록Study/Problem Solving (163)
전공공부

설명 문제를 분석해보면 순차적으로 상승하는 수열을 사용하는 것을 이해 할 수 있다. 1,2,3,2,1 이런식으로... 만일 이를 등차수열을 떠올리면 힌트를 어느정도 가져간 것이다. 기존 등차 수열은 1,2,3,4,5,6 이렇게 상승하니 뒤에 5 4 3 2 1의 경우를 덧붙이면 되는데 이때, 길이는 2n - 1이 된다. 앞의 6개와 n개 전의 바로 -1 값을 더한 것. 이를 합친 합은 n(n + 1) / 2 으로 쓰는 공식을 사용하자. 이를 1~5 * 2 수열로 보고 진행하면 5* 6 = n (n - 1) 이 되고. 이때 n은 6 이때 n인 경우를 하나 더 더하면 제곱 = n^2이 된다. 그러면 우리 식에서는 diff 가 즉, n^2이 되는 합이 되고... 이때 바로 제곱으로 떨어지면 그때의 2n - 1 ..
설명 계속 시간 초과가 나길래 prime을 항상 범위의 수를 탐색 할 때 마다 구하고 있었다 처음에는... 상당히 버거운 코드 였고 이를 개선하여 1차적으로 prime 배열을 두고 항상 사용하였고 이후에는 Long 범위가 넘어 갈 때 대처가 잘 안 되어서 while문 내부에서 오버플로가 나길래 num > Long.MAX_VALUE / (i -> 소수 값) 을 넣어서 구할 수 있었다. 코드 package Math; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; import java.util.StringTokenizer; public class BOJ_1..
설명 GCD(A,B) = GCD(a,b) * GCD(a1,b1) * ...을 이용한 것인데 간과하고 풀었던 것이... GCD 한 번 해준 이후로는 거쳐간 수를 다시 나누어진 GCD의 값으로 업데이트를 시켜줘야 했는데 그렇지 않고 풀어서 다음번 GCD를 돌때 다시 큰 값으로 올라가서 이상한 숫자가 나오게 되었다. 즉, GCD(A,B) = GCD(a,b) * GCD(a, 또 다른 수) *... 이런 형태가 되었던 것 코드 package Math; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; impo..
설명 N 부터 이하의 숫자중 소수 먼저 뽑아서 리스트에 넣고 상근수 만드는 구현 함수를 통해서 돌리고 1이 되면 그때의 상근수를 출력 그리고, 반복적인 숫자가 상근수 만드는 과정에서 나오면 이것은 반복해서 끝나지 않기 때문에 Map으로 중간 돌아가는 과정의 수를 저장하면서 상근수인지 판단 코드 package Math; import java.util.*; public class BOJ_9421 { static Map map; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int N = sc.nextInt(); List list = getPrime(N); makeNum(list); } private static vo..

설명 순서를 지켜나가면서 생각하면 쉬운 문제다. 1. 우리는 먼저 기약 분수의 형태로 나누어 볼 것이다. 이때, 기약 분수처럼 나누려면 x, y 값이 예를 들어서 4, 8이 들어오면 1, 2 로 기약 분수처럼 끝까지 나눌 수 있고 이 형태 자체는 최대 공약수를 나누었을때 나오는 값이다. 2. 이때, x , y 값의 사각형의 크기 및 대각선의 형태 반복은 1,2의 사각형이 총 4 * 4개의 형태로 이루어진다. 즉, 아래 그림처럼 나올 것인데 이는 또한, 1,1 정사각형의 대각선의 길이를 구하기 위해서 진행된 것이므로 여기서 중간 라인이 지나가는 것을 이렇게 볼 수 있을 것이다. 중간에 1,1 정사각형은 이해를 위해서 넣었다. 결국 이렇게 지나가는 선이 거치는 사각형의 갯수를 카운팅하기 위한 것인데 잘 보면..
설명 2*5 인 경우를 배제하고 모든 1,2,3,4 등의 곱하기의 수를 구하기 위해서 식을 구현한다고 생각하고 문제를 풀면된다. 다만 1,2,3,4와 같이 2*5가 아닌 경우의 숫자들만 곱해도 Long의 범위를 훌쩍 넘어버리니 아래와 같이 최소한 큰 모듈러 수로 나머지를 사용하는 방식으로 진행했다. 만일 모듈러 연산자의 크기가 작다면 앞의 숫자들이 누락이 되어서 마지막 수가 달라 질 수 있는 가능성을 최소화하기 위해서 아래와 같이 모듈러 숫자를 크게 잡았다. 코드 import java.util.Scanner; public class BOJ_2553 { public static void main(String[] args) throws Exception{ Scanner sc = new Scanner(Syst..
설명 홀수가 최대한 나올 수 있도록 유도하는게 목표이고 3개의 선택지가 있어서 굳이 조합을 사용하지 않았다. 코드 package Math; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Scanner; public class BOJ_21312 { public static void main(String[] args) throws Exception{ Scanner sc = new Scanner(System.in); int arr[] = new int[3]; for (int i = 0; i < 3; i++){ arr[i] = sc.nextInt(); } List list = new ..
설명 처음에 모듈화를 하지 않고 줄줄 풀었더니 계속 어딘가에서 예외 상황이 발생해서 틀렸습니다를 반복해서 볼 수 있었던 코드다. 사실 세부 내용 자체는 어렵지 않다 에리토스테네스의 체를 활용해서 소수 구하고 그것을 더하고 또는 곱한 것을 이용해서 값을 찾는것을 반복하는 것인데 세부 모듈화를 하지 않으면 에러를 찾기 힘들것 같다. 그리고, 해당 100_000 이 부분은 최대 K 값이 될 수 있는 부분을 참고한 것으로 K는 최대 10^5승 까지 가능하다. 그래서, 소수의 곱을 (99991*99991= 9998200081)이런식으로 들어 왔을때, (9998200081 > 2147483647) int 범위를 넘칠 경우를 대비해서 사용했다. 코드 package Math; import java.io.Buffered..