728x90

20240317 백준 C언어 공부
2566번 최댓값

1. 문제
<그림 1>과 같이 9×9 격자판에 쓰여진 81개의 자연수 또는 0이 주어질 때, 
이들 중 최댓값을 찾고 그 최댓값이 몇 행 몇 열에 위치한 수인지 구하는 프로그램을 작성하시오.

예를 들어, 다음과 같이 81개의 수가 주어지면

  1열 2열 3열 4열 5열 6열 7열 8열 9열
1행 3 23 85 34 17 74 25 52 65
2행 10 7 39 42 88 52 14 72 63
3행 87 42 18 78 53 45 18 84 53
4행 34 28 64 85 12 16 75 36 55
5행 21 77 45 35 28 75 90 76 1
6행 25 87 65 15 28 11 37 28 74
7행 65 27 75 41 7 89 78 64 39
8행 47 47 70 45 23 65 3 41 44
9행 87 13 82 38 31 12 29 29 80

이들 중 최댓값은 90이고, 이 값은 5행 7열에 위치한다.

2. 입력
첫째 줄부터 아홉 번째 줄까지 한 줄에 아홉 개씩 수가 주어진다. 
주어지는 수는 100보다 작은 자연수 또는 0이다.

3. 출력
첫째 줄에 최댓값을 출력하고, 둘째 줄에 최댓값이 위치한 행 번호와 열 번호를 빈칸을 사이에 두고 차례로 출력한다. 
최댓값이 두 개 이상인 경우 그 중 한 곳의 위치를 출력한다.

>>>코드

# include <stdio.h>
int main(void){
    int x[9][9], max = -1, row, col;
    for (int i = 0; i<9; i++){
        for (int j = 0; j<9; j++){
            scanf("%d", &x[i][j]);
            if (max < x[i][j]){
                max = x[i][j];
                row = i+1;
                col = j+1;
            }
        }
    }
    getchar();
    printf("%d\n", max);
    printf("%d %d",row, col);
    
    return 0;
}



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

728x90
728x90

20240312 백준 C언어 공부
11718번 그대로 출력하기

1. 문제
입력 받은 대로 출력하는 프로그램을 작성하시오.

2. 입력
입력이 주어진다. 
입력은 최대 100줄로 이루어져 있고, 알파벳 소문자, 대문자, 공백, 숫자로만 이루어져 있다. 
각 줄은 100글자를 넘지 않으며, 빈 줄은 주어지지 않는다. 
또, 각 줄은 공백으로 시작하지 않고, 공백으로 끝나지 않는다.

3. 출력
입력받은 그대로 출력한다.

>>>코드0. 실패. 입력 초과

#include <stdio.h>
int main(void){
    char c[101];
    while (scanf("%[^\n]s", c) != EOF){
        printf("%s\n", c);
    }
    return 0;
}



scanf 함수를 사용할 때 %[^\n]s 형식으로 문자열을 입력받는데, 
이때 개행 문자가 나올 때까지의 모든 문자를 입력 받는다. 
이는 입력 버퍼를 완전히 비워버리므로, 
다음에 호출되는 scanf 함수가 개행 문자를 만나도 입력을 받지 않게 된다.

예를 들어, 입력으로 "Hello World\n"가 주어졌을 때, 
이 코드는 "Hello World"를 출력하고 개행 문자를 읽지 않는다. 
그래서 다음 호출되는 scanf 함수가 개행 문자를 입력으로 받아들이게 된다.

>>>코드1. 문자열로 입력받기

#include <stdio.h>
int main(void){
    char c[101];
    while (scanf("%[^\n]s", c) != EOF){
        printf("%s\n", c);
        getchar(); //getchar()로 버퍼에 남은 개행문자를 없애버린다
    }
    return 0;
}



>>>코드2. 문자로 입력받기

#include <stdio.h>
int main(void){
    char c;
    while (scanf("%c", &c) != EOF){
        printf("%c", c);
    }
    return 0;
}


>>>코드 설명
scanf()는 ' '(space), '\t'(tab), '\n'(enter)를 모두 구분자로 사용한다. 
따라서 공백을 포함한 줄 전체를 입출력하기 위해선 getchar() 또는 fgets()가 필요하다.

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

728x90
728x90

20240310 백준 C언어 공부
2908번 상수

1. 문제
상근이의 동생 상수는 수학을 정말 못한다. 상수는 숫자를 읽는데 문제가 있다. 
이렇게 수학을 못하는 상수를 위해서 상근이는 수의 크기를 비교하는 문제를 내주었다. 
상근이는 세 자리 수 두 개를 칠판에 써주었다. 그 다음에 크기가 큰 수를 말해보라고 했다.

