본문 바로가기

알고리즘 풀이(백준)

백준 1100번 : 하얀 칸 #C

 

문제

체스판은 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