본문 바로가기

Algorithm/BAEKJOON

[BOJ] 1461번 도서관 (C++)

728x90
반응형

https://www.acmicpc.net/problem/1461

 

1461번: 도서관

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책

www.acmicpc.net

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;

bool compare(int a, int b){
	return a > b;
}

int main() {
	int n, m, p, res = 0;
	vector<int> book_l;
	vector<int> book_r;
	
	cin >> n >> m;
	for(int i = 0; i < n; i++){
		cin >> p;
		if(p < 0) book_l.push_back(p);
		else book_r.push_back(p);
	}
	
	sort(book_l.begin(), book_l.end());
	sort(book_r.begin(), book_r.end(), compare);
	
	for(int i = 0; i < book_l.size(); i += m){
		res += abs(book_l[i]) * 2;
	}
	for(int i = 0; i < book_r.size(); i += m){
		res += book_r[i] * 2;
	}
	
	if(book_l.empty()) res -= book_r[0];
	else if(book_r.empty()) res -= abs(book_l[0]);
	else if(abs(book_l[0]) > book_r[0]) res -= abs(book_l[0]);
	else res -= book_r[0];
	
	cout << res << endl;
	return 0;
}

 

 

문제의 예시에서 M이 2이고, 음수 위치에 있는 책들이 [-39, -37, -29, -28, -6]이라면 

(-6, -28), (-29, -37), (-39) 순서로 가져가는 경우에 이동 거리는 (28 + 37 + 39) * 2이고,

(-6), (-28, -29), (-37, -39) 순서로 가져가는 경우에 이동 거리는 (6 + 29 + 39) * 2로

거리가 멀리 있는 책부터 가져다 놓는 것이 이동 거리가 짧다.

따라서 음의 위치에 있는 책을 담는 벡터와 양의 위치에 있는 책을 담는 벡터를 정의하고, 두 벡터를 절댓값에 대해 내림차순으로 정렬한다.

 

각각의 벡터에서 절댓값이 가장 큰 수부터 m개씩 끊고, 해당 원소 * 2 하여 최소 이동 거리를 구한다.

 

이 때 주의할 점은 모든 책을 가져다 놨으면 원래 0 위치로 돌아올 필요가 없으므로, 마지막 위치를 빼야한다.

이 값이 가장 커야 최소 이동 거리가 되므로, 절댓값이 가장 큰 책의 위치를 뺀다.

728x90
반응형

'Algorithm > BAEKJOON' 카테고리의 다른 글

[BOJ] 3495번 아스키 도형 (C++)  (0) 2022.02.13
[BOJ] 21966번 (중략) (C++)  (0) 2022.02.13
[BOJ] 11652번 카드 (C++)  (0) 2022.02.12
[BOJ] 2630번 색종이 만들기 (C++)  (0) 2022.02.12
[BOJ] 1697번 숨바꼭질 (C++)  (0) 2022.02.12