Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 인터락 함수
- 유저 모드
- 블로킹 논블로킹
- 교착 상태
- 임계 구역
- 프로세스 제어 블록
- Process Control Block
- 프로세스 상태 전이도
- The Banker's Algorithm
- Activity
- The DIning Philosopher Problem
- 방금 그 곡
- 프로세스
- Light Weight Process
- 스레드
- Reentrant
- Non-Preemptive
- 커널 모드
- Stack영역
- 모니터(Monitor)
- Heap영역
- Multi-level Queue
- 뮤텍스(Mutex)
- 경량 프로세스
- 유저 모드의 동기화
- 스레드 동기화
- 동기 비동기
- 문맥 교환
- 은행원 알고리즘
- 커널 모드의 동기화
Archives
Blog For Me
백준 1654번 랜선 자르기 본문
문제링크: https://www.acmicpc.net/problem/1654
문제 풀이
- 입력 받은 전선의 길이들을 오름차순으로 정렬한다.
- 처음에 minWire 값을 1로 잡고, maxWire 값을 입력한 랜선 중 가장 긴 길이로 지정한다.
- (minWire + maxWire) / 2 의 값을 midWire 변수에 대입하고, 각 길이를 mid 값으로 나누어 몇 개씩 전선을 만들 수 있는지 총합을 구한다.
- 만약에 만들 수 있는 전선의 개수가 N보다 작으면, 가장 긴 길이인 maxWire의 값을 midWire - 1로 줄인다.
- 반대로 만들 수 있는 전선의 개수가 N보다 크거나 같으면, 가장 짧은 길이인 minWire를 midWire + 1로 증가시키고, 최종 결과값을 갱신한다.
- 가장 긴 길이를 출력한다.
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
vector<long long> wire;
int main()
{
cin.tie(NULL);
cout.tie(NULL);
ios_base::sync_with_stdio(false);
long long K, N;
cin>>K>>N;
for(int i=0;i<K;i++) {
long long cen;
cin>>cen;
wire.push_back(cen);
}
sort(wire.begin(), wire.end()); // 전선의 길이 오름차순 정렬
long long minWire = 1, maxWire = wire[wire.size()-1]; //가장 짧은 길이를 1로, 가장 긴 길이를 입력값 중 가장 큰 값으로 초기화
long long result = 0;
while(minWire <= maxWire) {
long long midWire = (minWire + maxWire) / 2;
int sum = 0;
for(int i=0;i<K;i++) { // 만들 수 있는 전선의 개수를 구한다.
sum += wire[i] / midWire;
}
if(sum < N) { //조건 충족하지 못하면 가장 큰 값을 줄인다.
maxWire = midWire - 1;
}
else { //조건 충족했을 시 최종 결과값을 갱신하고 가장 작은 값을 증가시킨다.
result = max(result, midWire);
minWire = midWire + 1;
}
}
cout<<result<<'\n'; //최종 결과값 출력
return 0;
}
'알고리즘 문제 > 백준' 카테고리의 다른 글
백준 1920번 수 찾기 (0) | 2021.11.04 |
---|---|
백준 10816 숫자 카드 2 (0) | 2021.10.23 |
Comments