728x90

백준 C언어 공부 2024.11.17
10828번 스택

1. 문제
정수를 저장하는 스택을 구현한 다음, 입력으로 주어지는 명령을 처리하는 프로그램을 작성하시오.

명령은 총 다섯 가지이다.

push X정수 X를 스택에 넣는 연산이다.
pop: 스택에서 가장 위에 있는 정수를 빼고, 그 수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.
size스택에 들어있는 정수의 개수를 출력한다.
empty스택이 비어있으면 1, 아니면 0을 출력한다.
top: 스택의 가장 위에 있는 정수를 출력한다. 만약 스택에 들어있는 정수가 없는 경우에는 -1을 출력한다.

2. 입력
첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 
둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 
주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 
문제에 나와있지 않은 명령이 주어지는 경우는 없다.

3. 출력
출력해야하는 명령이 주어질 때마다, 한 줄에 하나씩 출력한다.

>>>코드

#include<stdio.h>
#include<string.h>

void stack(int *stk, char command[]);

int main(){
    int n;
    scanf("%d", &n);
    
    int stk[10000];
    char cmd[6];
    for (int i = 0; i<n; i++){
        scanf("%s", cmd);
        stack(stk, cmd);
    }
    
    return 0;
}

void stack(int *stk, char command[]){
    int length = 0, *p;
    
    for (p = stk; p<stk+10000; p++){
        if (*p == 0) break;
        length++;
    }
    
    if (strcmp(command, "push") == 0){
        int n;
        scanf("%d", &n); 
        getchar();
        for (p = stk+length; p>stk; p--){
            *p = *(p-1);
        }    
        *stk = n;
    }
    else if (strcmp(command, "pop") == 0){
        if (length != 0){
            printf("%d\n", *stk);
            for (p = stk; p<stk+length; p++){
                *p = *(p+1);
            }
        }
        else printf("-1\n");
    }
    else if (strcmp(command, "size") == 0){
        printf("%d\n", length);
    }
    else if (strcmp(command, "empty") == 0){
        if (length == 0){
            printf("1\n");
        }
        else{
            printf("0\n");
        }
    }
    else if (strcmp(command, "top") == 0){
        if (length != 0) printf("%d\n", *stk);
        else printf("-1\n");
    }
    else{
        printf("ERROR\n");
    }
}



4. 문제링크
https://www.acmicpc.net/problem/10828

728x90
728x90

20240327 백준 C언어 공부
2587번 대표값2

1. 문제
어떤 수들이 있을 때, 그 수들을 대표하는 값으로 가장 흔하게 쓰이는 것은 평균이다. 
평균은 주어진 모든 수의 합을 수의 개수로 나눈 것이다. 
예를 들어 10, 40, 30, 60, 30의 평균은 (10 + 40 + 30 + 60 + 30) / 5 = 170 / 5 = 34가 된다.

평균 이외의 또 다른 대표값으로 중앙값이라는 것이 있다. 
중앙값은 주어진 수를 크기 순서대로 늘어 놓았을 때 가장 중앙에 놓인 값이다. 
예를 들어 10, 40, 30, 60, 30의 경우, 크기 순서대로 늘어 놓으면

10 30 30 40 60

이 되고 따라서 중앙값은 30이 된다.

다섯 개의 자연수가 주어질 때 이들의 평균과 중앙값을 구하는 프로그램을 작성하시오.

2. 입력
첫째 줄부터 다섯 번째 줄까지 한 줄에 하나씩 자연수가 주어진다. 
주어지는 자연수는 100 보다 작은 10의 배수이다.

3. 출력
첫째 줄에는 평균을 출력하고, 둘째 줄에는 중앙값을 출력한다. 
평균과 중앙값은 모두 자연수이다.

>>>코드

# include <stdio.h>

int main(void){
    int n[5], tmp, avg = 0;
    for (int i = 0; i< 5; i++){
        scanf("%d", &n[i]);
        avg += n[i];
    }
    avg /= 5;
    for (int i = 0; i<5; i++){
        for (int j = 0; j<4-i; j++){
            if (n[j] > n[j+1]){
                tmp = n[j];
                n[j] = n[j+1];
                n[j+1] = tmp;
            }
        }
    }
    printf("%d\n%d", avg, n[2]);
}



>>>문제링크
https://www.acmicpc.net/problem/2587

728x90
728x90

20240326 백준 C언어 공부
2750번 수 정렬하기

1. 문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 
이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

3. 출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

>>>코드

# include <stdio.h>
int main(void){
    int n, num[1000], tmp;
    scanf("%d", &n);
    for (int i = 0; i< n; i++){
        scanf("%d", &num[i]);
    }
    for (int i = 0; i<n; i++){
        for (int j = 0; j<n-i-1; j++){
            if (num[j] > num[j+1]){
                tmp = num[j];
                num[j] = num[j+1];
                num[j+1] = tmp;
            }
        }
    }
    for (int i = 0; i<n; i++){
        printf("%d\n", num[i]);
    }
}



