반응형
문제
체스에서 여왕은 강력한 말이다. 여왕은 가로, 세로, 그리고 대각선으로 제한없이 이동하여 상대를 공격할 수 있다.
사이나쁜 여왕 퀴즈는 여덟 여왕을 8x8 체스판 위에 배치하는데, 아무도 서로 공격할 수 없도록 배치하는 퀴즈다. 가운데 그림은 올바르지 않은 풀이인데, 두 여왕이 대각선을 통해서 서로 공격할 수 있기 때문이다. 오른쪽 그림은 올바른 해법이다. 우리는 체스판과 여왕의 배치가 주어질 때 해당 배치가 올바른 사이나쁜 여왕 퀴즈의 해법인지 아닌지를 판단해야 한다.
입력
입력은 하나의 체스판을 8줄에 걸쳐 줄마다 8개의 문자로 나타낸다.
각 문자는 '.' 혹은 '*' 이며 '.'은 빈 칸을, '*'은 여왕이 있음을 나타낸다.
출력
한 줄에 걸쳐 올바른 해법일 경우 "valid", 올바르지 않은 해법일 경우 "invalid"를 출력한다.
예제 입력 1*.......
..*..... ....*... ......*. .*...... .......* .....*.. ...*.... |
예제 출력 1invalid
|
예제 입력 2*.......
......*. ....*... .......* .*...... ...*.... .....*.. ..*..... |
예제 출력 2valid
|
풀이
여왕이 있는 자리의 상하좌우, 대각선을 탐색하며 또 다른 여왕이 있는지 체크해야 한다.
8개의 여왕이 모두 서로 공격할 수 없다면 valid를 출력하고, 아니라면 invalid를 출력한다.
여왕이 8개가 아니어도 올바른 해답이 아니라는 것에 주의해야 한다.
import sys
input = sys.stdin.readline
def check(x,y):
for a,b in move:
tx=x; ty=y
for i in range(7):
tx+=a; ty+=b
if tx>=8 or tx<0 or ty>=8 or ty<0:
break
if board[tx][ty] == '*':
return 1
board = [list(input().rstrip()) for _ in range(8)]
move = [(0,1),(1,0),(0,-1),(-1,0),(1,1),(1,-1),(-1,1),(-1,-1)]
cnt = 0
for i in range(8):
for j in range(8):
if board[i][j]=='*':
cnt+=1
if check(i,j):
print('invalid')
sys.exit()
print('valid' if cnt==8 else 'invalid')
반응형
'알고리즘 연습 > 구현, 문자열' 카테고리의 다른 글
[🥈4 / 백준 14394 / 파이썬] 9-퍼즐 (0) | 2022.05.25 |
---|---|
[🥉2 / 백준 10093 / 파이썬] 숫자 (0) | 2022.05.22 |
[🥉2 / 백준 11945 / 파이썬] 뜨거운 붕어빵 (0) | 2022.05.03 |
[🥈4 / 백준 10157 / 파이썬] 자리배정 (0) | 2022.04.26 |
[🥈4 / 백준 2776 / 파이썬] 암기왕 (0) | 2022.04.17 |