본문 바로가기

Algorithm/Sweeping

(C++) - 백준(BOJ) 20366 : 같이 눈사람 만들래?

반응형

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

 

20366번: 같이 눈사람 만들래?

높이가 (2, 5), (3, 5)로 구성된 눈사람 둘을 만드는 것이 최적의 경우 중 하나이다. |7-8| = 1 다른 경우로는 (2, 9), (5, 5)로 두 눈사람을 만드는 경우가 있다. |11-10| = 1

www.acmicpc.net

two pointer로 해결한 문제였습니다.

📕 풀이방법

📔 입력 및 초기화

눈사람 수 n, 정답을 출력할 변수 ans, 눈덩이의 지름을 저장할 일차원 배열 snow를 선언한 후 적절히 입력받습니다.

📔 풀이과정

i ~ j까지의 눈사람이 다음과 같이 있을 때 i, j지름의 눈덩이로 눈사람을 만들고 i+1, j-1지름의 눈덩이로 다른 눈사람을 만든다고 볼 수 있습니다. 2중 for loop를 수행하며 i, j를 고정시키고 정답은 최솟값이며 이는 i, j사이에 존재하므로 모든 눈덩이를 탐색할 필요 없습니다. twopointer로 적절히 pruning하여 정답을 구합니다.

i i+1             j-1 j

📔 정답출력

ans를 출력합니다.


📕 Code

#include <bits/stdc++.h>
using namespace std;
int n, ans = 0x3f3f3f3f;
int snow[601];

int main(){
    cin >> n;
    for(int i = 0; i < n; i++) cin >> snow[i];
    sort(snow, snow + n);
    for(int i = 0; i < n; i++){
        for(int j = i+3; j < n; j++){
            int one = snow[i] + snow[j];
            int l = i + 1;
            int r = j - 1;
            while(l <= r){
                int two = snow[l] + snow[r];
                ans = min(ans, abs(one - two));
                if(one - two <= 0) r--;
                else l++;
            }
        }
    }
    cout << ans;
}

*더 나은 내용을 위한 지적, 조언은 언제나 환영합니다.