프로그래밍/알고리즘
코드업 2062
austag
2023. 5. 12. 08:28
이번 글에서는 코드업 2062문제를 풀어보겠습니다.
재현이는 Up 1 문제에서 자기의 집을 띄우는데 성공하였다!
하지만 헬륨이 빠지면서 집은 다시 땅으로 내려오게 되었다.
헬륨이 왜 빠졌는지를 보자 풍선의 위치가 문제인 것을 알게 되었다.
지붕에는 층이 있다. 층은 0부터 9까지이다.
재현이는 지붕의 0층에 모든 풍선을 달자 연결부위가 약해져서 풍선이 날아간 것으로 추측한다.
재현이는 그래서 각 층에는 서로 최대한 많이 연결되어 있는 곳에만 풍선을 달려고 한다.
입력
첫번째 줄에 m, n이 입력된다.(1<=m,n<=19)
두번째 줄에 지붕의 지도가 m*n형식으로 입력된다.
숫자는 층이고 -1은 풍선을 달 수 없는 곳이다.
출력
풍선의 최대수를 각 층마다 출력한다.
0개인 층은 출력하지 않아도 된다. 또한, 층은 오름차순으로 출력한다.
1. 문제분석
이 문제는 주어진 2차원 배열에서 상하좌우로 숫자가 최대한 많이 이어진 개수를 세면 되는 문제입니다.
2. 알고리즘 설계
3. 코딩
함수 f에 층수와 배열에서 그 값의 위치를 입력한 후 값의 상하좌우 값을 탐색해보았다.
배열의 범위 안에 있을 때 조건에 따라 f에 다시 값을 넣어주면서 c를 더해주었다.
층수만큼 반복하고 모든 칸을 탐색하기 위해 반복하면서 그 값을 배열 num에 저장하고
나중에 출력해주었다.
[문제해결]
처음에 코딩했을 때
함수 f에서 탐색한 배열 값을 -1로 바꾸어 주지 않아 계속 반복되면서 오류가 났었고
main 함수에서 f 실행전 c를 초기화하지 않아 오류가 나게 되었다.
#include <stdio.h>
int a[20][20];
int num[10];
int c=0;
int m, n;
void f(int p, int x, int y){
if(a[x][y]==p){
c++;
if(x-1>=0) f(p, x-1, y);
if(y-1>=0) f(p, x, y-1);
if(x+1<m) f(p, x+1, y);
if(y+1<n) f(p, x, y+1);
}
else return;
}
int main(){
scanf("%d %d", &m, &n);
for(int i=0; i<m; i++{
for(int j=0; j<n; j++){
scanf("%d", &a[i][j]);
}
}
for(int k=0; k<10; k++){
for(int i=0; i<m; i++){
for(int j=0; j<n; j++){
f(k, i, j);
num[k] = num[k]> c? num[k]:c;
}
}
}
for(int k=0; k<10; k++){
if(num[k]!=0){
printf("%d %d\n", k, num[k]);
}
}
}
이를 수정하여 다시 코드를 짰고 실행되는 것을 확인하였다.