KMU/algolab

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

happykoa 2020. 3. 31. 10:16

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

 

1주차 과제 제출 기한이 지났고 사이트 내에서 코드도 열람이 가능해졌기 때문에 풀이를 정리해도 될 것 같아 정리해보겠습니다.

 

1. 주어진 정수의 합 구하기

문제의 범위도 작고, 따로 생각해야 할 부분이 없는 문제입니다.

처음 알고리즘 문제를 접한 사람이라도, 변수의 초기화를 신경을 썼다면 잘 해냈을 것 같습니다.

#include <iostream>
using namespace std;
int T,N,A,S;
int main() {
    cin >> T;
    while(T--) {
        cin >> N;
        S = 0;
        for(int x = 0; x < N; x++) {
            cin >> A;
            S+=A;
        }
        cout << S << "\n";
    }
}

2. 주어진 정수의 최대 최소 구하기

이 문제 또한, 바로 구현하면 되는 문제입니다.

최대 최소 문제에서, 무엇을 시작 기준값으로 잡을지에 대해서 고민해보고, 첫번째 값을 기준으로 잡으면 됐습니다.

#include <iostream>
using namespace std;
int T,N,Mx,Mn,A;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> T;
    while(T--) {
        cin >> N >> A;
        Mx = Mn = A;
        for(int x=1; x<N; x++) {
            cin >> A;
            if(Mx < A) Mx = A;
            if(Mn > A) Mn = A;
        }
        cout<<Mx << " " << Mn << "\n";
    }
}

3. 부활절 날짜 구하기

첫번째 주의 과제 문제중에 제일 복잡했던(짜증났던) 구현 문제입니다.

문제에서 주어지는 값들을 하나하나 체크해가면서 신중하게 구현했으면 해결할 수 있었습니다.

#include <iostream>
using namespace std;
typedef long long ll;
ll tc,Y,C,N,T,I,J,K,L,P,Q,month,day;
int main() {
    cin >> tc;
    while(tc--) {
        cin >> Y;
        C = Y/100; // 2
        N = Y - (Y/19)*19; //3
        T = (C-17)/25; // 4
        I = C - (C/4 + (C-T)/3) + N*19 + 15; // 5, 6, 7
        J = I - (I/30)*30; // 8
        K = J - ((J/28) * (J/28 -1) * (29 / (J+1) * ((21-N)/11))); // 9,10,11,12,13
        L = ((Y + Y/4) + J + 2) - C + C/4; // 14, 15
        P = L - ((L/7)*7); // 16
        Q = K - P; //17
        month = (Q+40) / 44 + 3; // 18
        day = (Q + 28) - ((month/4)*31); // 19
        cout << month << " " << day << "\n";
    }
}

4. 두 정수 사이의 모든 정수의 합 구하기

이 문제를 해결하는 방법은 크게 두 가지가 있습니다.

- 반복문(O(n))으로 순회하면서 더하기

- 수학 공식 쓰기

 

저는 수학 공식을 쓰는 방법을 썼습니다.

a 부터 b까지(a<b)의 자연수의 합을 구하려한다면 ( 0~b 까지의 합) - (0~a-1 까지의 합)을 구하면 됩니다.

#include <iostream>
int T,m,n;
int main() {
    std::cin >> T;
    while(T--) {
        std::cin >> m >> n;
        std::cout << (n*(n+1) - m*(m-1))/2 << "\n";
    }
}

추가적으로, 

ios::sync_with_stdio(0);
cin.tie(0);

이와 같은 코드는 cin의 입력 속도를 빠르게 해준다고만 생각하고 넘어가시면 될 것 같습니다.

 

Rmx