Algorithm/Baekjoon 10

백준 1033번 칵테일 (Java)

문제백준 1033번 칵테일 / 골드2august14는 세상에서 가장 맛있는 칵테일이다. 이 칵테일을 만드는 정확한 방법은 아직 세상에 공개되지 않았지만, 들어가는 재료 N개는 공개되어 있다.경근이는 인터넷 검색을 통해서 재료 쌍 N-1개의 비율을 알아냈고, 이 비율을 이용해서 칵테일에 들어가는 전체 재료의 비율을 알아낼 수 있다.총 재료 쌍 N-1개의 비율이 입력으로 주어진다. 이때, 칵테일을 만드는데 필요한 각 재료의 양을 구하는 프로그램을 작성하시오. 이때, 필요한 재료의 질량을 모두 더한 값이 최소가 되어야 한다. 칵테일을 만드는 재료의 양은 정수이고, 총 질량은 0보다 커야한다.비율은 "a b p q"와 같은 형식이고, a번 재료의 질량을 b번 재료의 질량으로 나눈 값이 p/q라는 뜻이다.입력첫째..

Algorithm/Baekjoon 2024.10.11

백준 1300번 K번째 수 (Java)

문제백준 1300번 K번째 수 / 골드1세준이는 크기가 N×N인 배열 A를 만들었다. 배열에 들어있는 수 A[i][j] = i×j 이다. 이 수를 일차원 배열 B에 넣으면 B의 크기는 N×N이 된다. B를 오름차순 정렬했을 때, B[k]를 구해보자.배열 A와 B의 인덱스는 1부터 시작한다.입력첫째 줄에 배열의 크기 N이 주어진다. N은 105보다 작거나 같은 자연수이다. 둘째 줄에 k가 주어진다. k는 min(109, N2)보다 작거나 같은 자연수이다.풀이문제의 접근을 어떻게 해야되는지 많은 고민을 하게 만든 문제이다. 문제는 2차원 배열의 값(인덱스의 곱)을 오름차순 1차원 배열로 만들었을 때, K번째 수인 B[k]를 구하는 문제이다. 이 문제를 해결하기 위해서는 B[k] = x라 가정 했을 때, 'x..

Algorithm/Baekjoon 2024.09.26

백준 1167번 트리의 지름 (Java)

문제백준 1167번 트리의 지름 / 골드2트리의 지름이란, 트리에서 임의의 두 점 사이의 거리 중 가장 긴 것을 말한다. 트리의 지름을 구하는 프로그램을 작성하시오.입력트리가 입력으로 주어진다. 먼저 첫 번째 줄에서는 트리의 정점의 개수 V가 주어지고 (2 ≤ V ≤ 100,000)둘째 줄부터 V개의 줄에 걸쳐 간선의 정보가 다음과 같이 주어진다. 정점 번호는 1부터 V까지 매겨져 있다.먼저 정점 번호가 주어지고, 이어서 연결된 간선의 정보를 의미하는 정수가 두 개씩 주어지는데, 하나는 정점번호, 다른 하나는 그 정점까지의 거리이다. 예를 들어 네 번째 줄의 경우 정점 3은 정점 1과 거리가 2인 간선으로 연결되어 있고, 정점 4와는 거리가 3인 간선으로 연결되어 있는 것을 보여준다. 각 줄의 마지막에는..

Algorithm/Baekjoon 2024.09.23

백준 2023번 신기한 소수 (Java)

문제백준 2023번 신기한 소수 / 골드5수빈이가 세상에서 가장 좋아하는 것은 소수이고, 취미는 소수를 가지고 노는 것이다. 요즘 수빈이가 가장 관심있어 하는 소수는 7331이다.7331은 소수인데, 신기하게도 733도 소수이고, 73도 소수이고, 7도 소수이다. 즉, 왼쪽부터 1자리, 2자리, 3자리, 4자리 수 모두 소수이다! 수빈이는 이런 숫자를 신기한 소수라고 이름 붙였다.수빈이는 N자리의 숫자 중에서 어떤 수들이 신기한 소수인지 궁금해졌다. N이 주어졌을 때, 수빈이를 위해 N자리 신기한 소수를 모두 찾아보자.입력첫째 줄에 N(1 ≤ N ≤ 8)이 주어진다.풀이소수를 찾는 문제이다. 일반적으로 소수 판별에는 에라토스테네스의 체를 이용하는 방법이 있다. 하지만, N자리의 숫자 중에서 신기한 소수를..

Algorithm/Baekjoon 2024.09.17

백준 1517번 버블 소트 (Java)

문제백준 1517번 버블 소트 / 플래티넘5N개의 수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에 대해서 버블 소트를 수행할 때, Swap이 총 몇 번 발생하는지 알아내는 프로그램을 작성하시오.버블 소트는 서로 인접해 있는 두 수를 바꿔가며 정렬하는 방법이다. 예를 들어 수열이 3 2 1 이었다고 하자. 이 경우에는 인접해 있는 3, 2가 바뀌어야 하므로 2 3 1 이 된다. 다음으로는 3, 1이 바뀌어야 하므로 2 1 3 이 된다. 다음에는 2, 1이 바뀌어야 하므로 1 2 3 이 된다. 그러면 더 이상 바꿔야 할 경우가 없으므로 정렬이 완료된다.입력첫째 줄에 N(1 ≤ N ≤ 500,000)이 주어진다. 다음 줄에는 N개의 정수로 A[1], A[2], …, A[N]이 주어진..

