전체 글

중요한 것은 꺾여도 그냥 하는 마음
https://www.acmicpc.net/problem/2473 2473번: 세 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 3 이상 5,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 주어진다. 이 수들은 모두 -1,000,000,000 이상 www.acmicpc.net 풀이 사용한 알고리즘 : 이분 탐색 풀이전략 두 용액에서와 달리 이번 문제는 세 용액의 합이 0에 가까워야 한다. 저번 두 용액에서는 입력받은 용액들을 오름차순으로 정렬시키고, 최좌측 인덱스 start와 최우측 인덱스 end에 속하는 양 끝값의 합을 구하고 이 합이 0보다 크면 총합의 값을 줄이기위해 end=end-1, 합이 0보다 작으면 총합의 값을 늘리기 위해 start=..
https://www.acmicpc.net/problem/2293 2293번: 동전 1 첫째 줄에 n, k가 주어진다. (1 ≤ n ≤ 100, 1 ≤ k ≤ 10,000) 다음 n개의 줄에는 각각의 동전의 가치가 주어진다. 동전의 가치는 100,000보다 작거나 같은 자연수이다. www.acmicpc.net 풀이 사용한 알고리즘 : DP 풀이전략 위의 문제에서 주어진 입력을 표로 나타내면 아래와 같다. 이중배열 d[i][j]는 i와 i번 째 이전에 입력된 동전들로, 수 j를 만들 수 있는 경우의 수를 저장한다. d[i][0]은 공집합인 상태로, 공집합 또한 하나의 경우의 수를 가지므로 1을 가진다. d[0][j]은 d[i][j]의 규칙성을 찾아낸 식에서 d[i-1][j]의 i-1에서 IndexOutOf..
https://www.acmicpc.net/problem/9252 9252번: LCS 2 LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다. 예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다. www.acmicpc.net 풀이 사용한 알고리즘 : LCS (Longest Common Subsequence) 풀이전략 LCS란 최장 공통 부분집합으로 문자열 X, Y가 주어졌을 때, X와 Y에서 공통으로 나타나는 부분 문자 집합 중 길이가 최대가 되는 부분 집합을 의미한다. 예로 X = ACAYKP Y = CAPCAK 라고 할 때, 두 문자열의 LCS 는 ACAK이다. 만약..
https://www.acmicpc.net/problem/1647 1647번: 도시 분할 계획 첫째 줄에 집의 개수 N, 길의 개수 M이 주어진다. N은 2이상 100,000이하인 정수이고, M은 1이상 1,000,000이하인 정수이다. 그 다음 줄부터 M줄에 걸쳐 길의 정보가 A B C 세 개의 정수로 주어지는데 A번 www.acmicpc.net 풀이 사용한 알고리즘 : 크루스칼 알고리즘 풀이전략 문제는 최소 신장트리를 만들 것을 요구하고 있다. 최소 신장트리란 하나의 그래프가 있을 때, 모든 노드를 포함하면서 사이클이 존재하지 않는 부분 그래프를 의미한다. 문제에서는 마을 내부의 모든 집이 연결되면서, 비용이 최소가 되도록 길을 연결했을 경우의 비용을 요구하고있기 때문에, 최소 신장트리를 만들고, 만..
https://www.acmicpc.net/problem/2230 2230번: 수 고르기 N개의 정수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 이 수열에서 두 수를 골랐을 때(같은 수일 수도 있다), 그 차이가 M 이상이면서 제일 작은 경우를 구하는 프로그램을 작성하시오. 예를 들어 www.acmicpc.net 풀이 사용한 알고리즘: Binary Search 풀이전략 이분탐색을 통해 특정 값과 오차가 M 이상이면서 가장 적은 오차의 수를 구하면 된다. 완전 탐색을 통해 값을 비교하게 되면 시간 복잡도가 O(n^2)으로 n이 최대 100,000 까지 가능하다 했기 때문에 최대 10,000,000,000번(10억 번)의 연산을 하게된다. 그런데 JAVA는 통상 1초당 1억번의 연산을 수행..
https://www.acmicpc.net/problem/10816 10816번: 숫자 카드 2 첫째 줄에 상근이가 가지고 있는 숫자 카드의 개수 N(1 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 숫자 카드에 적혀있는 정수가 주어진다. 숫자 카드에 적혀있는 수는 -10,000,000보다 크거나 같고, 10,0 www.acmicpc.net 풀이 사용한 알고리즘 : 이진탐색, 해쉬 맵 자료구조 풀이전략 이진탐색을 사용하지 않고, 해쉬 맵 또는 배열 카운팅 방식으로 풀이할 수도 있는 문제이다. (실제 이진 탐색은 시간 복잡도가 O(nlogn)인데 반해, 위 방법들의 시간 복잡도는 O(n)으로 더 빠르다.) 하지만 이진 탐색 기법을 사용하여 문제를 풀이해보겠다. C++과 python과 달리 JAVA에는..
https://www.acmicpc.net/problem/2467 2467번: 용액 첫째 줄에는 전체 용액의 수 N이 입력된다. N은 2 이상 100,000 이하의 정수이다. 둘째 줄에는 용액의 특성값을 나타내는 N개의 정수가 빈칸을 사이에 두고 오름차순으로 입력되며, 이 수들은 모두 - www.acmicpc.net 풀이 사용한 알고리즘 : 이진 탐색, 우선순위 큐 풀이전략 보통의 이진 탐색에서는 mid(=(start+end)/2)를 사용하여 중간 값 기준으로 start와 end 위치를 변경한다. 하지만 이 문제 풀이에서는 중간 값이 아닌 양 끝의 범위를 양 끝에서 점점 조이는 방법을 활용하되 이진 탐색 구현 코드를 일부 사용했다. 양 끝 값의 합을 구하고, 그 값이 기존의 합 중 가장 작은 값보다 작으..
https://www.acmicpc.net/problem/10844 10844번: 쉬운 계단 수 첫째 줄에 정답을 1,000,000,000으로 나눈 나머지를 출력한다. www.acmicpc.net 풀이 사용한 알고리즘 : 다이나믹 프로그래밍(DP) 풀이전략 인접한 계단 사이의 차이는 1이라고 했으므로 다음 특정 값의 계단에서 가질 수 있는 경우의 수는 이전 계단이 현재의 계단 값보다 1 작을 경우의 수 더하기 계단 값이 1 클 경우의 수이다. 단, 0과 같은 경우는 수에 음수가 들어갈 수 없으므로 이전 계단값이 현재 계단 값보다 1 더 클 경우의 수만을 가질 수 있다. 9 또한 이전 계단 값으로 10을 가질 수 없으므로 이전 계단 값이 8인 경우의 수만을 가진다. 이를 수식으로 나타내면 아래와 같다. 마..
https://www.acmicpc.net/problem/10830 10830번: 행렬 제곱 크기가 N*N인 행렬 A가 주어진다. 이때, A의 B제곱을 구하는 프로그램을 작성하시오. 수가 매우 커질 수 있으니, A^B의 각 원소를 1,000으로 나눈 나머지를 출력한다. www.acmicpc.net 풀이 사용한 알고리즘 : 분할정복 풀이전략 밑이 C, 지수가 n인 수가 있을 때, C^n을 효과적으로 구하기 위해서는 분할 정복 알고리즘이 사용된다. 분할 정복 알고리즘을 사용하지 않고 C를 n번 곱하게 되면 시간 복잡도가 O(n)이 된다. 그런데 위 문제에서 지수로 쓰이는 B의 범위가 1
https://www.acmicpc.net/problem/4233 4233번: 가짜소수 입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 한 줄로 이루어져 있고, p와 a를 포함하고 있다. 입력의 마지막 줄에는 "0 0"이 주어진다. (2 < p ≤ 1,000,000,000, 1 < a < p) www.acmicpc.net 풀이 사용한 알고리즘 : 분할정복, 소수 구하기 풀이전략 이 문제를 풀기위해서는 소수 구하기와 분할정복 알고리즘을 알아야한다. 1. 소수 구하기 먼저 소수 구하기를 구현한 isPrime 함수부터 설명을 하겠다. static boolean isPrime(long num){ if(num
째로스
개발일지