ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [ 11497 ] 통나무 건너뛰기 - 그리디
    알고리즘/BOJ 2021. 7. 13. 15:12

    < 그리디 > - < 실버 1 >

     

    [ 11497 ]

    통나무 건너뛰기

    남규는 통나무를 세워 놓고 건너뛰기를 좋아한다. 그래서 N개의 통나무를 원형으로 세워 놓고 뛰어놀려고 한다. 남규는 원형으로 인접한 옆 통나무로 건너뛰는데, 이때 각 인접한 통나무의 높이 차가 최소가 되게 하려 한다.

    통나무 건너뛰기의 난이도는 인접한 두 통나무 간의 높이의 차의 최댓값으로 결정된다. 높이가 {2, 4, 5, 7, 9}인 통나무들을 세우려 한다고 가정하자. 이를 [2, 9, 7, 4, 5]의 순서로 세웠다면, 가장 첫 통나무와 가장 마지막 통나무 역시 인접해 있다. 즉, 높이가 2인 것과 높이가 5인 것도 서로 인접해 있다. 배열 [2, 9, 7, 4, 5]의 난이도는 |2-9| = 7이다. 우리는 더 나은 배열 [2, 5, 9, 7, 4]를 만들 수 있으며 이 배열의 난이도는 |5-9| = 4이다. 이 배열보다 난이도가 낮은 배열은 만들 수 없으므로 이 배열이 남규가 찾는 답이 된다.

     

    :: 입력

    입력은 T개의 테스트 케이스로 이루어져 있다. 첫 줄에 T가 주어진다.

    이어지는 각 줄마다 첫 줄에 통나무의 개수를 나타내는 정수 N(5 ≤ N ≤ 10,000), 둘째 줄에 각 통나무의 높이를 나타내는 정수 Li가 주어진다. (1 ≤ Li ≤ 100,000)

    :: 출력

    각 테스트 케이스마다 한 줄에 주어진 통나무들로 만들 수 있는 최소 난이도를 출력하시오.


    - try 1 

    : 가장 큰 값과 그 앞, 그 앞앞 값만 비교하면 된다고 생각해서 그렇게 짰음

    주어진 예시는 다 통과하는데 틀림 ,,

     

    - try 2 

    : 솔루션 참고해서 코드 고쳤는데 반복문 문자 헷갈려서 틀림 ,, 멍청

     

     

      아이디어  

    풀이 찾아보니까

    가장 큰값을 기준으로 양쪽으로 번갈아가며 값을 붙이며 배열을 만든다는 생각은 똑같은데

    이걸 일반화 함

     

    ex) 

     

    2, 4, 5, 7, 9 -> 0, 1, 2, 3, 4 로 인덱스화 해서 배열을 만들면 

    최소 난이도가 나오는 배열은 아래와 같음

     

    0 2 4 3 1

    2 5 9 7 4

     

    이때 각 항은 인덱스가 2씩 차이나게 됨

    인덱스가 1씩 차이나게 배열을 만드는 경우는 첫항과 마지막항이 너무 큰 차이가 나기때문에 답이 될 수 없음

     

    결론적으로 최소 난이도를 가지는 배열은 각항의 인덱스가 2 이하로 차이나는 배열이 된다 !

    통나무의 높이를 저장해둔 벡터를 처음부터 탐색하면서 인덱스 2 차이 나는 값과 차이를 비교 해줌

    		for (int x = 0; x <= k - 3; x++) {
    			int v = abs(nums[x] - nums[x+2]);
    			if (v > ans) {
    				ans = v;
    			}
    		}

     

     

      정답  코드  

    #include <stdio.h>
    #include <iostream>
    #include <string>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    
    int main() {
    
    	int n = 0;
    	cin >> n;
    
    	vector<int> answers;
    
    	for (int i = 0; i < n; i++) {
    		int k = 0;
    
    		vector<int> nums;
    
    		cin >> k;
    
    		for (int j = 0; j < k; j++) {
    			int h = 0;
    			cin >> h;
    			nums.push_back(h);
    		}
    
    		sort(nums.begin(), nums.end());
    
    		int ans = 0;
    
    		for (int x = 0; x <= k - 3; x++) {
    			int v = abs(nums[x] - nums[x+2]);
    			if (v > ans) {
    				ans = v;
    			}
    		}
    
    		answers.push_back(ans);
    	}
    
    	for (int i = 0; i < answers.size(); i++) {
    		printf("%d\n", answers[i]);
    	}
    
    	return 0;
    }

     

    '알고리즘 > BOJ' 카테고리의 다른 글

    [ 2440 ] 별 찍기 - 3 - 구현  (0) 2021.07.23
    [ 10817 ] 세 수 - 구현  (0) 2021.07.23
    [ 1316 ] 그룹 단어 체커 - 구현  (0) 2021.07.23
    [ 11047 ] 동전 0 - 그리디  (0) 2021.07.13
    [ 11399 ] ATM - 그리디  (0) 2021.07.13
준생e