소소한 개발이야기
[BOJ #1100번] 하얀 칸 본문
[백준 온라인 저지] #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 |