빙고 문제를 만만하게 도전했다가 처참히 혼났다.
문제의 접근자체는 어렵지 않다.
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;
}
'백준 C언어 > silver' 카테고리의 다른 글
백준 7568 덩치 C언어_230118 (0) | 2023.01.18 |
---|---|
백준 2822 점수계산 C언어_230118 (0) | 2023.01.18 |
백준 1978 소수찾기 C언어_230113 (0) | 2023.01.13 |
백준 5555 반지 C언어_230108 (0) | 2023.01.13 |
백준 2422 한윤정이 이탈리아에 가서 아이스크림을 사먹는데 C언어_230110 (0) | 2023.01.13 |
댓글