문제
체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.
입력
첫째 줄부터 8개의 줄에 체스판의 상태가 주어진다. ‘.’은 빈 칸이고, ‘F’는 위에 말이 있는 칸이다.
주어진 문제를 살펴보면 체스판을 ' . ' 과 ' F ' 2 문자를 이용해서 체스판 위에 말이 있는지 없는지를 확인하고 하얀 칸 위에 있는 말의 개수를 출력하는 프로그램을 만들면 된다.
https://www.acmicpc.net/problem/1100
2차원 배열을 만들어서 풀수 있지만 필자의 경우는 값을 입력받은 후 현재 칸이 하얀 칸 인지를 확인한 후 바로 개수를 파악했다.
이를 위해서는 입력값을 받을때 %s 나 %c를 사용하면 오류가 발생하는데 그 이유는
%s 의 경우 단일 문자가 아닌 string 즉 단어로 이어져 읽어버리기 때문에 필자의 의도처럼 실행시킬 수 없다.
%c의 경우 단일 문자 1개만을 읽어내려가지만
.F.F...F
F...F.F.
...F.F.F
F.F...F.
.F...F..
F...F.F.
.F.F.F.F
..FF..F.
위와 같이 주어진 예제 입력값 중 개행문자 \n을 읽어버리기 때문에 F, . 가 아닌 또다른 제 3의 문자로 인지해버릴 수 있다.
따라서 필자의 경우 scanf(" %c", &data); 로 %c앞에 공백을 추가하여 개행문자 \n 을 무시해버렸다.
scanf(" %c", &data);
이 문제를 통해서는 이 코드가 개행문자 \n를 무시하고 입력값을 읽어낼 수 있다는 부분을 얻어가면 될 것이다.
아래가 필자가 제출한 코드 전문이다.
#include <stdio.h>
int main()
{
int cnt=0;
char data;
for(int i=0; i<8; i++)
{
for(int j=0; j<8; j++)
{
scanf(" %c", &data);
if((i + j) % 2 == 0 && data != '.')
cnt+=1;
}
}
printf("%d", cnt);
}
추가적으로 설명을 덧붙이자면
if((i + j) % 2 == 0 && data != '.')
이 코드가 체스판에서 하얀 칸, 검은색 칸을 구분하는 코드이다. 하얀색 칸의 경우 대각선으로 쭉 이어져있기 때문에
이러한 규칙성을 찾아내서 코드에 적용하면 더 좋은 성능을 보여줄 수 있다.
'알고리즘 풀이(백준)' 카테고리의 다른 글
백준 11899번: 괄호 끼워넣기 #C (0) | 2025.04.06 |
---|---|
백준 18258번 : 큐 2 #C (0) | 2025.04.04 |
백준 1735번: 분수 합 #C (0) | 2025.04.03 |
백준 11047번 : 동전 0 #C (0) | 2025.04.02 |