알고리즘 연습/구현, 문자열

[🥈5 / 백준 10469 / 파이썬] 사이 나쁜 여왕들

김세진 2022. 5. 5. 16:38
반응형

 

 

10469번: 사이 나쁜 여왕들

체스에서 여왕은 강력한 말이다. 여왕은 가로, 세로, 그리고 대각선으로 제한없이 이동하여 상대를 공격할 수 있다. 사이나쁜 여왕 퀴즈는 여덟 여왕을 8x8 체스판 위에 배치하는데, 아무도 서로

www.acmicpc.net

 

문제

체스에서 여왕은 강력한 말이다. 여왕은 가로, 세로, 그리고 대각선으로 제한없이 이동하여 상대를 공격할 수 있다.

사이나쁜 여왕 퀴즈는 여덟 여왕을 8x8 체스판 위에 배치하는데, 아무도 서로 공격할 수 없도록 배치하는 퀴즈다. 가운데 그림은 올바르지 않은 풀이인데, 두 여왕이 대각선을 통해서 서로 공격할 수 있기 때문이다. 오른쪽 그림은 올바른 해법이다. 우리는 체스판과 여왕의 배치가 주어질 때 해당 배치가 올바른 사이나쁜 여왕 퀴즈의 해법인지 아닌지를 판단해야 한다.

입력

입력은 하나의 체스판을 8줄에 걸쳐 줄마다 8개의 문자로 나타낸다.

각 문자는 '.' 혹은 '*' 이며 '.'은 빈 칸을, '*'은 여왕이 있음을 나타낸다.

출력

한 줄에 걸쳐 올바른 해법일 경우 "valid", 올바르지 않은 해법일 경우 "invalid"를 출력한다.

 

예제 입력 1

*.......
..*.....
....*...
......*.
.*......
.......*
.....*..
...*....

예제 출력 1

invalid







예제 입력 2

*.......
......*.
....*...
.......*
.*......
...*....
.....*..
..*.....

예제 출력 2

valid







 

풀이

 

여왕이 있는 자리의 상하좌우, 대각선을 탐색하며 또 다른 여왕이 있는지 체크해야 한다.

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')
반응형