SWEA/[D2]

[C언어] SWEA 1979 어디에 단어가 들어갈 수 있을까

ruming 2020. 8. 30. 17:18

입력으로 퍼즐 모양을 주고 어디에 단어가 들어갈 수 있나 찾는다. (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;
}

동적할당을 너무 많이써서 헷갈렸다. 나중에 동적할당 없이 풀어보고 코드 추가

가로랑 세로 검사하는 걸 묶어서 한번에 할 수는 없으려나?

 


https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV5PuPq6AaQDFAUq&categoryId=AV5PuPq6AaQDFAUq&categoryType=CODE&&&

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com