728x90
문제설명

다음과 같은 n*n 배열 구조를 출력해보자.

입력이 3인 경우 다음과 같이 출력한다.
1 2 3
4 5 6
7 8 9

입력이 5인 경우는 다음과 같이 출력한다.
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
21 22 23 24 25

입력이 n인 경우의 2차원 배열을 출력해보자.

 

 

입력

첫 번째 줄에 배열의 크기 n이 입력된다.
[입력값의 정의역]
1<= n <= 100

 

 

출력

n*n 크기의 배열을 설명과 같이 채워 출력한다.

 

 

입력예시

4

 

 

출력예시

1 2 3 4

5 6 7 8

9 10 11 12

13 14 15 16

 


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

이 문제가 갑작스럽게 막혔는데 이유는 바로 배열의 범위때문이었다. 문제를 잘 읽어야 한다. 100까지 해준다고 하므로 1개자리를 더 만들어서 101로 만들면된다. 굳이 n을 저장해서 그 범위로 배열을 만들어주지 않아도 되는 것이다. 그리고 숫자를 어떻게 차례대로 할지 고민이 굉장히 많았다. i+j+1도 생각했는데 직접 써보니 오류가 있었고 m 같이 변수를 1부터 시작하도록 하고 매번 1씩 더해주는 방식이 가장 적절하다는 생각이 들었다.

그리고 줄만다 바꾸어주는 것 잊지말고.... for문에서는 각 n씩 범위를 만들어주면 큰 문제가 나오지는 않을 것이다.

728x90
728x90
문제

주어지는 문장의 대문자를 소문자로, 소문자를 대문자로 변경하는 프로그램을 작성하라.

 

 

입력

한 줄의 공백없는 문장이 입력된다.(최대 길이:1000)

 

 

출력

대소문자를 서로 변환한 결과를 출력한다.

 

 

입력예시

CodeChallenge2014withMSP

 

 

출력예시

cODEcHALLENGE2014WITHmsp


 

#include <stdio.h>
int main(void){
    char alp[1000];
    scanf("%s", alp);
    for(int i=0;alp[i]!='\0';i++){
        if(alp[i]>=65&&alp[i]<=90){
            alp[i]+=32;
        }
        else if(alp[i]>=97&&alp[i]<=122){
            alp[i]-=32;
        }
    }
    for(int i=0;alp[i]!='\0';i++){
        printf("%c", alp[i]);
    }
}

이 문제는 문자열을 바꾸어 주는 문제이다. 그래서 바로 아스키 코드를 생각해냈다.

이것을 활용해서 문제를 풀수 있다.

for문은 끝을 알 수 없기에 문자끝일 경우에 종료하도록 끝부분을 정리해주었고 안에 if else를 활용해 할 수 있었다. 그리고 아스키 코드를 보면서 풀어냈다. 대문자는 65이상 90이하이므로 &&로 연결해서 소문자와의 간격인 32를 더해주었다. 소문자는 97이상 122이하이므로 여기서 대문자가 되기 위해서 32를 빼주었다. 그리고 마무리로 for문을 활용해 문자를 출력해준다. 각각을 출력해주는 것이므로 %c로 해주어야 하고 이렇게 하면 정상적으로 출력이 된다.

728x90
728x90

26-1

문제1) 세 개의 정수를 인자로 받아서 이 세 정수의 덧셈겨로가와 곱셈결과를 반환하는 매크로 함수를 각각 정의해보자.

#include <stdio.h>
#define ADD(x,y,z) ((x)+(y)+(z))
#define MUL(x,y,z) ((x)*(y)*(z))

int main(void){
    printf("3+4+5=%d\n", ADD(3,4,5));
    printf("3*4*5=%d\n", MUL(3,4,5));
    return 0;
}

이것은 크게 어렵지 않았다. 일단 모든 것의 시작인 printf를 해주는 stdio.h를 선언해주고 정의를 더하기와 곱하기를 해준다. 그리고 한칸 띄워서 x,y,z를 더해주고 곱하는 식을 작성한다. 이때 잘못 계산되지 않도록 괄호를 최대한 해준다.

출력 식을 적을 때 나는 약간의 실수를 하였는데 x,y,z로 호출식을 작성한 것이다. 여기서는 반드시 숫자를 써주도록 하자. 그래야 알아서 x,y,z에 자리별로 맞추어 넣어준다.


문제2) 원주율 PI를 매크로 상수로 정의하고 이를 이용해서 원의 넓이를 구하는 매크로 함수 AREA를 정의해보자

#include <stdio.h>
#define PI 3.1415
#define AREA(r) ((r)*(r)*PI)

int main(void){
    double rad;
    scanf("%lf", &rad);
    printf("원의 넓이는: %g", AREA(rad));
}

이번 문제는 문제를 절반만 읽고 해서 틀렸었다. 두개 다 매크로 상수 정의하는 건데.... 그리고 값을 가져올 때는 괄호를 이용해 새로운 변수를 넣어주자. 그리고 double은 소수점까지 나올 수 있는 것이기 때문에 실수로 선언을 해주어야 하고 실수 저장 타입인 %lf를 이용해서 해주어야 한다. 그리고 내가 잘 몰랐던 부분이 있었는데 바로 원 넓이 출력부분이다. 평소에 %c와 %d만 써서 잘 몰랐는데 %g는 실수형 자동 출력 형태라고 한다. 이런 경우를 대비해서 잘 알아놓아야 겠다. 코드가 다들 짧고 복습 차원인것 같다.


문제3) 두 값의 크기를 비교하여 큰 값을 반환하는 매크로 함수 MAX를 정의해보자. 참고로 이는 조건 연산자를 이용해서 정의하는 것이 바람직하다.

#include <stdio.h>
#define MAX(x,y) ((x>y)? (x):(y))

int main(void){
    int a,b;
    scanf("%d %d", &a, &b);
    printf("%d", MAX(a,b));
    return 0;
}

이 문제는 앞에서 배웠던 조건 연산자를 생각해내는 것이 필요한 것이었다. 조건 연산자로 x, y를 만들어준다. 그리고 입력을 받아야 하므로 int 와 scanf를 통해 값을 저장해서 a, b를 x,y로 전달해주었다. 이렇게 값이 저장되어 있다면 얼마든지 호출시에 변수를 숫자 쓰지 않아도 된다. 크게 어렵지 않은 문제였다.

 

 

열혈 C의 단원별 문제는 이제 끝!

728x90

'C language > 열혈C 문제풀이' 카테고리의 다른 글

[C] 열혈 C 문제풀이 25  (0) 2021.08.12
[C] 열혈C 문제풀이 24  (0) 2021.08.12
[C] 열혈C 문제풀이 17-1  (0) 2021.08.12
[C] 열혈C 문제풀이 16-1  (0) 2021.08.12
[C] 열혈C 문제풀이 14-1  (0) 2021.08.12

+ Recent posts