celina의 이것저것

[C++] 백준 1100번 - 하얀 칸 본문

자료구조&알고리즘/백준

[C++] 백준 1100번 - 하얀 칸

celinayk 2023. 3. 4. 00:07
반응형

문제

체스판은 8×8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다. 가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.

입력

첫째 줄부터 8개의 줄에 체스판의 상태가 주어진다. ‘.’은 빈 칸이고, ‘F’는 위에 말이 있는 칸이다.

출력

첫째 줄에 문제의 정답을 출력한다.

접근

처음에는 배열을 이용해서 행과 열을 8*8로 만들어서 풀려고 했으나 복잡할 것같아서 배열을 사용하지 않았다 언듯 보면 이차 배열을 써야할 것 같지만 배열 대신 반복문을 두개 써서 풀었다

코드

#define _CRT_SECURE_NO_WARNINGS
#include <iostream> 
#include <algorithm>
#include <string>
#include <vector>
using namespace std;

int main() {
    
    char num;
    int cnt = 0;
    for (int i = 0; i < 8; i++) {
        for (int j = 0; j < 8; j++) {
            scanf(" %c", &num);
            if (i % 2 == 0 && j % 2 == 0 && num == 'F') {
                cnt++;
            }
            if (i % 2 != 0 && j % 2 != 0 && num == 'F') {
                cnt++;
            }
        }
    }
    printf("%d", cnt);
   
     
    return 0;
}

리뷰

중첩 for문을 썼다 저렇게 반복문을 두개 돌리면 배열처럼 접근(?) 이용(?)을 할 수 잇다 그그 별 찍기 할때 처럼...!!!

저렇게 반복문을 두개 쓰면 가로 8줄 세로 8줄을 만들 수 있다

그런다음 scanf로 문자를 입력받았다

그리고 if문으로 문자 'F'가 어디에 위치하는지 구했다. 이건 그림을 그려서 금방 알 수 있었다

어차피 흰검흰검 이렇게 반복되니까 2로 나눈 나머지를 사용하면 금방 구할 수 있다!!

 

여기서 내가 틀렸던게 있다 처음 예제1에서 정답이 1이 나와야 하는데 11이 나온 것이다 다른 예제는 다 제대로 작동하는데 예제1만 답이 이상했다

그 이유는 scanf의 부분에 있다

나는 처음에 코드를 작성할 때

scanf("%c", &num);

이렇게 썼는데 여기서 공백을 한 칸 띄워줘야 한다 

그 이유는 scanf함수는 입력받을 문자열 앞에 있는 공백 문자를 무시한다 그러나 

%c 서식지정자는 개행문자나 공백문자까지 입력을 받을 수 있다. 그렇기 때문에 이전 입력에서 남아있는 개행 문자나 공백문자를 읽어와서 입력 값을 오작동하게 만들 수 있다 의도치 않은 입력으로 처리 될 수 있

그래서 %c앞에 공백 문자를 추가해서 이전 입력에서 남아 있는 공백 문자나 개행문자를 무시하도록 하는 것이다

 

공백 하나가 이렇게 중요하다니... 또 새롭게 알게되었다 

출처 

1100번: 하얀 칸 (acmicpc.net)

 

Comments