본문 바로가기
C/Baekjoon

[BOJ] 2022 SISS 1학기 스터디 - 1주차

by 단월໒꒱ 2022. 4. 3.

# 2609 : 최대공약수와 최소공배수 (Class 2)

[문제]

 

 

 

 

[코드 및 결과]

 

#include <stdio.h>

int get_gcd(num1, num2) {
    int gcd;
    for (int i = 1; i <= num1 && i <= num2; i++) {
        if (num1 % i == 0 && num2 % i == 0) gcd = i;
    }
    return gcd;
    
}

int main() {
    int A, B, gcd, lcm;
    
    scanf("%d %d", &A, &B);
    
    gcd = get_gcd(A, B);
    lcm = (A * B) / gcd;
    
    printf("%d\n%d\n", gcd, lcm);
    
    return 0;
}

 

 

 

 

 

 

[설명]

두 수를 입력하면 두 수의 최대공약수와 최소공배수를 구해서 출력하는 문제이다.

입력받을 두 수 A, B, 최대공약수 gcd, 최소공배수 lcm을 int형으로 선언한다.

num1, num2를 매개변수로 하여 최대공약수를 구하는 함수 get_gcd를 선언한다.

1부터 num1, num2가 될 때까지 1씩 증가하면서 num1, num2가 모두 i로 나누어떨어지면 그 수를 변수 gcd에 저장하고 이를 리턴한다.

위의 get_gcd로부터 구한 수를 gcd 변수에 저장하고, 최소공배수 lcm은 A와 B를 곱한 수를 gcd로 나눴을 때 나온 수를 저장한다.

마지막으로 위의 과정을 통해 구한 gcd, lcm을 출력한다.

 

 

 

# 10773 : 제로 (Class 2)

[문제]

 

 

 

 

[코드 및 결과]

 

#include <stdio.h>

int main() {
    int K, n, num[100000];
    int cnt = 0, sum = 0;
    
    scanf("%d", &K);
    
    for (int i = 0; i < K; i++) {
        scanf("%d", &n);
        
        if (n == 0) num[cnt--] = 0;
        else num[cnt++] = n;
    }
    
    for (int i = 0; i < cnt; i++) {
        sum += num[i];
    }
    
    printf("%d\n", sum);
    
    return 0;
}

 

 

 

 

 

 

[설명]

0을 입력 받으면 이전에 나온 수를 삭제하고 0이 아닌 수를 입력 받으면 수를 그대로 저장해서 그 수들을 모두 더한 값을 구하는 문제이다.

입력받을 수의 개수 K, 입력받을 수 n, 그 수들을 저장할 배열 num, 카운트값 cnt, 합계 sum을 int형으로 선언한다.

K개 만큼 수 n을 입력받는데, 입력받은 후에 n이 0이면 현재 cnt값 기준으로 이전 인덱스에 저장된 값을 0으로 바꾸고 아닌 경우에는 n을 그대로 저장해준다.

이렇게 구한 num 배열에 저장된 수들을 for문으로 한번 돌면서 sum에 하나씩 더해주고 그 값을 출력한다.

 

 

 

# 1037 : 약수 (자유 문제)

[문제]

 

 

 

[코드 및 결과]

 

#include <stdio.h>

int main() {
    int num, divisor[50], N, max = 2, min = 1000000;
    
    scanf("%d", &num); {
        for (int i = 0; i < num; i++) {
            scanf("%d", &divisor[i]);
            if (max < divisor[i]) max = divisor[i];
            if (min > divisor[i]) min = divisor[i];
        }
    }
    
    if (num == 1) N = divisor[0] * divisor[0];
    else N = max * min;
    
    printf("%d\n", N);
    
    return 0;
}

 

 

 

 

 

 

[설명]

약수의 개수와 약수를 입력 받고 이를 토대로 원래의 수를 구하면 되는 문제이다.

입력받을 약수의 개수 num, 약수를 저장할 배열 divisor, 원래의 수 N, 최댓값 max, 최솟값 min을 int형으로 선언한다.

for문을 이용하여 num 수만큼 약수를 입력 받는데, 입력받은 후 max, min 값과 비교하여 max, min 값을 업데이트해준다.

만약 입력받은 약수의 개수가 1개이면 완전제곱수이므로 N은 입력받은 약수를 제곱한 수가 되도록 해준다.

아닐 경우에는 입력받은 약수들 중에서 구한 최댓값과 최솟값을 곱한 수가 되도록 해준다.

(ex. 16의 약수는 1, 2, 4, 8, 16, 문제에 따르면 여기서 입력해야하는 수는 2, 4, 8. 최댓값과 최솟값을 곱하면 원하는 수를 구할 수 있음)

마지막으로 위의 과정을 통해 구한 원래의 수 N을 출력한다.

 

 

 

댓글