상수는 수를 다른 사람과 다르게 거꾸로 읽는다. 
예를 들어, 734와 893을 칠판에 적었다면, 상수는 이 수를 437과 398로 읽는다. 
따라서, 상수는 두 수중 큰 수인 437을 큰 수라고 말할 것이다.

두 수가 주어졌을 때, 상수의 대답을 출력하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 상근이가 칠판에 적은 두 수 A와 B가 주어진다. 
두 수는 같지 않은 세 자리 수이며, 0이 포함되어 있지 않다.

3. 출력
첫째 줄에 상수의 대답을 출력한다.

>>>코드

#include <stdio.h>
int main(void){
    int n, m, N = 0, M = 0;
    scanf("%d %d", &n, &m);
    while (n > 0){
        N = N*10 + n%10;
        n /= 10;
    }
    while (m > 0){
        M = M*10 + m%10;
        m /= 10;
    }
    if (N > M) printf("%d", N);
    else printf("%d", M);
}



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

728x90
728x90

20240309 백준 C언어 공부
1152번 단어의 개수

1. 문제
영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 
이 문자열에는 몇 개의 단어가 있을까? 이를 구하는 프로그램을 작성하시오. 
단, 한 단어가 여러 번 등장하면 등장한 횟수만큼 모두 세어야 한다.

2. 입력
첫 줄에 영어 대소문자와 공백으로 이루어진 문자열이 주어진다. 
이 문자열의 길이는 1,000,000을 넘지 않는다. 
단어는 공백 한 개로 구분되며, 공백이 연속해서 나오는 경우는 없다. 
또한 문자열은 공백으로 시작하거나 끝날 수 있다.

3. 출력
첫째 줄에 단어의 개수를 출력한다.

>>>코드1

#include <stdio.h>
int main(void){
    char c[1000000];
    int count = 1;
    scanf("%[^\n]s", &c);
    if (strlen(c) == 1 && c[0] == ' ') count--;
    else{
        for (int i = 0; i < strlen(c); i++){
            if (c[i] == ' ') count++;
        }
        if (c[0] == ' ') count--;
        if (c[strlen(c)-1] == ' ') count--;
    }
    printf("%d", count);
}



>>>코드2

#include <stdio.h>
int main(void){
    char c[1000000];
    int count = 1;
    scanf("%[^\n]s", &c);
    if (strlen(c) == 1 && c[0] == ' ') count--;
    else{
        for (int i = 1; i < strlen(c)-1; i++){
            if (c[i] == ' ') count++;
        }
    }
    printf("%d", count);
}



>>> C언어에서 문자열에 공백을 포함해서 입력받고 싶다면 서식 지정자에 [^\n]을 붙여준다

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

728x90
728x90

20240308 백준 C언어 공부
2675번 문자열 반복

1. 문제
문자열 S를 입력받은 후에, 각 문자를 R번 반복해 새 문자열 P를 만든 후 출력하는 프로그램을 작성하시오. 
즉, 첫 번째 문자를 R번 반복하고, 두 번째 문자를 R번 반복하는 식으로 P를 만들면 된다. 
S에는 QR Code "alphanumeric" 문자만 들어있다.

QR Code "alphanumeric" 문자는 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ\$%*+-./: 이다.

2. 입력
첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 
각 테스트 케이스는 반복 횟수 R(1 ≤ R ≤ 8), 문자열 S가 공백으로 구분되어 주어진다. 
S의 길이는 적어도 1이며, 20글자를 넘지 않는다. 

3. 출력
각 테스트 케이스에 대해 P를 출력한다.

>>>코드

#include <stdio.h>
int main(void){
    int t, r;
    char s[20];
    scanf("%d", &t);
    for (int i = 0; i < t; i++){
        scanf("%d %s", &r, &s);
        for (int j = 0; j < strlen(s); j++){
            for (int k = 0; k < r; k++){
                printf("%c", s[j]);
            }
        }
        printf("\n");
    }
}



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

728x90
728x90

20240307 백준 C언어 공부
2163번 초콜릿 자르기

1. 문제
정화는 N×M 크기의 초콜릿을 하나 가지고 있다. 
초콜릿은 금이 가 있는 모양을 하고 있으며, 그 금에 의해 N×M개의 조각으로 나눠질 수 있다.

