반응형

java 94

[Java] 백준알고리즘 #17103 골드바흐 파티션

어떤 짝수 n 을 두 소수의 합으로 나타낼 수 있는데, 이 두 소수의 순서쌍의 개수를 구하는 문제이다. 앞서 사용했었던 유클리드호제법을 이용해 소수를 도출해서 계산했더니 시간 초과 에러가 나왔다. 때문에 이번에는 에라토스테네스의 체를 이용해 소수를 도출해보았다. 2020.12.08 - [Java/백준알고리즘] - 백준알고리즘 #1929 소수 구하기 java (에라토스테네스의 체) 백준알고리즘 #1929 소수 구하기 java (에라토스테네스의 체) 보기에 간단해 보이는 문제이다. sosu()메소드를 만들어서 m부터 n까지의 소수를 차례대로 구하는 코드를 작성했으나 시간 초과로 실패 이러한 시간 초과 문제를 해결하기 위해서는 에라토스테네 sehyeok.tistory.com 보다 최적화된 에라토스테네스의 체 ..

[Java] 백준알고리즘 #13909 창문 닫기

첫번째 사람부터 n번째 사람까지 차례대로 창문을 열고 닫을 때, 마지막에 열려 있는 창문의 개수를 구하는 문제. 단순히 반복문을 사용해 1부터 n까지 차례대로 닫혀있다면(0이면) 1로, 열려있으면(1이면) 0으로 바꿔준 후 1인 개수를 체크하는 식으로 풀어보았다. // 해설참조 : sehyeok.tistory.com import java.util.Scanner; public class Main { public static void main(String args[]) throws Exception { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int[] ary = new int[n]; int count = 0; for (int i = 1; i

[Java] 백준알고리즘 #4134 다음 소수

입력받은 n 보다 크거나 같은 소수 중 가장 작은 소수를 출력하는 문제. 입력받은수가 소수인지 판별하기 위해 1부터 n 혹은 n/2 까지 반복하며 약수를 확인하다보면 시간 초과 오류가 발생한다. 이는 문제에 나온 힌트처럼 루트n 까지만 나눠서 확인하면 시간 효율을 높일 수 있다. 왜 그런지 확인해보자. 예를 들어 어떤 수 N이 소수가 아닌 합성수라고 한다면, N은 어떤 약수 a와 b를 이용해 a x b 로 나타낼 수 있다. 이 때, a가 b보다 크다고 하자. 그렇다면 "a x a 는 a x b 보다 크거나 같다" 라는 것을 알 수 있다. 한 예로 100인 경우, 10^2으로 나타낼 수 있고 100의 약수는 1,2,4,5,10,20,25,50이 있는데 2 x 50, 4 x 25, 5 x 20, 10 x 1..

[Java] 백준알고리즘 #2485 가로수

가로수를 같은 간격으로 심기 위한 최소수를 구하는 문제. 각 가로수 간격들의 최대공약수를 구하는 것으로 해결할 수 있어 보인다. 예제 1에서 간격들이 2 4 6이기 때문에 이들의 최대공약수는 2이고 1부터 13까지의 거리는 12이고, 이를 최대공약수로 나누면 6이 된다. 즉 1부터 13까지의 좌표 상에 총 7개 (시작점과 끝점)의 가로수가 있다고 볼 수 있다. 입력(가로수의 개수)는 4이므로 심어야하는 가로수의 최소수는 3이 되는 것이다. 조건에서 n은 3이상이고, 두 좌표 사이의 거리가 필요하기 때문에 처음 두 가로수의 좌표를 먼저 입력받는다. Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int first = sc.nextInt(); // 첫..

[Java] 백준알고리즘 #1735 분수 합

두 분수를 합한 수를 약분하여 기약분수로 표시하는 문제. 두 분수를 합하는 방법은 2/7 + 3/5 의 경우 분모를 통일시켜줘야 하기 때문에 2/7 에 5를 곱하고, 3/5에 7을 곱해준다. 10/35 + 21/35 즉 31/35가 되는 것. 분자는 각 분모에 곱해진 수를 곱하여 더하고, 분모는 서로 곱하면 된다. 예를 하나 더 들어 보자면. 2/5 와 1/10의 경우, 각 수에 10과 5를 곱해주면 20/50 과 5/50 이 되어 25/50이 된다. 이를 기약분수로 나타내기 위해서는 분자와 분모의 최대공약수를 이용해 나눠주면 된다. 이는 앞서 사용했었던 유클리드 호제법을 이용해 최대공약수를 이용하면 간단하다. 2023.10.10 - [Java/백준알고리즘] - [Java] 백준알고리즘 #13241 최소..