Algorithm/Baekjoon 2024.09.16

백준 1377번 버블 소트 (Java)

문제백준 1377번 버블 소트 / 골드2버블 소트 알고리즘을 다음과 같이 C++로 작성했다.bool changed = false;for (int i=1; i A[j+1]) { changed = true; swap(A[j], A[j+1]); } } if (changed == false) { cout 위 소스에서 N은 배열의 크기이고, A는 정렬해야 하는 배열이다. 배열은 A[1]부터 사용한다.위와 같은 소스를 실행시켰을 때, 어떤 값이 출력되는지 구해보자.입력첫째 줄에 N이 주어진다. N은 500,000보다 작거나 같은 자연수이다. 둘째 줄부터 N개의 줄에 A[1]부터 A[N]까지 하나씩 주어진다. A에 들어있는 수는 1,000,0..

Algorithm/Baekjoon 2024.09.07

백준 17298번 오큰수 (Java)

문제백준 17298번 나머지 합 / 골드4크기가 N인 수열 A = A1, A2, ..., AN이 있다. 수열의 각 원소 Ai에 대해서 오큰수 NGE(i)를 구하려고 한다. Ai의 오큰수는 오른쪽에 있으면서 Ai보다 큰 수 중에서 가장 왼쪽에 있는 수를 의미한다. 그러한 수가 없는 경우에 오큰수는 -1이다.예를 들어, A = [3, 5, 2, 7]인 경우 NGE(1) = 5, NGE(2) = 7, NGE(3) = 7, NGE(4) = -1이다. A = [9, 5, 4, 8]인 경우에는 NGE(1) = -1, NGE(2) = 8, NGE(3) = 8, NGE(4) = -1이다. 입력첫째 줄에 수열 A의 크기 N (1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄에 수열 A의 원소 A1, A2, .....

Algorithm/Baekjoon 2024.09.06

백준 11003번 최솟값 찾기 (Java)

문제백준 11003번 최솟값 찾기 / 플래티넘5N개의 수 A1, A2, ..., AN과 L이 주어진다.Di = Ai-L+1 ~ Ai 중의 최솟값이라고 할 때, D에 저장된 수를 출력하는 프로그램을 작성하시오. 이때, i ≤ 0 인 Ai는 무시하고 D를 구해야 한다.입력첫째 줄에 N과 L이 주어진다. (1 ≤ L ≤ N ≤ 5,000,000)둘째 줄에는 N개의 수 Ai가 주어진다. (-109 ≤ Ai ≤ 109)풀이범위 안의 최솟값을 연속해서 구하는 문제이다. 예제 입력을 보면 중복된 수가 허용된다. 우선 Node 클래스를 만들어 num입력값을 저장할 value변수와 입력값의 순서를 알려줄 index변수를 만들었다.일정한 범위를 덱deque을 사용해 표현했다. 그리고 문제를 해결하기 위해 다음과 같은 조건..

Algorithm/Baekjoon 2024.09.03

백준 1253번 좋다 (Java)

문제백준 1253번 좋다 / 골드4N개의 수 중에서 어떤 수가 다른 수 두 개의 합으로 나타낼 수 있다면 그 수를 “좋다(GOOD)”고 한다.N개의 수가 주어지면 그 중에서 좋은 수의 개수는 몇 개인지 출력하라.수의 위치가 다르면 값이 같아도 다른 수이다.입력첫째 줄에는 수의 개수 N(1 ≤ N ≤ 2,000), 두 번째 줄에는 i번째 수를 나타내는 Ai가 N개 주어진다. (|Ai| ≤ 1,000,000,000, Ai는 정수)풀이투 포인터 문제이다. 조건을 유심히 살펴야 하는 문제이다. 우선, "어떤 수가 다른 수 두 개의 합"이라고 명시되었다. 이는 검사 할 대상 A는 A를 제외한 다른 값인 B와 C의 합이여야 된다는 의미다. 또한, "수의 위치가 다르면 값이 같아도 다른 수이다."라고 명시되었다. 그..

Algorithm/Baekjoon 2024.09.02

백준 10986번 나머지 합 (Java)

문제백준 10986번 나머지 합 / 골드3수 N개 A1, A2, ..., AN이 주어진다. 이때, 연속된 부분 구간의 합이 M으로 나누어 떨어지는 구간의 개수를 구하는 프로그램을 작성하시오.즉, Ai + ... + Aj (i ≤ j) 의 합이 M으로 나누어 떨어지는 (i, j) 쌍의 개수를 구해야 한다.입력첫째 줄에 N과 M이 주어진다. (1 ≤ N ≤ 106, 2 ≤ M ≤ 103)둘째 줄에 N개의 수 A1, A2, ..., AN이 주어진다. (0 ≤ Ai ≤ 109)풀이누적 합 문제이다. 하지만 단순히 모든 구간의 누적 합을 구하게 되면 입력 N이 106이므로 시간복잡도는 O(n2)로 시간 초과가 발생한다.그래서 M으로 나누었을 때, 나머지가 같은 수를 카운트 해주는 배열 remainders를 만들었..

Algorithm/Baekjoon 2024.09.01