알고리즘/프로그래머스

프로그래머스 - 지형 편집

시나모온 2020. 9. 7. 04:21

문제 링크입니다 : programmers.co.kr/learn/courses/30/lessons/12984

 

코딩테스트 연습 - 지형 편집

XX 게임에서는 지형 편집 기능을 이용하여 플레이어가 직접 게임 속 지형을 수정할 수 있습니다. 이 게임에서는 1 x 1 x 1 크기의 정육면체 블록을 쌓아 게임 속 지형을 표현합니다. 이때, 블록이 ��

programmers.co.kr

 

이분탐색을 써야 된다는 것을 알았다. 하지만 범위를 어떻게 줄여나가야 될 지 감이 안잡혔다.

 

그래서 ydeer.tistory.com/78 이 분꺼를 보고 방법을 익혔다.

 

 

생각보다 좀 어려운 문제였다.

 

 

 

#include <vector>
#include <iostream>
using namespace std;
typedef long long ll;

ll getVal(const vector<vector<int>>& land, ll level, int Q, int P) {
    ll ret = 0;
    for(int i = 0; i < land.size(); i++) {
        for(int j = 0; j < land[i].size(); j++) {
            if(land[i][j] > level) {
                ret += (land[i][j] - level) * Q;
            } else if(land[i][j] < level) {
                ret += (level - land[i][j]) * P;
            }
        }
    }
    return ret;
}

long long solution(vector<vector<int> > land, int P, int Q) {
    long long answer = 0;
    
    ll low = 0;
    ll high = 1000000000;
    ll mid, result;
    
    while(low < high) {
        mid = (low + high) / 2;

        
        ll sum1 = getVal(land, mid, Q, P);
        ll sum2 = getVal(land, mid + 1, Q, P);
        
        if(sum1 == sum2) {
            break;
        } else if(sum1 < sum2) {
            high = mid;
        } else {
            low = mid + 1;
        }
        
    }
    
    answer = getVal(land, (low + high) / 2, Q, P);
    
    
    return answer;
}

 

 

 

개발 환경 : vscode

지적, 조언, 질문 환영입니다! 댓글 남겨주세요~