WalkerJei's Lifelog

백준알고리즘 1100번 하얀 칸 C# 본문

소프트웨어 개발/코딩테스트(기성 문제)

백준알고리즘 1100번 하얀 칸 C#

WalkerJei 2025. 4. 18. 21:38

세부 정보

  • 사이트: 백준알고리즘
  • 번호: 1100
  • 문제명: 하얀 칸
  • 언어: C#
  • 분류: 구현, 문자열
  • 비고: 

 

문제

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

 

입력

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

 

출력

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

 

풀이

체스판에서 가장 왼쪽 위칸 (0, 0)이 하얀색이고 검정 칸과 하얀 칸이 번갈아가며 칠해져 있다는 특성을 다음과 같이 활용하면 된다.

(0, 0): 하양

(0, 1): 검정

(1, 0): 검정

(1, 1): 하양

여기서 괄호 안의 수 2개의 나머지를 구해서 둘 다 같으면 하양 칸, 다르면 검정 칸이다.

StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

// 체스판
string[] chessPlate = new string[8];
// 하얀 칸 위에 있는 말의 개수
int whiteF = 0;

// 체스판에 빈 칸과 말이 있는 칸 입력 (빈칸: ., 말: F)
for (int i = 0; i < 8; i++)
    chessPlate[i] = sr.ReadLine();

for (int i = 0; i < 8; i++)
{
    // 하얀 칸은 0, 0부터 시작하며 i와 j 둘 다 홀수이거나 짝수이다.
    // 하얀 칸 위에 말이 있는 지 판별
    for (int j = 0;j < 8; j++)
    {
        if (i % 2 == 0 && j % 2 == 0 && chessPlate[i][j] == 'F')
            whiteF++;
        if (i % 2 == 1 && j % 2 == 1 && chessPlate[i][j] == 'F')
            whiteF++;
    }
}

// 하얀 칸 위의 말 개수 출력
sw.WriteLine(whiteF);

sr.Close();
sw.Close();

 

후기

이 문제는 어제보다 더 순조롭게 풀렸다. 겉으로 보기에는 어려워 보일 수 있지만 실력이 쌓이니까 이러한 문제의 해결 방법이 떠오르는 자신을 발견했다. 거기다가 20분도 안 걸려서 풀어냈고 단번에 정답이 나왔다. 

심지어 풀다 보니까 보다 더 간결하게 만드는 방법도 떠올랐다.

StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

// 체스판
string[] chessPlate = new string[8];
// 하얀 칸 위에 있는 말의 개수
int whiteF = 0;

// 체스판에 빈 칸과 말이 있는 칸 입력 (빈칸: ., 말: F)
for (int i = 0; i < 8; i++)
    chessPlate[i] = sr.ReadLine();

for (int i = 0; i < 8; i++)
{
    // 하얀 칸은 0, 0부터 시작하며 i와 j를 2로 나눈 나머지가 같다.
    // 하얀 칸 위에 말이 있는 지 판별
    for (int j = 0;j < 8; j++)
        if (i % 2 == j % 2 && chessPlate[i][j] == 'F') whiteF++;
}

// 하얀 칸 위의 말 개수 출력
sw.WriteLine(whiteF);

sr.Close();
sw.Close();

 

아예 i % 2와 j % 2의 값이 같으면 하얀 칸이라는 의미다. 코드의 길이가 확 줄어들었다. 이렇게 최적화를 선보였다. 앞으로도 이런 페이스로 쭉 나아가야 한다.