백준: Class 2 ① - 1085, 2108, 2292, 2609, 2798, 2839, 2869

2 분 소요


</br> 2로 올라가 보자
클래스 2는 실버 4, 5가 주를 이루고 있다.
</br>

1085: 직사각형에서 탈출

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

    int x, y, w, h;
    cin >> x >> y >> w >> h;
    cout << min({x, y, w-x, h-y}) << endl;

처음 보고 와 이거 생각보다 왤케 어려워~ 했는데 x, y의 범위를 보니 아주 쉬운 문제였다
범위를 꼭 꼭 잘 보자
</br>

2108: 통계학

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

    int sum = 0;
    for(int i = 0; i < n; i++){
        cin >> nums[i];
        sum += nums[i];
        t[nums[i]+4000]++;
    }

    sort(nums, nums+n);

    int p = *max_element(t, t+8001);
    int ans = 0;

    for(int i = 0; i < 8001; i++){
        if( t[i] == p ){
            if( ans ){
                ans = i-4000; break;
            }
            else ans = i-4000;
        }
    }

    cout << round((double)sum/n) << endl;
    cout << nums[n/2] << endl;
    cout << ans << endl;
    cout << nums[n-1] - nums[0] << endl;

가끔 이런 문제가 조금 당황스럽다
최빈값의 경우 map으로 해도 되지만 범위가 작길래(절댓값 4000 이내) 배열로 해 봄
</br>

2292: 벌집

https://www.acmicpc.net/problem/2292
1
벌집 문제는 다 이 인덱스인가

    if( n == 1 ){
        cout << 1 << endl;
        return 0;
    }
    int ans = 1, tmp = 2;
    while( 1 ){
        tmp += 6*ans;
        if( tmp > n ){
            cout << ans+1 << endl;
            break;
        }
        ans++;
    }

벌집 문제는 규칙 찾는 게 중요하다 주로 6이랑 관련 있지

1: 1
2: 2 ~ 7		6
3: 8 ~ 19	12
4: 20 ~ 37	18
5: 38 ~ 61

이 문제는 이런 식
</br>

2609: 최대공약수와 최소공배수

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

int gcd(int a, int b){
    if( b > a ) return gcd(b, a);
    if( a%b == 0 ) return b;
    return gcd(b, a%b);
}

gcd는 외워 둡시다
최소공배수는 a*b / gcd
</br>

2798: 블랙잭

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

void func(int now, int ind, int d){
    if( now > m ) return; // *
    if( d == 3 ){
        ans = max(ans, now);
        return;
    }
    for(int i = ind+1; i < n; i++){
        func(now+nums[i], i, d+1);
    }
}

기본적인 조합(브루트포스, 백트래킹)
표시한 if문처럼 바운드를 추가하면 더욱 효율적인 브랜치 & 바운드
</br>

2839: 설탕 배당

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

    int ans = -1;
    for(int i = n/5; i >= 0; i--){
        int k = n - 5*i;
        if( k % 3 == 0 ){
            ans = i + k/3;
            break;
        }
    }
    cout << ans << endl;

이게 왜 dp 문제라 되어 있을까 그냥 그리디 같은데
</br>

2869: 달팽이는 올라가고 싶다

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

    if( v < a ){
        cout << 1 << endl;
        return 0;
    }
    if( (v-a) % (a-b) == 0 ) cout << (v-a) / (a-b) + 1 <<endl;
    else cout << (v-a) / (a-b) + 2 <<endl;

예전에 메이플 스토리 만화에서 본 거 같은데ㅋㅋ
일단 입력이 a <= v라서 위의 if문은 필요 없긴 하다

0 ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ v
    (a-b) * (n-1) | a

이런 느낌으로 생각하면 쉽다
</br>


클래스 2 성공~~
</br>

댓글남기기