Koder / 박성훈
article thumbnail

깔끔하게 풀어서 마음에 드는 문제.

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

 

1461번: 도서관

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

www.acmicpc.net

 

음수 위치의 책을 집고 양수 위치의 책을 또 집는것은 이동거리의 낭비가 되기 때문에,

음수 위치에 있는 책들끼리 묶어서 옮기고

양수 위치에 있는 책들끼리 묶어서 옮기려는 생각을 해야 한다.

$M$개씩 묶어서 옮기는 과정에서,

이동거리는 묶인 것들 중 가장 절댓값이 큰 숫자의 두배(왕복) 이 된다.

 

제일 마지막에는 다시 0으로 돌아올 필요가 없고,

왕복하느라 이미 제일 마지막의 수는 두번 더해져있을 것이기 때문에

절댓값이 가장 큰 수 하나를 빼주면 된다.

 

빼는 과정에서 양수 좌표만 있거나, 음수 좌표만 있는 경우

OutOfBounds 에러가 발생할 수 있다.

케이스 잘 나눠서 처리해줘야 한다.

 

#include <bits/stdc++.h>
using namespace std;

vector<int> p;
vector<int> m;

int main(){
	int N,M,k;
	cin >> N >> M;
	for(int i=0; i<N; i++){
		cin >> k;
		if(k > 0) p.push_back(k);
		else      m.push_back(k);
	}
	
	sort(p.begin(), p.end(), greater<int>());
	sort(m.begin(), m.end());
	
	int ans = 0;
	for(int i=0; i<p.size(); i+=M) ans += (p[i] *  2);
	for(int i=0; i<m.size(); i+=M) ans += (m[i] * -2);
	
	int sub = 0;
	if(p.size() != 0) sub = p[0];
	if(m.size() != 0) sub = max(sub, -m[0]);
	
	cout << ans - sub;
	return 0;
}

반응형