문제 요약:
Input:
positions = [5,4,3,2,1],
healths = [2,17,9,15,10],
directions = "RRRRR"
Output:
[2,17,9,15,10]
각 로봇들의 위치, 체력, 방향을 알려주고 로봇이 방향대로 이동하면서 충돌하면 두가지 분기로 나뉜다
1. 체력이 같으면 둘다 파괴된다
2. 한쪽 체력이 높은 경우, 낮은쪽이 파괴되고 높은쪽의 체력은 -1이 된다
충돌이 전부 진행되었을때 남은 로봇들의 체력을 반환하라
풀이 과정:
이전 문제의 연장선이라고 생각해 스택과 정렬을 이용하기로 했다
positions와 healths와 directions를 pair<int, char>로 묶어서 vector<pair<int, pair<int, char>>> 형식으로 만들어서 positions를 기준으로 healths와 directions를 정렬한다
pair<int, char> 형식의 스택을 선언하고 충돌 기준은 'R'과 'L'이 만나면 생기기에 'R'의 방향을 가진 로봇들만 스택에 넣어서 'L'의 방향을 가진 로봇을 만나면 충돌하게 한다
벡터를 선언하여 healths에 체력이 남아있는 로봇들만 따로 뽑아서 삽입하고 반환한다
풀이 결과:
실패했다
반환할때에 로봇의 위치에 따라 정렬된 healths가 아닌 처음 입력값을 받았을때의 healths를 기준으로 반환해야했다
즉 정렬을 했으면 처음에 입력받은 순서로 돌려놔야했고 이는 내가 어떻게 할 수 있는 영역이 아니었다
도저히 감이 오질않아서 답을 보았고 여기서 내가 모르는 영역을 이용해서 문제를 푸는 방식을 보고 이 문제를 노가다 방식외에는 내가 풀 수 있는 문제가 아님을 깨달았다
이 문제의 풀이에서 얻어낸 지식은 아래의 코드블럭에 모두 담겨져 있다
int len = positions.size();
vector<int> indices(len)
//초기화
for (int index = 0; index < len; ++index) {
indices[index] = index;
}
//positions에 맞게 indices 정렬
sort(indices.begin(), indices.end(), [&](int lhs, int rhs) {
return (positions[lhs] < positions[rhs]);
});
//벡터의 요소대로 loop
//즉, positions를 정렬하지 않고도 positions[indices[index]]로 정렬된 순서대로 이동가능
for (int currentIndex : indices) {
}
1. for문에서 ++index나 index++나 상관이 없다는 것 (stackoverflow)
2. sort() 함수에 람다식을 이용하여 좌우를 비교할 수 있다는 것
3. 기존 배열을 정렬하지 않아도 새로운 배열의 요소들을 기존 배열의 인덱스 순서에 맞게 위치하면 정렬된것처럼 사용할 수 있다는 것
많은 것을 배운 하루였다