[Java] 백준알고리즘 #13241 최소공배수

문제 설명에서 알 수 있듯이, 유클리드 호제법을 이용해 최소공배수를 구하는 문제이다. 먼저 유클리드 호제법에 대해 알아보자. 유클리드 호제법을 이용해 최대공약수를 구할 수 있다. 최대공약수를 구하면 자연스럽게 최소공배수도 구할 수 있는데, 예를 들어 35와 100의 경우 100을 35로 나눈 나머지 -> 30 35를 30으로 나눈 나머지 -> 5 30을 5로 나눈 나머지 -> 0 따라서 최대공약수는 5가 되고, 이를 이용해 최소공배수를 구하면 35 x 100 / 5 = 700 이 된다. 먼저 유클리드 호제법을 이용해 최대공약수를 구하는 식은 다음과 같다. long a = sc.nextInt(); long b = sc.nextInt(); long gcd = 0; // 최대공약수 if (a > b) { lo..

[Java] 백준알고리즘 #25305 커트라인

앞선 문제들을 해결할 때 사용했던 선택 정렬을 사용하면 간단하다. 2021.03.15 - [Java/백준알고리즘] - [Java] 백준알고리즘 #2798 블랙잭 [Java] 백준알고리즘 #2798 블랙잭 주어진 수들을 조합하여 3장의 카드를 골라 합이 m에 가장 근접하게 하는 문제이다. 이 문제는 선택정렬을 이용하여 풀면 간단하게 해결할 수 있다. 흔히 최소값, 최대값 또는 오름차순정렬 등을 sehyeok.tistory.com 2021.03.17 - [Java/백준알고리즘] - [Java] 백준알고리즘 #2750 수 정렬하기 [Java] 백준알고리즘 #2750 수 정렬하기 입력받은 수들을 오름차순으로 정렬하여 출력하는 문제이다. 앞서 여러 문제들을 풀면서 사용했던 선택 정렬을 이용하면 되겠다. 2021...

[Java] 백준알고리즘 #2587 대표값2

입력받은 5개의 수의 중간값과 평균을 구하는문제. 크기 5의 배열을 만들어서 이 배열을 크기순으로 나열하면 쉽게 해결 가능한 문제일 듯 하다. 2021.03.17 - [Java/백준알고리즘] - [Java] 백준알고리즘 #2750 수 정렬하기 [Java] 백준알고리즘 #2750 수 정렬하기 입력받은 수들을 오름차순으로 정렬하여 출력하는 문제이다. 앞서 여러 문제들을 풀면서 사용했던 선택 정렬을 이용하면 되겠다. 2021.03.15 - [Java/백준알고리즘] - [Java] 백준알고리즘 #2798 블랙잭 sehyeok.tistory.com 이전에 풀었던 선택정렬을 이용하여 배열을 크기순으로 정리. 이후 평균과 중간값을 도출하면 된다. 전체 코드는 다음과 같다. import java.util.Scanner..

[Java] 백준알고리즘 #19532 수학은 비대면강의입니다

연립방정식의 해를 구하는 문제 다양한 방법이 있겠지만 나는 아주 무식하고 단순한 방법으로 해결했다. 먼저 전체 코드를 보자. import java.util.Scanner; public class Main { public static void main(String args[]) { Scanner sc = new Scanner(System.in); int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); int d = sc.nextInt(); int e = sc.nextInt(); int f = sc.nextInt(); for (int x = -999; x < 1000; x++) { for (int y = -999; y < 1000; y++) { ..

[Java] 백준알고리즘 #14215 세 막대

3개의 수를 입력받아서 만들 수 있는 가장 큰 삼각형의 둘레를 구하는 문제. 다만 막대는 줄이기만 가능하다. 먼저 삼각형을 만들 수 없는 조건을 알아보자. 두 변 길이의 합 < 나머지 한 변의 길이 인 경우는 삼각형을 만들 수 없다. (같은 경우는 직선이 된다.) 2 1 1 / 2 3 5 / 3 5 10 등과 같은 경우이다. 때문에 삼각형을 만들기 위해서는 가장 긴 변의 길이를 줄여나가야 한다. 2 1 1 / 2 3 5 / 3 5 10 의 경우 1 1 1 / 2 3 4 / 3 5 7 로 바꾼다면 삼각형을 만들 수 있다. 먼저 입력받은 세 수중 가장 큰 값을 a로 지정한다. int a = sc.nextInt(); int b = sc.nextInt(); int c = sc.nextInt(); int tmp ..

반응형