[C++]백준11497번 통나무 건너뛰기

1 minute read

오늘은 백준11497번 통나무 건너뛰기 문제를 풀어보도록 하자. 다양한 정렬방법이 있겠지만 데이터의 범위가 넓지 않아서 카운팅소트로 해결했다.

문제를 이해하는데 5분정도 걸린 것 같다. 최대 중 최소라는 말이 와닿지 않았다.

자세한건 접근법에서 !

문제는 다음과 같다.

                               [접근법]

  1. 우리는 최댓값 중에서 최솟값을 찾아야 한다. 따라서 어떤 모양이 나와야 값을 찾을 수 있는지 고민하던 중 삼각형 모양을 떠올렸다.
  
  2. 먼저 가장 큰 값을 넣어주고 그 기준으로 다음 큰 값들을 양 옆에 flag가 true면 push_front, false면 push_back을 해준다.

  3. 그리고 차이가 큰 값을 계속 갱신해주면서 가장 큰 값 중 작은 값을 찾으면 된다 ! :)
                                     [코드]
#include <iostream>
#include <algorithm>
#include <deque>
#include <cmath>
using namespace std;

int main() {
	int T,n,num;
	int arr[100001] = { 0, };
	bool flag = false;
	deque<int>dq;

	cin >> T;
	
	while (T--) {
		int result = -1;
		cin >> n;
		for (int i = 0; i < n; i++) {
			cin >> num;
			arr[num]++;
		}
		
		for (int i = 100000; i >= 1; i--) {
			while (1) {
				if (arr[i] > 0) {
					if (flag) {
						dq.push_front(i);
						flag = false;
					}
					else {
						dq.push_back(i);
						flag = true;
					}
					arr[i]--;
				}
				else {
					break;
				}
			}
		}
		for (int i = 0; i < n-1; i++) {
			result = max(abs(dq[i] - dq[i + 1]), result);
		}
		result = max(abs(dq[0] - dq[n-1]), result);
		cout << result << '\n';
		dq.clear();
	}
	return 0;
}