Zeta Oph's Study

코드업 2610번 본문

프로그래밍/코드업

코드업 2610번

Zeta Oph 2023. 5. 12. 05:06

이 글에서는 코드업 2610번을 풀이해보겠습니다.

https://codeup.kr/problem.php?id=2610&rid=23688 

 

그림판 채우기

$10*10$ 크기의 그림이 있다. 이 그림에 그림판 색 채우기 기능을 구현하시오. (단, 원점은 왼쪽 위 끝이고, $x$ 값은 오른쪽, $y$ 값은 아래로 갈수록 증가한다.)

codeup.kr


더보기

문제 설명

 

10*10 크기의 그림이 있다.

이 그림에 그림판 색 채우기 기능을 현하시오.
(단, 원점은 왼쪽 위 끝이고, x 값은 오른쪽, y 값은 아래로 갈수록 증가한다.)


입력

 

10*10 크기의 그림과 색칠할 퐈죠의 x, y 값이 차례로 입력된다.

_ 는 색칠되지 않은 부분이고 * 는 색칠된 부분이다.


출력

 

색 채우기를 한 결과를 출력한다.

 

이 문제는 그림판의 색 채우기 기능을 구현하는 문제입니다. 제가 이 문제를 보자마자 떠올린 풀이법은, 입력한 x, y 좌표에 해당하는 칸에서 부터 시작하여 상, 하, 좌, 우로 점점 퍼져 나가면서 빈칸인지 확인하고 빈칸이라면 채우고 가는 방식을 떠올렸습니다. 그렇게 코드를 짜보도록 합시다.

 

먼저 알고리즘 순서도를 그리면 이렇게 될 것입니다. 상, 하, 좌, 우로 퍼져나가는 것을 재귀함수을 이용하였습니다.

이것은 전체적인 순서도이고, 

이것은 핵심이 되는 함수의 작동 순서도입니다.

순서도를 짰으니 이를 바탕으로 코드를 바로 짜보도록 하죠.

#include <stdio.h>

char a[11][11];

void f(int x, int y)
{
  if(a[x][y] == '*')
  {
    return;
  }
  else
  {
    a[x][y] = '*';
    if(x+1 < 10)
    {
      f(x+1, y);
    }
    else if(y+1 < 10)
    {
      f(x, y+1);
    }
    else if(x-1 >= 0)
    {
      f(x-1, y);
    }
    else if(y-1 >= 0)
    {
      f(x, y-1);
    }
  }
}


int main(void) {
  for(int i = 0; i < 11; i++)
    {
      for(int j = 0; j < 10; j++)
        {
          scanf("%c", &a[j][i]);
        }
    }
  int b, c;
  scanf("%d %d", &b, &c);

  f(b, c);
  
  for(int i = 0; i < 11; i++)
    {
      for(int j = 0; j < 10; j++)
        {
          printf("%c", a[j][i]);
        }
    }
}

제가 처음에 짰던 오류가 있는 코드입니다. 좌표값조차 원하는 대로 읽어내지 못해서 당황스러웠지만, 그 원인을 찾았습니다. 입력 예시를 잘 살펴보니, 줄을 바꿀때마다 \n, 즉 enter가 입력되고 있어서 이것이 혼란을 준 것이었습니다. 그래서 저는 엔터를 따로 받아낼 코드를 추가하고, 다른 자잘한 오류 (x, y를 헷갈리거나 if문의 순서를 잘못 넣는 등의 것)을 해결해보았습니다.

#include <stdio.h>

int a[10][10];

void f(int x, int y)
{
  if(a[x][y] != '*')
  {
  	a[x][y] = '*';
    if(x+1 < 10)
    {
      f(x+1, y);
    }
    if(y+1 < 10)
    {
      f(x, y+1);
    }
    if(x-1 >= 0)
    {
      f(x-1, y);
    }
    if(y-1 >= 0)
    {
      f(x, y-1);
    }
  }
  else
  {
  	return;
  }
}

char em;

int main(void) {
  for(int i = 0; i < 10; i++)
    {
      for(int j = 0; j < 10; j++)
        {
          scanf("%c", &a[i][j]);
        }
    scanf("%c", &em);
    }
  int b, c;
  scanf("%d %d", &b, &c);

  f(c, b);
	
  for(int i = 0; i < 10; i++)
    {
      for(int j = 0; j < 10; j++)
        {
          printf("%c", a[i][j]);
        }
        printf("\n");
    }
}

잘 작동하는 군요!

코드 설명을 좀 더 자세히 해보겠습니다. 먼저, 10*10의 그림판 배열을 입력받습니다. 이때 엔터가 입력되는 것은 따로 받아주는 작업이 필요했습니다. 또한 입력된 좌표를 함수에 전달하면, 함수에서 그 좌표를 시작으로 상, 하, 좌, 우로 퍼져나가며 그 칸이 채워져있는지 확인하고, 채워져있다면 종료, 아니라면 채우고 또다시 상, 하, 좌, 우로 퍼져나가는 방식으로 그림판을 채우게 됩니다. 채우는 것이 끝나면 채운 그림판을 출력을 합니다.

 


이렇게 코드업 2610번 문제를 풀이해보았습니다.

'프로그래밍 > 코드업' 카테고리의 다른 글

코드업 3510번  (1) 2023.05.20
코드업 3009번  (1) 2023.05.17
코드업 2062번  (1) 2023.05.12
코드업 2833번  (2) 2023.03.14
코드업 2832번  (1) 2023.03.13