금지 키워드로 [ 가 설정되어 있으므로 인덱스 기능을 이용해서는 풀지 못하고, 역참조 연산자를 사용해야 한다.

(char 자료형 크기 * 100) 크기의 메모리를 할당한 포인터를 생성하고 할당한 메모리 공간에 문자열을 입력받는다.

부분 문자 시작 위치와 끝 위치로 사용할 변수 a,b를 선언하고 입력받는다.

반복문으로 a-1부터 b보다 작을때 까지 반복하여 역참조 연산자를 사용하여 문자를 출력한다.

정답은 다음 코드와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <stdlib.h>
 
int main() 
{
    char *sPtr = malloc(sizeof(char* 100);
    scanf("%s", sPtr);
    
    int a, b;
    scanf("%d %d"&a, &b);
    
    for(int i = a-1; i < b; i++)
    {
        printf("%c"*(sPtr + i));    // 역참조 연산자 
    }
    return 0;
}
cs

미로 크기의 2차원 배열을 만들고, 2중 for 문으로 각 요소의 값들을 입력받는다.

이후 무한 루프를 만들어 조건을 만족시키면 반복문을 탈출하는 구조로 코드를 구성하였다.

현재 좌표의 값이 2(먹이)면 현재 좌표를 9로 만들고 반복문을 종료한다.

이동할 위치가 0(이동가능)이면 9로 만들어 현재 위치를 이동하며, 이동할 위치가 1(벽)이면 오른쪽 또는 아래로 방향을 바꾼다. 방향을 바꿔도 이동할 위치가 1이면 반복문을 종료한다. 

위 작업을 수행하는 반복문에 주석을 달아 더 자세히 설명할 것이다. 

정답은 다음 코드와 같다.

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include  <stdio.h>
 
int main()
{
    int x = 2, y = 2;   // 초기 좌표값
    int miro[11][11= {};  // 미로 상자
    
    for(int i = 1; i <= 10; i++)    // 2차원 배열의 각 요소에 입력값을 받음
    {
        for(int j = 1; j <= 10; j++)
            scanf("%d"&miro[i][j]);
    }
    
    while(1)    // 무한루프
    {
        if(miro[x][y] == 2// 현재 좌표가 2면 
        {
            miro[x][y] = 9// 현재 좌표를 9로 만들고
            break;          // 반복문 종료
        }
        miro[x][y] = 9;     // 현재 좌표를 9로 만듬
        if(miro[x][y+1== 0)   // 아래쪽으로 이동 가능하면
            y += 1;             // y좌표값을 1 증가시킴
        else if(miro[x][y+1== 1)  // 아래 좌표가 벽이면
        {
            if(miro[x+1][y] == 1)   // 오른쪽도 벽이면
                break;              // 갈 곳이 없으므로 반복 종료
            else if(miro[x+1][y] == 2)  //오른쪽으로 이동한 좌표가 2(먹이)면
            {
                miro[x+1][y] = 9;   // 그 좌표를 9로 만들고
                break;              // 반복 종료
            }
            else    // 벽도 아니고 먹이도 아니면, 1칸 오른쪽으로 이동
                x += 1;
        }
        else if(miro[x][y+1== 2)   // 한 칸 아래 좌표가 2(먹이)면
        {
            miro[x][y+1= 9;       // 그 좌표애 9를 지정하고
            break;                  // 반복문 종료
        }
    }
    
    for(int  i = 1; i <= 10; i++)       // 위 반복문을 마친 후 미로 상자의 상태를 출력   
    {   
        for(int j = 1; j <= 10; j++)
            printf("%d ", miro[i][j]);
        printf("\n");
    }        
    return 0;
}
cs

 

바둑판을 표현하는 2차원 배열을 만들고, 흰 돌의 개수를 입력받는다. 

흰 돌의 개수만큼 반복하면서 흰 돌을 올릴 좌표를 입력 받고, 2차원 배열의 그 좌표를 1로 만든다.

2중 for문을 사용하여 흰 돌이 표현된 바둑판을 출력한다.

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
#include <stdio.h>
 
int main()
{
    int n, x, y;    // 입력 받을 변수, x좌표, y좌표
    int pan[20][20]={};    // 바둑판
    scanf("%d"&n);    // 흰돌 개수 입력
    
    for(int i = 1; i <= n; i++)    // 1부터 흰돌 개수 만큼 반복
        {
            scanf("%d %d"&x, &y);    // x좌표, y좌표 입력
            pan[x][y]=1;            // 입력 받은 좌표에 해당하는 요소를 1로 바꿈
        }
        
    for(int i = 1; i <= 19; i++)    // 2중 for문으로 2차원 배열 출력(세로줄 만큼 반복)
        {
            for(int j = 1; j <= 19; j++)    // 가로줄 만큼 반복
            {
                printf("%d ", pan[i][j]);     // 가로줄 출력
            }
            printf("\n");    // 줄바꿈
        }
    
    return 0;
}
cs

 

부른 번호를 하나 씩 배열에 저장하고, 저장한 배열을 역순으로 출력하면 된다.

먼저 10000 크기의 배열을 선언한다. 배열의 인덱스는 0부터 시작한다. 

부른 횟수를 입력받고, for 반복문으로 0부터 입력한 횟수보다 작을 때 까지 반복하면서 출석 번호를 배열의 각 요소에 입력받는다.

for 반복문으로 n보다 1 작은 수 에서 시작하여 0까지 반복하면서 배열의 각 인덱스를 출력하면 된다.

정답은 다음 코드와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <stdio.h>
 
 
int main()
{
    int n, a[10000];    // 입력 받을 횟수와 배열
    scanf("%d",&n);        // 횟수 입력
 
    for(int i = 0; i < n; i++)    // 0부터 입력한 횟수보다 작을 때 까지 반복
    {
        scanf("%d"&a[i]);        // 배열의 각 요소에 입력
    }
 
    for(int i= n - 1; i >= 0; i--)    // n-1 q부터 0까지 반복
    {
        printf("%d ", a[i]);        // n-1번 요소부터 역순으로 출력
    }
    return 0;
}
cs

 

수학에서 등차수열의 n번째 항 an을 구하는 공식은 a + (n - 1)d 이다. 

여기서 a는 등차 수열의 첫 번째 항을 의미하고 ,d는 공차를 의미한다. 위 문제의 설명에서는 시작값과 등차이다.

따라서 수를 입력받고 입력받은수를 등차수열 공식에 넣어 계산한 값을 출력하면 된다.

정답은 다음 코드와 같다.

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>
 
int main()
{
    int a,d,n,an;    // 입력받을 변수
    scanf("%d %d %d"&a, &d, &n);    // 입력
 
    an = a + (n-1)*d;    // 등차수열 n번째 항을 구하는 공식
    printf("%d", an);    // n번째 항 
    return 0;
}
cs

 

 

for 반복문으로 1부터 입력한 정수까지 반복시키고, 반복문 안에서 if문으로 i가 3의 배수일 때는 출력하지 않고 반복문 처음으로 돌아간다. 

3의 배수는 3으로 나눴을 때 나머지가 0이므로 나머지 연산자 %를 사용한다.

정답은 다음 코드와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    int n;    // 입력 받을 변수
    scanf("%d"&n);    // 입력
    for(int i = 1; i <= n; i++)    // 1부터 입력값보다 작거나 같을 때 까지 반복
    {
        if(i % 3 == 0)            // i를 3으로 나눴을 때 나머지가 0이면(3의 배수)
            continue;            // 아래 코드는 실행하지 않고 반복문 처음으로 돌아감
        printf("%d ", i);        // 출력
    }
    return 0;
}
cs

 

h, b, c, s를 각 각 입력받고, 문제 설명에 나온 공식대로 입력값을 모두 곱하면 소리 파일의 저장 용량을 계산할 수 있다.

그러나 계산한 값은 비트 단위이기 때문에 출력 예시처럼 MB 단위로 바꿔야 한다. 

문제 설명의 단위들을 보면 비트를 1024로 두번 나누고, 8로 한번 나누면 MB단위로 만들 수 있다. 

이때 자료형은 int 자료형과 float 자료형을 사용하면 계산 과정에서 자료형의 범위를 초과할 수 있기 때문에 정수는 long long 자료형과 실수는 double 자료형을 사용하였다. long long 자료형은 서식문자로 %lld를 사용하고, double 자료형은 서식문자로 %lf를 사용한다.

또한 소숫점 한자리만 출력해야 하기 때문에 %.1lf로 서식문자를 사용한다.

정답은 다음 코드와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
 
int main()
{
    long long int h, b, c, s;    // 입력받을 변수
    double result;                // 계산결과를 저장할 변수
    scanf("%lld %lld %lld %lld"&h, &b, &s, &c);    // 입력
    
    result = h * b * s * c;        // 계산한 결과 (bit 단위)
    printf("%.1lf MB", result/(8*1024*1024));    // 계산 결과를 MB단위로 바꾸어 출력
    return 0;
}
cs

 

for문으로 1부터 입력한 숫자까지 반복하고, 숫자가 3, 6, 9일 경우 영문자 X를 출력하고, 아닐 경우 숫자를 출력하면 된다. 

입력 값이 10보다 작은 정수이고, X로 출력할 값은 3, 6, 9이므로 모두 3의 배수이다. 

3의 배수는 3으로 나눴을 때 나머지가 0인 숫자이므로, 나머지를 구하는 연산자인 % 연산자를 사용한다.

정답은 다음 코드와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
 
int main()
{
    int n;    // 입력받을 변수
    scanf("%d"&n);    // 입력
    for(int i = 1; i <= n; i++)        // 입력한 숫자보다 작거나 같을 때까지 반복
    {
        if(i % 3 == 0)    // i가 3의 배수면(3,6,9)
        {
            printf("X ");    // X출력
        }
        else    // 3의 배수가 아니면
        {
            printf("%d ", i);    // 숫자 출력
        }
    }
    return 0;
    
}
cs

 

첫번째 주사위가 1일경우 두번째 주사위의 숫자, 2일 경우 두번째 주사위의 숫자... 와 같은 방식을 출력하므로 2중 for문을 이용하여 바깥쪽 반복문에서는 첫 번째 주사위의 숫자를 출력하고, 안쪽 반복문에서 두 번째 주사위의 숫자를 출력하면 될 것 같다. 

반복문은 1부터 각 주사위의 면의 수로 입력한 숫자까지 반복하도록 한다.

정답은 다음 코드와 같다.

1
2
3
4
5
6
7
8
9
10
11
12
13
#include <stdio.h>
 
int main()
{
    int n, m;    // 입력 받을 변수
    scanf("%d %d"&n, &m);        // 입력
    for(int i = 1; i <= n; i++)    // 첫번째 주사위, 1부터 입력받은 숫자보다 작거나 같을때까지 반복
    {
        for(int j = 1; j <= m; j++)    // 두번째 주사위, 1부터 입력받은 숫자보다 작거나 같을 때 까지 반복
            printf("%d %d\n", i, j);    // 첫번째 주사위 숫자 두번째 주사위 숫자의 형태로 
    }
    return 0;
}
cs

 

문자 한 개가 입력되는데, 몇 번 입력되는지는 모르기 때문에 무한 루프 반복문을 사용할 것이다.

while반복문으로 무한루프를 만들고, 무한 루프 안에서 문자를 입력받는다.

입력받은 문자를 바로 출력하고, if문을 이용하여 입력받은 문자가 q인지 확인한다. 입력받은 문자가 q라면 break를 사용하여 무한루프를 탈출한다.

이 문제도 문자를 입력받고 출력하므로 %c 서식문자를 사용한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
 
int main()
{
    char c;     // 입력받을 값
    while(1)    // 무한루프
    {
        scanf("%c"&c);    // 값 입력
        printf("%c", c);    // 출력
        if(c == 'q')        // 입력받은 문자가 q라면
            break;          // 반복문 종료
    }
    return 0;
}
cs

 

+ Recent posts