초콜릿의 크기가 너무 크다고 생각한 그녀는 초콜릿을 친구들과 나눠 먹기로 했다. 
이를 위해서 정화는 초콜릿을 계속 쪼개서 총 N×M개의 조각으로 쪼개려고 한다. 
초콜릿을 쪼갤 때에는 초콜릿 조각을 하나 들고, 적당한 위치에서 초콜릿을 쪼갠다. 
초콜릿을 쪼갤 때에는 금이 가 있는 위치에서만 쪼갤 수 있다. 
이와 같이 초콜릿을 쪼개면 초콜릿은 두 개의 조각으로 나눠지게 된다. 
이제 다시 이 중에서 초콜릿 조각을 하나 들고, 쪼개는 과정을 반복하면 된다.

초콜릿을 쪼개다보면 초콜릿이 녹을 수 있기 때문에, 정화는 가급적이면 초콜릿을 쪼개는 횟수를 최소로 하려 한다. 
초콜릿의 크기가 주어졌을 때, 
이를 1×1 크기의 초콜릿으로 쪼개기 위한 최소 쪼개기 횟수를 구하는 프로그램을 작성하시오.

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

3. 출력
첫째 줄에 답을 출력한다.

>>>코드

#include <stdio.h>
int main(void){
    int n, m;
    scanf("%d %d", &n, &m);
    printf("%d", n*m-1);
    return 0;
}



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

728x90
728x90

20240306 백준 C언어 공부
3046번 R2

1. 문제
두 숫자 R1과 R2가 있을 때, 두 수의 평균 S는 (R1+R2)/2와 같다. 
상근이는 정인이 생일 선물로 두 숫자 R1과 R2를 주려고 한다. 
생일 파티에서 상근이는 정인이에게 이 두 숫자를 말해주고, 정인이는 이 숫자를 받아 적는다. 
그리고 나서 기쁜 마음으로 1년동안 이 숫자를 외우면서 산다.

상근이는 R1과 R2를 엄청난 고민 끝에 정했다. 
작년에는 R1과 R2를 까먹어서 아무 숫자나 정해서 주었기 때문에, 
올해는 까먹지 않기 위해서 평균 S도 같이 기억하려고 한다.

오늘은 정인이 생일이다. 
5분 후에 상근이는 생일 선물로 두 숫자 R1과 R2를 말해주어야 하지만, 안타깝게도 R2를 까먹고 말았다. 
하지만 R1과 S는 기억하고 있다!

상근이를 도와 R2가 몇 인지 구하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 두 정수 R1과 S가 주어진다. 두 수는 -1000보다 크거나 같고, 1000보다 작거나 같다.

3. 출력
첫째 줄에 R2를 출력한다.

>>>코드

# include <stdio.h>
int main(void){
    int r1, s;
    scanf("%d %d", &r1, &s);
    printf("%d", s*2-r1);
}



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

728x90
728x90

20240227 백준 C언어 공부
3003번 킹, 퀸, 룩, 비숍, 나이트, 폰

1. 문제
동혁이는 오래된 창고를 뒤지다가 낡은 체스판과 피스를 발견했다.

체스판의 먼지를 털어내고 걸레로 닦으니 그럭저럭 쓸만한 체스판이 되었다. 
하지만, 검정색 피스는 모두 있었으나, 흰색 피스는 개수가 올바르지 않았다.

체스는 총 16개의 피스를 사용하며, 
킹 1개, 퀸 1개, 룩 2개, 비숍 2개, 나이트 2개, 폰 8개로 구성되어 있다.

동혁이가 발견한 흰색 피스의 개수가 주어졌을 때, 
몇 개를 더하거나 빼야 올바른 세트가 되는지 구하는 프로그램을 작성하시오.

2. 입력
첫째 줄에 동혁이가 찾은 흰색 킹, 퀸, 룩, 비숍, 나이트, 폰의 개수가 주어진다. 
이 값은 0보다 크거나 같고 10보다 작거나 같은 정수이다.

3. 출력
첫째 줄에 입력에서 주어진 순서대로 몇 개의 피스를 더하거나 빼야 되는지를 출력한다. 
만약 수가 양수라면 동혁이는 그 개수 만큼 피스를 더해야 하는 것이고, 음수라면 제거해야 하는 것이다.

>>>코드

# include <stdio.h>

int main(void){
    int king, queen, rook, bishop, knight, pawn;
    scanf("%d %d %d %d %d %d", &king, &queen, &rook, &bishop, &knight, &pawn);
    printf("%d %d %d %d %d %d", 1-king, 1-queen, 2-rook, 2-bishop, 2-knight, 8-pawn);
}



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

728x90

+ Recent posts