소소한 개발이야기

[BOJ #1100번] 하얀 칸 본문

BOJ

[BOJ #1100번] 하얀 칸

plplim 2019. 2. 17. 19:12

[백준 온라인 저지] #1100번 (하얀칸) 문제풀이



문자의 비교만 할 수 있고, 체스판의 크기가 8 x 8로 정해져있어 완전 탐색으로 쉽게 풀 수 있는 문제라고 생각이 든다. 

입력은 8 x 8 고정이므로 char 배열 8 * 8을 준비해 입력을 받아 완전탐색으로 말이 놓아져 있는지(F인지) 확인하면 된다.

문제에서 요구하는 것은 '하얀 칸 위에 말이 놓아져 있는가' 라는 것인데 완전탐색을 하면서 '하얀 칸인지?''말이 놓여져 있는지?'를 확인하면 된다.


그럼 '하얀 칸'인지는 어떻게 확인하는 것이 좋을까?


(0, 0)이 하얀칸이라고 했으므로 체스판을 머릿속으로 그려보면 규칙을 쉽게 찾을 수 있다.


흰 검 흰 검 흰 검 흰 검

검 흰 검 흰 검 흰 검 희

흰 검 흰 검 흰 검 흰 검

...


 체스판을 0행부터 시작한다고 생각하면 '짝수 번째 행(0 포함)'은 '0 번 열'부터 시작해 + 2 칸씩 떨어져 있고, '홀수 번째 행'은 '1 번 열'부터 + 2칸씩 떨어져 있다는걸 알 수 있다. 우리는 '검정 칸'은 볼 필요 없이 '하얀 칸'만 보면서 '말이 놓여져 있는지?' 만 확인하면 되므로 코드는 다음과 같다.


1
2
3
4
5
for (int row = 0; row < 8; row++){
    for (int col = row % 2; col < 8; col = col + 2){
        if (board[row][col] == 'F') cnt++;
    }
}
cs


'하얀 칸'만 확인하면 되므로 'col = row % 2' 즉 '짝수 행'이면 '0 번 열'부터 시작하고, '홀수 행'이면 '1 번 열'부터 시작한다는 뜻이다. 

이중 for 문을 모두 탐색하면서 if문으로 '하얀 칸'인지를 확인해도 되지만 체스판이 고정되어 있기 때문에 이렇게 접근했다. 




Github 에서도 소스코드 확인이 가능합니다. https://github.com/seungrokoh/Beakjoon_OnlineJudge

전체 소스 코드


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
 
using namespace std;
 
char board[8][8];
 
void input() {
    for (int i = 0; i < 8; i++) {
        scanf("%s"&board[i][0]);
    }
}
void solve(){
    int cnt = 0;
    for (int row = 0; row < 8; row++) {
        for (int col = row % 2; col < 8; col = col + 2) {
            if (board[row][col] == 'F') {
                cnt++;
            }
        }
    }
 
    cout << cnt;
}
int main(){
    input();
    solve();
    return 0;
}
cs


더 좋은 방법이나 문제가 있는 부분 말씀해주시면 적극 반영하겠습니다.

'BOJ' 카테고리의 다른 글

[BOJ #2884번 JAVA] 알람 시계  (0) 2019.03.05
[BOJ #11718번 JAVA] 그대로 출력하기  (1) 2019.03.05
[BOJ #2490번 JAVA] 윷놀이  (0) 2019.03.05
[BOJ #8958번] OX퀴즈  (0) 2019.03.04
[BOJ #10989번] 수 정렬하기 3  (0) 2019.02.28
Comments