일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 회로이론
- dictionary
- 소행성
- 피보나치 수열
- 자바
- 이진탐색트리
- 2P1L
- 벡터 해석
- 파이썬
- 델
- 딥러닝
- Python
- cURL
- 강화학습
- BST
- 딕셔너리
- 신경망
- 벡터해석
- 함수
- 자료형
- 코드업
- 최단 경로
- Asteroid RL
- auto-encoder
- 계단 오르기
- 미분 방정식
- java
- 백트래킹
- Class
- 선적분
- Today
- Total
Zeta Oph's Study
코드업 2610번 본문
이 글에서는 코드업 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번 문제를 풀이해보았습니다.