백준 알고리즘 1100번 하얀 칸 문제입니다.

(참고 - https://www.acmicpc.net/problem/1100 )



코드)

#include <stdio.h>

char arr[8][8];

int main() {

int i, j, k, l, cnt=0;

for(i = 0; i < 8; i++) {

gets(arr[i]);

}

for(i=0; i<8; i+=2)

for(j=0; j<8; j+=2)

if(arr[i][j] == 'F')

cnt++;

for(k=1; k<8; k+=2)

for(l = 1; l<8; l+=2)

if(arr[k][l] == 'F')

cnt++;

printf("%d\n", cnt);

return 0;

}


- 이번 문제는 정수형 데이터를 가지고 노는것이 아니라 문자를 상대해야하는 문제입니다.ㅎㅎ

저는 2차원배열 arr[8][8]을 만들어주어 해결하였습니다.

그리고 arr배열에 gets함수를 이용해서 '.' 과 'F'에 대해 입력받도록 하였습니다.

(저는 gets함수를 빠르게 이용해보았지만 실제 사용시에는 fgets나, 다른 로직을 사용해보는 것을 권합니다.. 

gets함수는 입력받을 때에 크기를 지정받지 않기 때문에 버퍼 오버플로우를 유발할 수 있습니다. 

즉, 배열크기를 넘어가는 값을 입력받게되면 메모리의 어느영역에 저장 될 지 알 수 없다는 뜻입니다.!!)

그리고 이중 for문을 두번 사용하여 홀수줄, 짝수줄로 구분하여 F라는 글자를 탐색하며 카운트를 세주는 방법으로 해결 하였습니다.

(문제는 풀었지만 비효율적인 방법입니다.(__) 더 좋은 로직으로 해결하시길 바랍니다.)

이번 문제는 2차원 배열을 사용할 수 있는가, 문자에 대한 입력과 비교정도를 할 수 있는가 정도로 생각해봅니다.


+) 추가 -> 위의 로직을 아래와 같이 입력을 받는 순간부터, 비교구문을 이용하여 바로 Count를 해주면 좀 더 효율적으로 풀 수 있겠습니다.

for(i=0; i< 8; i++) {

for(j =0; j<8; j++) {

scanf(" %c", &a[i][j]);

if(((i % 2 == 0) && ( j % 2 == 0) || (i % 2 == 1) && (j % 2 == 1)) && (a[i][j] == 'F'))

cnt++;

}

}


WRITTEN BY
SiriusJ

,