CodeUp C언어 기초 100제 [기초 - 2차원배열] 1096~1099

jychan99·2021년 8월 19일
0
post-thumbnail
  1. 바둑판(19 * 19)에 n개의 흰 돌을 놓는다고 할 때,

n개의 흰 돌이 놓인 위치를 출력하는 프로그램을 작성해보자.

입력
바둑판에 올려 놓을 흰 돌의 개수(n)가 첫 줄에 입력된다.
둘째 줄 부터 n+1 번째 줄까지 힌 돌을 놓을 좌표(x, y)가 n줄 입력된다.
n은 10이하의 자연수이고 x, y 좌표는 1 ~ 19 까지이며, 같은 좌표는 입력되지 않는다.

출력
흰 돌이 올려진 바둑판의 상황을 출력한다.
흰 돌이 있는 위치는 1, 없는 곳은 0으로 출력한다.

#include <stdio.h>

int main()
{
    int n,i,j,x,y,index[19][19]={0};
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        x=0,y=0;
        scanf("%d %d",&x,&y);
        if(index[x-1][y-1]==0)
        index[x-1][y-1]+=1;
    }

    for(i=0;i<19;i++)
    {
        for(j=0;j<19;j++)
        {
            printf("%d ",index[i][j]);
        }
        printf("\n");
    }

    return 0;
}

1919크기의 바둑판을 만들기위해서는 2차원배열을 사용하면 된다.
2차원배열은 arr[i][j]로 표현한다. 19
19이므로 i와 j는 19까지 할당

  1. 바둑판(19 * 19)에 흰 돌(1) 또는 검정 돌(0)이 모두 꽉 채워져 놓여있을 때,
    n개의 좌표를 입력받아 십(+)자 뒤집기한 결과를 출력하는 프로그램을 작성해보자.

입력
바둑알이 깔려 있는 상황이 19 * 19 크기의 정수값으로 입력된다.
십자 뒤집기 횟수(n)가 입력된다.
십자 뒤집기 좌표가 횟수(n) 만큼 입력된다. 단, n은 10이하의 자연수이다.

출력
십자 뒤집기 결과를 출력한다.

#include <stdio.h>

int main()
{
    int i,j,n,x,y,index[20][20]={};
    for(i=0;i<19;i++)
        for(j=0;j<19;j++)
            scanf("%d ",&index[i][j]);
    scanf("%d",&n);

    for(i=0;i<n;i++)
    {
        scanf("%d %d",&x,&y);
        for(j=0;j<19;j++)
        {
            if(index[x-1][j]==0)
            index[x-1][j]=1;
            else
            index[x-1][j]=0;
        }
        for(j=0;j<19;j++)
        {
            if(index[j][y-1]==0)
            index[j][y-1]=1;
            else
            index[j][y-1]=0;
        }
    }

    for(i=0;i<19;i++)
    {
        for(j=0;j<19;j++)
        {
            printf("%d ",index[i][j]);
        }
        printf("\n");
    }

    return 0;
}

이 문제풀때 좀 시간이 걸린것같다. 컴파일을 몇번한지모르겠다;;
문제는 나는 배열을 쓸때 인덱스를 0~n-1이렇게 쓰는버릇이 있는데 이렇게 쓰다보니 헷갈려서 인덱스에 접근을 잘못한것 같다.

11번줄 ~ 28번줄 까지가 숫자를 뒤집는 과정인데, 인덱스를 0~18로 설정해서 x-1또는 y-1이렇게 수정해야하는 소요가 발생했다. 만약에 선언할때 index[20][20]로선언하고 0번배열을 버리고 인덱스로 1~19까지를 사용했다면 덜헷갈릴텐데.....

  1. 격자판의 세로(h), 가로(w), 막대의 개수(n), 각 막대의 길이(l),
    막대를 놓는 방향(d:가로는 0, 세로는 1)과
    막대를 놓는 막대의 가장 왼쪽 또는 위쪽의 위치(x, y)가 주어질 때,

격자판을 채운 막대의 모양을 출력하는 프로그램을 만들어보자.

입력
첫 줄에 격자판의 세로(h), 가로(w) 가 공백을 두고 입력되고,
두 번째 줄에 놓을 수 있는 막대의 개수(n)
세 번째 줄부터 각 막대의 길이(l), 방향(d), 좌표(x, y)가 입력된다.

입력값의 정의역은 다음과 같다.
1 <= w, h <= 100
1 <= n <= 10
d = 0 or 1
1 <= x <= 100-h
1 <= y <= 100-w

출력
모든 막대를 놓은 격자판의 상태를 출력한다.
막대에 의해 가려진 경우 1, 아닌 경우 0으로 출력한다.
단, 각 숫자는 공백으로 구분하여 출력한다.

#include <stdio.h>

