본문 바로가기
백준 C언어/silver

백준 2578 빙고 C언어_230117

by boyo-ee 2023. 1. 18.

빙고 문제를 만만하게 도전했다가 처참히 혼났다.

문제의 접근자체는 어렵지 않다.

5x5행렬에 빙고판을 먼저 입력받고 25개의 숫자를 하나씩 입력받다가 3줄이 되는 순간 반복문을 탈출하여 그때의 순서를 출력한다.

 

초기 구현은 다들 문제없이 할 수 있을 것이다.

숫자가 1부터 25까지의 자연수이므로 나는 입력받은 수를 배열에서 0으로 초기화하고 0이 5개이면 1줄을 카운트하고자 했다.

문제는 여기서부터다. 가로 세로 대각선 1, 대각선 2를 별도로 구현을 해야 하는지 반복문안에서 한 번에 구현을 할 수 있는지 확신이 안 섰기 때문이다.

그래서 처음엔 한꺼번에 하려다가 제대로 출력이 나오지 않았고, 각 경우를 별로의 loop를 돌려 구하고 합산하는 방식으로 구현했다.

여기서 핵심은 각 루프가 끝난 후 새로운 숫자가 인풋 되기 전에 초기화하는 과정이 필요하다는 것이다.

처음에는 for문안에서 작성하는 등의 사유로 엄청 헤맸었다.

결국 각 과정 별로 data 값을 printf를 사용하여 눈으로 확인하고 나서야 원인을 깨닫고 수정할 수 있었다.

 

#include <stdio.h>
#include <string.h>
int main(){
	int a[100][100];
	int num,cnt=0,out=0,input=0,sum;
	for(int i=1;i<=5;i++){
		for(int j=1;j<=5;j++){
			scanf("%d",&a[i][j]);
		}
	}

	while(input<=25){
		input++;
		scanf("%d",&num);
		
	for(int i=1;i<=5;i++){
		for(int j=1;j<=5;j++){
			if(num==a[i][j]) a[i][j]=0;
		}
	}
	//가로
		cnt=0;
for(int i=1;i<=5;i++){
	int sum=0;
	for(int j=1;j<=5;j++){
		sum+=a[i][j];
		}
	if(sum==0) cnt++;
}
		//세로
for(int i=1;i<=5;i++){
	int sum=0;
	for(int j=1;j<=5;j++){
		sum+=a[j][i];
		}
	if(sum==0) cnt++;
}

		//좌->우
sum=0;
for(int i=1;i<=5;i++){
	sum+=a[i][i];
	
}
		if(sum==0) cnt++; //이 if문에 for바깥에 있어야하는데 처음에 안쪽에 넣어서 sum에 각 배열 값이 들어가서 출력이 제대로 나오지않았다.
		
		//우좌
sum=0;
for(int i=5;i>=1;i--){
	sum+=a[i][5-i+1];
}
		if(sum==0) cnt++;
	
if(cnt>=3) //숫자를 입력받고 3줄이상의 라인이 그려질 경우도 생긴다. 숫자가 3.3에 위치할 경우 등...
			break;
	}
	printf("%d",input);
	return 0;
}

 

댓글