[BOJ] 1100

Posted by RoadtoS7 on January 10, 2020 · 2 mins read

문제

체스판은 8x8크기이고, 검정 칸과 하얀 칸이 번갈아가면서 색칠되어 있다.

가장 왼쪽 위칸 (0,0)은 하얀색이다. 체스판의 상태가 주어졌을 때, 하얀 칸 위에 말이 몇 개 있는지 출력하는 프로그램을 작성하시오.

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

풀이 과정

아래는 체스판의 모습니다.

체스판

체스판의 가장 왼쪽 위칸을 (0,0)이라고 보았을 때, 흰 칸은 다음과 같은 위치에 존재한다. (0,0)
(2,0) (1,1) (0,2)
(4,0) (1,3) (2,2) (1,3) (0,4)
(6,0) (1,5) (2,4) (3,3) (4,2) (5,5) (0,6)
(7,1) (6,2) (5,3) (4,4) (3,5) (2,6) (1,7)
(7,3) (6,4) (5,5) (4,6) (3,7)
(7,5) (6,6) (5,7)
(7,7)

우선 체스판이 8x8 형태 이기 때문에 체스칸 인덱스의 범위는 0 - 7까지이다. 그리고 흰색칸의 행 인덱스와 열 인덱스의 합은 항상 짝수이며, 범위는 0~14에 해당한다.

따라서 코드에서는

  1. 행 번호와 열 번호의 합에 해당하는 값을 0~14까지 반복을 돈다.
  2. 1번의 각 반복에서 0 부터 행 번호와 열 번호의 합에 해당하는 숫자까지 반복을 돈다.
  3. 2번의 각 반복에서 현재 반복 인덱스에 해당하는 숫자(행번호 또는 열번호)를 1번의 현재 반복인덱스(행번호와 열번호의 합)에 해당하는 숫자에서 뺀다. -> 2번 반복의 인덱스를 행번호로 보았다면 뺄셈의 결과로 열번호를 얻을 수 있고, 1번 반복의 인덱스를 열번호로 보았다면 뺄셈의 결과로 행번호를 얻을 수 있다.
  4. 그리고 구한 열 번호와 행 번호가 체스판의 범위내에 존재하는지 체크한다.
  5. 체스판의 범위내에 존재한다면 해당 행번호와 열번호에 해당하는 위치에 말이 있는지 확인한 후, 있으면 말의 총 개수를 증가시킨다.

코드

chess = list()

for i in range(8):
    temp = input()
    chess.append(temp)

result = 0 # 하얀칸 위에 존재하는 말의 총 개수

for i in range(0, 15, 2):
    for j in range(i + 1):
        if i - j >= 8: continue
        elif j >= 8: continue
        elif chess[j][i - j] == 'F':
            result += 1

print(result)

새롭게 알게 된 사실

  1. 구글링을 통해서 이 문제를 푼 다른 사람들의 답안도 확인해보았는데,
    흰색칸에서 행번호와 열번호의 합이 짝수일 때임을 똑같이 이용했지만 체스판 전부를 탐색한 코드가 있엇다.
    반복문을 전부 돈다는 점에서 계산 시간은 더 나올 수도 있겟지만 훨씬 깔끔한 코드였다. 아래 코드에 해당한다.
chess = []for _ in range(8):
    chess.append(list(map(str, list(input()))))

answer = 0
for i in range(8):
    for j in range(8):
        if (i + j) % 2 == 0: #하얀칸일 경우
            if chess[i][j] == 'F': #F있을 경우
                answer += 1
print(answer)