미로 크기의 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

 

C에서 문자는 아스키 코드로 표현되며 숫자와의 연산이 가능하다. 숫자와 연산을 하게 되면 연산 결과 숫자에 해당하는 아스키 문자가 된다. 예를 들어 'a' + 1 은 'b'가 된다.

while 반복문을 이용하여 이 문제를 풀어보려고 한다.

출력값이 a부터 시작하므로 반복문의 초기식은 a로 설정하는 것이 좋을 것 같다.

또한 알파벳은 아스키코드로 a 부터 순서대로 1씩 차이가 나기 때문에 초기값부터 입력값까지 반복문으로 1씩 증가시키면 된다. 

1씩 증가시키다가, 입력한 값과 같아지면 출력하고 반복문을 종료한다.

문자를 입력받거나 출력할 때는 %c 서식문자를 사용한다.

다음은 정답 코드 이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
int main()
{
    char c;                // 입력받을 변수
    char i = 'a';        // 초기식
    scanf("%c"&c);
    while(i<=c)            // 초기식이 입력값보다 작거나 같을 때 까지 반복(더 커지면 반복 종료)
    {   
        printf("%c ", i);    // 반복하면서 값 출력
        i++;            // 1씩 
    }
    return 0;
}   
 
cs

 

기존에 파이썬으로 기초 100제를 한번 클리어 했기 때문에 새 계정을 만들어 문제들을 다시 풀었다.

C언어로 기초 100제 문제들을 풀면서 느꼈던 파이썬과의 가장 큰 차이는 자료형이다. 

C언어는 자료형마다 크기와 범위가 달라서 사용할 크기와 범위에 맞는 자료형을 사용해야 한다는 것이였다. 맞는 코드라고 생각했지만 자료형의 범위를 초과하여 원하는 답이 나오지 않았던 경우가 많았다.

 

+ Recent posts