Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

블로그 언저리인 무언가

[백준/BOJ] 2879 코딩은 예쁘게 본문

Programming/BOJ

[백준/BOJ] 2879 코딩은 예쁘게

he1fire 2020. 9. 28. 15:04
728x90

문제 : 2879 코딩은 예쁘게

 

2879번: 코딩은 예쁘게

첫째 줄에 줄의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄에는 현재 줄에 있는 탭의 개수가 주어지며, 1번째 줄부터 순서대로 주어진다. 탭의 개수는 0보다 크거나 같고, 80보다 작거나 같은 정수�

www.acmicpc.net

소스코드의 현재 탭의 개수와 원하는 탭의 개수가 주어질 때,

연속된 줄을 그룹을 선택해 편집하는 최소 횟수를 구하는 문제이다.

 그리디 알고리즘을 활용해 한번 탭을 추가하거나

삭제할 때 현재 줄부터 가장 뒤의 줄까지 중 가장 많은 탭 개수를

한 번에 조절할 수 있는 위치를 찾아 처리해주는 것을 반복하면 된다.  


Code

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll N, ans, arr[1005], tab[1005];
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> N;
    for (int i=0;i<N;i++){
        cin >> arr[i];
    }
    for (int i=0;i<N;i++){
        cin >> tab[i];
    }
    for (int i=0;i<N;i++){
        while (arr[i]!=tab[i]){
            ll gap=0, max=0, cnt=0, chk=i;
            arr[i]<tab[i] ? gap=1 : gap=-1;
            for (int j=i+1;j<N;j++){
                if (arr[j]+gap<0)
                    break;
                if ((arr[j]>tab[j] && gap==-1) || (arr[j]<tab[j] && gap==1))
                    cnt++;
                else
                    cnt--;
                if (cnt>max){
                    max=cnt;
                    chk=j;
                }
            }
            for (int j=i;j<=chk;j++)
                arr[j]+=gap;
            ans++;
        }
    }
    cout << ans;
    return 0;
}
728x90

'Programming > BOJ' 카테고리의 다른 글

[백준/BOJ] 1516 게임 개발  (0) 2020.09.29
[백준/BOJ] 17251 힘 겨루기  (0) 2020.09.29
[백준/BOJ] 1577 도로의 개수  (0) 2020.09.28
[백준/BOJ] 14370 전화번호 수수께끼 (Large)  (0) 2020.09.27
[백준/BOJ] 4388 받아올림  (0) 2020.09.27
Comments