2차원 배열을 입력받고 하얀칸에 말이 몇개 있는지 찾는 문제이다.
체스의 가장 왼쪽(0,0)이 흰색이며 체스판은 번갈아가면서 흰색, 검은색이 칠해져있다.
따라서 체스판의 가로와 세로의 합(i+j)이 짝수면 흰색, 홀수면 검은색임을 알 수 있다.
#include <iostream>
using namespace std;
int main() {
char chess[8][8];
int cnt = 0;
chess[0][0] = 0;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
// 0,0칸이 하얀색이고 번갈아가면서 검정 하얀색이 칠해져있기때문에
// i+j합이 짝수면 하얀색 홀수면 검정색이다
cin >> chess[i][j];
if ((i + j) % 2 == 0 && chess[i][j] == 'F')
cnt++;
}
}
printf("%d\n", cnt);
}
위 코드로 정상적으로 제출을 할 수는 있으나 백준 랭커분들의 코드를 보다가 내 코드의 아쉬운 점을 몇개 발견하고 이를 개선해볼려고 한다.
체스판의 0,0이 흰색이라는 내용을 보고
chess[0][0]=0;
이라는 초기화를 했는데 이는 불필요한 초기화였다. 그리고 변수를 전역으로 선언하면 모든 값이 0으로 초기화되기 때문에 변수를 따로 초기화하는 일을 할 필요가 없으므로 변수를 전역으로 선언하도록 하겠다.
또한 char형은 배열의 끝에 null이 있다. 이를 생각해서 배열을
char chess[8][9];
로 선언하면 좋을거 같다.
#include <iostream>
using namespace std;
char chess[8][9];
int main() {
int cnt = 0;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 8; j++)
{
// 0,0칸이 하얀색이고 번갈아가면서 검정 하얀색이 칠해져있기때문에
// i+j합이 짝수면 하얀색 홀수면 검정색이다
cin >> chess[i][j];
if ((i + j) % 2 == 0 && chess[i][j] == 'F')
cnt++;
}
}
printf("%d\n", cnt);
}