int main()
{
    int h,w,n,l,d,x,y,i,j,k,arr[100][100]={};
    scanf("%d %d",&h,&w);
    scanf("%d",&n);

    for(i=0;i<n;i++)
    {
        scanf("%d %d %d %d",&l,&d,&x,&y);
        for(k=0;k<l;k++)
        {
            if(d==0)
                arr[x-1][y+k-1]=1;
            else
                arr[x+k-1][y-1]=1;
        }
    }
    for(i=0;i<h;i++)
    {
        for(j=0;j<w;j++)
        {
           printf("%d ",arr[i][j]); 
        }
        printf("\n");
    }

    return 0;
}

입력받는 변수가 꽤있는데, 이걸 헷갈리지말자.
그리고 일반적으로 가로축이 x축, 세로축이 y축이라 생각하는데 이문제에서는 반대임을 주의.
배열은 행우선임을 기억하자.

이문제에서도 0번째 배열을 버렸으면 좀더 편하게 코딩할 수 있었을텐데...
x축과 y축이 바뀐것은 arr[x][y]로 표현하는데, 배열은 행우선이기 때문에 오른쪽으로 한칸이동하려면 arr[x+1][y]이아닌 arr[x][y+1]이여야 하기 때문이다.

  1. 영일이는 생명과학에 관심이 생겨 왕개미를 연구하고 있었다.

왕개미를 유심히 살펴보던 중 특별히 성실해 보이는 개미가 있었는데,
그 개미는 개미굴에서 나와 먹이까지 가장 빠른 길로 이동하는 것이었다.

개미는 오른쪽으로 움직이다가 벽을 만나면 아래쪽으로 움직여 가장 빠른 길로 움직였다.
(오른쪽에 길이 나타나면 다시 오른쪽으로 움직인다.)

이에 호기심이 생긴 영일이는 그 개미를 미로 상자에 넣고 살펴보기 시작하였다.

미로 상자에 넣은 개미는 먹이를 찾았거나, 더 이상 움직일 수 없을 때까지
오른쪽 또는 아래쪽으로만 움직였다.

미로 상자의 구조가 0(갈 수 있는 곳), 1(벽 또는 장애물)로 주어지고,
먹이가 2로 주어질 때, 성실한 개미의 이동 경로를 예상해보자.

단, 맨 아래의 가장 오른쪽에 도착한 경우, 더 이상 움직일 수 없는 경우, 먹이를 찾은 경우에는
더이상 이동하지 않고 그 곳에 머무른다고 가정한다.

미로 상자의 테두리는 모두 벽으로 되어 있으며,
개미집은 반드시 (2, 2)에 존재하기 때문에 개미는 (2, 2)에서 출발한다.

입력
10*10 크기의 미로 상자의 구조와 먹이의 위치가 입력된다.

출력
성실한 개미가 이동한 경로를 9로 표시해 출력한다.

#include <stdio.h>

int main()
{
    int m[11][11]={},i,j,x,y;
    //미로상자, 먹이
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            scanf("%d",&m[i][j]);
        }
    }

    x=1;y=1;
    while(1)
    {
        if(m[x][y]==0)
        {
            m[x][y]=9;
            y++;
        }   
        else if(m[x][y]==1)
        {
            y--;
            x++;
        }
        else if(m[x][y]==2)
        {
            m[x][y]=9;
            break;
        }
        if(m[x][y+1]==1 && m[x+1][y]==1)
        {
            m[x][y]=9;
            break;
        }
    }

    //출력
    for(i=0;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            printf("%d ",m[i][j]);
        }
        printf("\n");
    }

    return 0;
}

미로 상자는 주어지니까 우리는 틀만만들고 입력만 받으면된다. 개미는 2,2에 있다고했지만, 나는 인덱스를 0~9까지 설정했기때문에 1,1에 위치한것으로 설정했다.

15번줄~39줄까지 개미의 발자취를 기록하는 코든데,
첫번째 if문은 개미가 서있는곳이 빈곳(0)이면 발자취(9)를남기고 오른쪽으로이동(y +1)한다
두번째 else if문은 개미가 서있는곳이 벽(1)이면 왼쪽으로 한칸이동(y-1)하고, 밑으로 한칸이동(x+1)한다.
세번째 else if문은 개미가 서있는곳이 먹이(2)이면 발자취를 남기고 break로 반복문을 빠져나온다.
마지막 if문은 오른쪽, 아래쪽이 모두 벽이면, 서있는곳에 발자취를 남기고 break로 반복문을 빠져나온다.
1098번문제처럼 m[x][y]가 바뀐것은 행우선이기 때문이다.

보름조금넘어서 코드업C언어 100제를 모두 업로드 완료했다.
풀기는 전에 다풀었지만 업로드하는데 아무래도 블로그도 처음이고 미숙한것도 있는것 같다.
그래도 뭔가 하나 해내니까 기분도 좋고 성취감이 있는 것 같다.
앞으로 백준/그리디 알고리즘을 포스팅하겠다. 조금 미리 풀어봤는데, 보아하니 티어(브론즈 실버 골드 플래티넘...)도 있는것같은데, 심해부터 천천히 한번 올라가보겠다.

앞으로도 쳐지지말고, 꾸준히 올려보자!!

2021.6.17

profile
내가 지금 두려워 하고 있는 일이 바로 내가 지금 해야 할 일이다. 🐍

0개의 댓글

관련 채용 정보