>>>문제링크
https://www.acmicpc.net/problem/2750

728x90
728x90

202403025 백준 C언어 공부
11658번 소인수분해

1. 문제
정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

3. 출력
N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. 
N이 1인 경우 아무것도 출력하지 않는다.

>>>코드

# include <stdio.h>
int main(void){
    int n, copy;
    scanf("%d", &n);
    copy = n;
    for (int i = 2; i<=n; i++){
        if (copy == 1) break;
        while (1){
            if (copy%i == 0){
                printf("%d\n", i);
                copy /= i;
            }
            else break;
        }
    }
    
    return 0;
}



>>>문제링크
https://www.acmicpc.net/problem/11653

728x90
728x90

20240324 백준 C언어 공부
2581번 소수

1. 문제
자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 
이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 
60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 
이들 소수의 합은 620이고, 최솟값은 61이 된다.

2. 입력
입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다.
M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

3. 출력
M이상 N이하의 자연수 중 소수인 것을 모두 찾아 
첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 
단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

>>>코드

# include <stdio.h>
int main(void){
    int n, m, min, sum, cnt, flag;
    scanf("%d", &n);
    scanf("%d", &m);
    sum = 0, cnt = 0;
    for (int i = n; i <= m; i++){
        flag = 1;
        for (int j = 2; j<i; j++){
            if (i%j == 0){
                flag = 0;
                break;
            }
        }
        if (flag == 1 && i != 1){
            sum += i;
            cnt++;
            if (cnt == 1) min = i;
        }
    }
    if (cnt == 0) printf("-1");
    else {
        printf("%d\n", sum);
        printf("%d", min);
    }
    
    return 0;
}



>>>문제링크
https://www.acmicpc.net/problem/2581

728x90
728x90

20240323 백준 C언어 공부
1978번 소수 찾기

1. 문제
주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

2. 입력
첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 
다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

3. 출력
주어진 수들 중 소수의 개수를 출력한다.

>>>코드

# include <stdio.h>
int main(void){
    int n, x, flag, cnt = 0;
    scanf("%d", &n);
    for (int i = 0; i<n; i++){
        scanf("%d", &x);
        flag = 1;
        for (int j = 2; j<x; j++){
            if (x%j == 0){
                flag = 0;
                break;
            }
        }
        if (flag == 1 && x != 1) cnt++;
    }
    printf("%d", cnt);
    
    return 0;
}



>>>문제링크
https://www.acmicpc.net/problem/1978

728x90
728x90

20240322 백준 C언어 공부
9506번 약수들의 합

1. 문제
어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.
예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.
n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

2. 입력
입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100,000)
입력의 마지막엔 -1이 주어진다.

3. 출력
테스트케이스 마다 한줄에 하나씩 출력해야 한다.
n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).
이때, 약수들은 오름차순으로 나열해야 한다.
n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.

>>>코드

# include <stdio.h>
int main(void){
    int n, x[1000000], cnt = 0, total = 0;
    while (1){
        cnt = 0, total = 0;
        scanf("%d", &n);
        if (n == -1) break;
        for (int i = 1; i<n; i++){
            if (n%i == 0){
                x[cnt] = i;
                cnt++;
                total += i;
            }
        }
        if (total == n){
            printf("%d = ", n);
            for (int i = 0; i<cnt-1; i++){
                printf("%d + ", x[i]);
            }
            printf("%d\n", x[cnt-1]);
        }
        else printf("%d is NOT perfect.\n", n);
    }
}



>>>문제링크
https://www.acmicpc.net/problem/9506

728x90
728x90

20240321 백준 C언어 공부
2501번 약수 구하기

1. 문제
어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다. 

6을 예로 들면
- 6 ÷ 1 = 6 … 0
- 6 ÷ 2 = 3 … 0
- 6 ÷ 3 = 2 … 0
- 6 ÷ 4 = 1 … 2
- 6 ÷ 5 = 1 … 1
- 6 ÷ 6 = 1 … 0

그래서 6의 약수는 1, 2, 3, 6, 총 네 개이다.
두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. 
N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.

3. 출력
첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 
만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.

>>>코드

# include <stdio.h>
int main(void){
    int n, k, cnt = 0;
    scanf("%d %d", &n, &k);
    for (int i = 1; i<=n; i++){
        if (n%i == 0){
            cnt++;
        }
        if (cnt == k){
            printf("%d", i);
            break;
        }
    }
    if (cnt < k) printf("0");
}


>>>문제링크
https://www.acmicpc.net/problem/2501

728x90

+ Recent posts