KMU/algolab

[KMU - algolab] c++ 프로그래밍 week 4 과제 풀이

happykoa 2020. 4. 20. 15:37

algolab은 국민대학교 소프트웨어학부 수업에서 사용되는 온라인 저지?(과제 제출 사이트)입니다.

 

이전 주차들과 마찬가지로 4주차 과제 제출 기한이 끝났기 때문에, 한번 풀이를 작성해보겠습니다.

 

15. 패리티비트

파일 입출력에 관해서는 이전글에 남겨놨습니다.

-> 2020/04/14 - [KMU/algolab] - [KMU-algolab] c++ 프로그래밍 파일 입출력

 

이 문제는 int형보다는 unsigned int 자료형을 아는지 물어보는 문제다! 라는 느낌이 보자마자 강하게 왔었습니다.

왜냐하면, 32bit를 사용하면서, 맨 앞 비트(MSB)가 부호를 결정하게 되는 것이 아닌, MSB를 제외한 31자리에 있는 1의 개수가 짝수인지 홀수인지를 나타내야 했고, 이 결과를 음수로 출력하면 안 됐기 때문입니다.

 

아무튼, 일단 코드부터 보시죠.

#include <fstream>
#include <iostream>
using namespace std;

int tc,cnt;
unsigned int N,N2,z;
int main() {
    ifstream in("input.txt");

    z = 1<<31;
    if (in.is_open()) {
        in >> tc;
        while(tc--) {
            in >> N;
            N2 = N;
            cnt = 0;
            while(N2 > 0) {
                if(N2 %2 == 1) cnt++;
                N2/=2;
            }
            if(cnt%2==0) {
                cout << N << "\n";
            }
            else {
                cout << N+z <<"\n";
            }
        }
    }
    return 0;
}

z라는 변수에는 1<<31을 넣어놨습니다. 한마디로, 1뒤에 0이 31개 나열된 이진수를 넣었습니다.

그리고 나서, 각 케이스별로 N을 입력받았고, 1의 개수를 세준 뒤, 1의 개수의 짝수 여부에 따라 z의 덧셈 여부를 결정했습니다. (z를 왜 더하기만 하면 되는지는 문제 조건과 함께 몇 가지 예제들을 직접 끄적여보시면 이해하실 것 같습니다.)

16. 소수

따로, 많은 설명이 필요없을 것 같습니다.

단지 N이라는 숫자가 소수인지를 판단할 때, 2부터 sqrt(N)까지만의 범위만으로 숫자로 나누었을 때, 나머지가 0인지 판단하면 된다는 사실만 기억하시면 될 것 같습니다.

#include <fstream>
#include <iostream>
#include <string>

using namespace std;

int tc;
int N;
int main() {
    ifstream in("input.txt");

    if (in.is_open()) {
        in >> tc;
        while(tc--) {
            in >> N;
            bool chk = true;
            for(int x=2; x*x <= N; x++) {
                if(N%x==0) {
                    cout << 0 << "\n";
                    chk = false;
                    break;
                }
            }
            if(chk) cout << 1 << "\n";
        }
    }
    return 0;
}

17. 다각형면적

이 문제도,문제 지문에 겁내지 않으면 바로 해결할 수 있었습니다.

이미, 다각형에 포함되어 있는 점들은  시계방향 혹은 반시계방향으로 정렬되어기 때문에 문제에 주어진 공식을 바로 활용하면 됩니다. 단, 계산을 할 때, 0번째 점과 n-1번째 점도 이어져 있다는 사실을 잊으면 안됩니다.

#include <iostream>
using namespace std;
int tc;
int n;
int x[110],y[110];

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin >> tc;
    while(tc--) {
        int s = 0;
        cin >> n;
        for(int i=0; i<n; i++) {
            cin >> x[i] >> y[i]; 
        }
        for(int i=0; i < n; i++) {
            s += (x[i] + x[(i+1)%n]) * (y[(i+1)%n]-y[i]);
        }
        if(s < 0) {
            cout << -s << " -1\n";
        }
        else {
            cout << s << " 1\n";
        }
    }
}

 

이번주차는 저번주차에 비해 쉬웠던 것 같네요.

 

빨리 빨리 풀어 재꼈습니다.

아무튼,

Rmx