입력으로 퍼즐 모양을 주고 어디에 단어가 들어갈 수 있나 찾는다. (0은 막힘, 1은 뚫림)
퍼즐 크기는 NxN이고 단어 길이는 k다.
단어 길이가 딱 맞게 들어가야 함(k가 3인데 1이 네개면 안됨, 연속으로 3개일 때 성립)
단어가 몇개 들어가는지 출력하는 게 목표다.
#include <stdio.h>
#include <stdlib.h>
int main(void){
int T, t, i, j, m;
int n, k, *cnt1, *cnt2;
int **arr;
scanf("%d", &T);
for(t=1; t<=T; t++){
scanf("%d%d", &n, &k);
cnt1 = (int*)malloc(sizeof(int*)*n);
cnt2 = (int*)malloc(sizeof(int*)*n);
arr = (int**)malloc(sizeof(int*)*n);
for(i=0; i<n; i++) arr[i] = (int*)malloc(sizeof(int)*n);
for(i=0; i<n; i++){
for(j=0; j<n; j++) scanf("%d", &arr[i][j]);
}
for(i=0; i<n; i++) cnt1[i] = 0;
for(i=0; i<n; i++) cnt2[i] = 0;
//가로
int count;
for(i=0; i<n; i++){
count = 0;
for(j=0; j<n; j++){
if(arr[i][j]){
count++;
if(j==n-1){
if(count == k) cnt1[i]++;
}
}
else{
if(count == k){
cnt1[i]++;
count = 0;
}else{
count = 0;
}
}
}
}
//세로
for(i=0; i<n; i++){
count = 0;
for(j=0; j<n; j++){
if(arr[j][i]){
count++;
if(j==n-1){
if(count == k) cnt2[i]++;
}
}
else{
if(count == k){
cnt2[i]++;
count = 0;
}else{
count = 0;
}
}
}
}
int sum = 0;
for(i=0; i<n; i++) sum = sum + cnt1[i] + cnt2[i];
printf("#%d %d\n", t, sum);
}
return 0;
}
동적할당을 너무 많이써서 헷갈렸다. 나중에 동적할당 없이 풀어보고 코드 추가
가로랑 세로 검사하는 걸 묶어서 한번에 할 수는 없으려나?
SW Expert Academy
SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!
swexpertacademy.com
'SWEA > [D2]' 카테고리의 다른 글
[C언어] SWEA 1976 시각 덧셈 (0) | 2022.02.26 |
---|---|
[C언어] SWEA 1983 조교의 성적 매기기 (0) | 2020.08.30 |
[C언어] SWEA 1959 두 개의 숫자열 (0) | 2020.08.23 |
[C언어] SWEA 1966 숫자를 정렬하자 (0) | 2020.08.20 |
[C언어] SWEA 1961 숫자 배열 회전 (0) | 2020.08.16 |