백준: Silver5② - 1064, 1094, 1158

1 분 소요


</br> 풀다 보니까 실버 4로 올랐다.

일단 이미 푼 실버 5는 이까지~~
</br>

1064: 평행사변형

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

세 개의 점을 입력 받고 만들어질 수 있는 평행사변형들의 가장 긴 둘레와 짧은 둘레의 차 구하기

    double d1 = dist(x1,y1, x2,y2);
    double d2 = dist(x2,y2, x3,y3);
    double d3 = dist(x3,y3, x1,y1);

    vector<double> v;
    v.push_back( (d1+d2) * 2.0 );
    v.push_back( (d2+d3) * 2.0 );
    v.push_back( (d3+d1) * 2.0 );

    sort(v.begin(), v.end());
    cout << v[2] - v[0] << endl;

처음 봤을 땐 점을 구해야 하나? 갑자기 실버 5가 왤케 어려워 했는데
좀 더 보니까 둘레 얘기 밖에 없으니 점을 구할 필요가 없다.

평행사변형은 어차피 두 변이 같은데 점 3개를 가지고 보면 다른 변 길이가 3개 구해진다.
이 다른 변 3개끼리 또 조합한 3가지 둘레 길이를 벡터에 넣고 정렬 후 가장 큰 둘레와 작은 둘레의 차를 프린트한다.
그림 그려 보면 바로 앎ㅎㅎ
</br>

1094: 막대기

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

설명이 긴데
결국 그냥 23 = 16 + 4 + 2 + 1 같은 말

    int m = 64, cnt = 0;
    while( n ){
        if( m > n ){
            m /= 2;
        }
        else if( m <= n ){
            cnt++;
            n -= m;
        }
    }

64에서부터 2로 나눠 가며 채우면 그냥 된다.
</br>

1158: 요세푸스 문제

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

요세푸스 순열 구하기.
원탁에 앉은 사람들이 있고, k번째 사람을 계속 제거한다.

    vector<int> v;
    for(int i = 1; i < n+1; i++){
        v.push_back(i);
    }

    queue<int> q;
    int i = 0, j = 0;
    while( v.size() ){
        if( j == k-1 ){
            q.push(v[i]);
            v.erase(v.begin() + i);
            j = 0;
        }
        else{
            i++;
            i %= v.size();
            j++;
        }
    }

    cout << '<';
    while( q.size() != 1 ){
        cout << q.front() << ", ";
        q.pop();
    }
    cout << q.front() << ">\n";

출력 방식이 좀 특이해서 편하게 큐에 저장해뒀다가 출력했다.

벡터를 원탁이라고 보고, 원탁에 사람이 없을 때까지 없앤다.
i는 인덱스, j는 k번째인지를 센다. 원탁처럼 봐야 하므로 i는 모듈러 연산을 해 준다.
</br>


다음엔 실버 4 문제들~~
</br>

댓글남기기