/images/logo.png

[백준]1654 랜선 자르기

https://www.acmicpc.net/problem/1654 풀이: 배열을 받아온다. 배열의 들어있는 랜선의 길이 중 최댓값이 만들 수 있는 최대 길이의 랜선이므로 최댓값을 설정한다. 최솟값은 1로 설정한다. 최댓값과 최솟값의 중간값을 m이라고 하자. 모든 배열의 원소를 m으로 나눈 몫을 모두 더한다. 더한 값이 필요한 랜선의 갯수보다 작다면, m값이 너무 크다는 것이므로 최댓값을 m - 1 로 바꿔준다. 더한 값이 필요한 랜선의 갯수보다 크거나 같다면, 만들 수 있다는 것이므로 답에 저장해 놓는다. 이때, 랜선의 최대 길이를 찾아야 하므로, 랜선의 갯수와 같다고 바로 끝내지 말고 위로 가면서 최댓값을 찾아야한다.

[백준]1655 가운데를 말해요

https://www.acmicpc.net/problem/1655 풀이: 하나씩 숫자를 받아온다. 첫번째 숫자를 mid 라고 할 때, 현재 숫자가 mid보다 크거나 같다면, 배열 r 에 작다면, 배열 l 에 저장한다. mid를 배열 r 에 넣고, 배열 l 의 값 중 가장 큰 값으로 바꾼다. 만약, 배열 r과 l의 사이즈 차이가 2이상 난다면, mid값을 조정해준다. cout, cin 을 사용하면, 시간초과가 나므로 주의하자. 코드: 사용언어 : c++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <iostream>#include <queue>using namespace std; int n, m, mid; int main() { priority_queue<int, vector<int>, greater<int>> r; priority_queue<int> l; scanf("%d %d", &n, &mid); printf("%d\n", mid); while (--n) { scanf("%d", &m); m < mid ?

[백준]2110 공유기 설치

https://www.acmicpc.net/problem/2110 풀이: [백준]1654 랜선 자르기 참고 최대 거리를 설정하고, 그 거리를 기준으로 공유기를 설치할 수 있는지 확인하고, 이분탐색으로 최대 거리를 조절해 나간다. 코드: 사용언어 : c++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 #include <iostream>#include <algorithm>using namespace std; long long n, k, i, a[200001], sum, m, l = 1, r, c = 0, d; int main() { cin >> k >> n; for (i = 0; i < k; i++) cin >> a[i]; sort(a, a + k); r = a[k - 1]; while (l <= r) { sum = 1; m = (r + l) / 2; d = a[0]; for (i = 1; i < k; i++) if (d + m <= a[i]) { d = a[i]; sum++; } if (sum < n) r = m - 1; else { c = max(c, m); l = m + 1; } } cout << c << endl; return 0; }

[백준]2805 나무 자르기

https://www.acmicpc.net/problem/2805 풀이: [백준]1654 랜선 자르기 참고 m값이 배열의 값보다 작은데 a[i] - m을 할 경우 -값이 나오므로 주의하자. 코드: 사용언어 : c++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <iostream>#include <algorithm>using namespace std; long long n, k, i, a[1000001], sum, m, l = 1, r = 0, c = 0; int main() { cin >> k >> n; for (i = 0; i < k; i++) { cin >> a[i]; r = max(r, a[i]); } while (l <= r) { sum = 0; m = (r + l) / 2; for (i = 0; i < k; i++) sum += a[i] < m ?

[백준]k번째 수

https://www.acmicpc.net/problem/1300 풀이: [백준]1654 랜선 자르기 참고 현재 숫자의 순서가 k를 넘어간다면, 오른쪽 탐색을, 아니라면 왼쪽으로 탐색한다. int형 사이즈를 넘어가니 long long으로 바꿔주자. 코드: 사용언어 : c++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 #include <iostream>#include <algorithm>using namespace std; long long n, k, i, sum, m, l = 1, r, c; int main() { cin >> n >> k; r = n * n; c = r; while (l <= r) { sum = 0; m = (r + l) / 2; for (i = 1; i <= n; i++) sum += min(n, m / i); if (sum < k) l = m + 1; else { c = min(c, m); r = m - 1; } } cout << c << '\n'; }

[프로그래머스]최적의 행렬 곱셈

https://programmers.co.kr 문제: 크기가 a by b인 행렬과 크기가 b by c 인 행렬이 있을 때, 두 행렬을 곱하기 위해서는 총 a x b x c 번 곱셈해야합니다. 예를 들어서 크기가 5 by 3인 행렬과 크기가 3 by 2인 행렬을 곱할때는 총 5 x 3 x 2 = 30번의 곱하기 연산을 해야 합니다. 행렬이 2개일 때는 연산 횟수가 일정 하지만, 행렬의 개수가 3개 이상일 때는 연산의 순서에 따라서 곱하기 연산의 횟수가 바뀔 수 있습니다.