CS/알고리즘_문제풀이(파이썬)

rook

Jedy_Kim 2021. 5. 11. 13:34
728x90

문제


체스에서 룩이라는 기물은 막혀있지만 않으면 룩의 위치에서 같은 행, 같은 열에 해당하는 칸 중 하나로 한 번 이동할 수 있다. 단, 특정 칸이 막혀있다면 그 칸에서부터 더 나아갈 수는 없다. 만약 룩이 아래 그림과 같이 5행 4열에 존재하고 같은 행열에 기물이 없다면 5행이나 4열에 존재하는 칸 중 어디로든 갈 수 있다. 예를 들어, 5행 2열 혹은 1행 4열로 움직일 수 있다. 차례에 주어진 이동 횟수는 한 번이므로 이동이 완료되었다면 상대방의 차례로 넘어간다.

체스는 킹만 잡히면 지게 되는 게임이다. 그 중에서도 알랩이는 룩으로 인해 게임을 지는 것을 극도로 싫어한다!

주어진 체스판의 상태에서 현재 차례가 상대의 차례일 때, 이번 차례에 알랩이의 킹이 상대방의 룩에게 잡힐 가능성이 있는지 알아보자.

 

입력


8줄에 걸쳐 8x8 체스판의 상태가 주어진다. 이때 0은 기물이 없는 상태이고, 1은 알랩이의 킹을 의미하고, 2는 상대의 룩을 의미하며 3은 그 외 다른 기물들을 의미한다. (킹은 하나만 존재하며, 상대의 룩은 최대 2개까지 있을 수 있다. 그 외 기물들은 최대 29개까지 있을 수 있다.)

 

출력


킹이 룩에게 잡힐 가능성이 있으면 1, 아니면 0을 출력한다.

 

예제 입력 1

0 3 0 0 0 0 0 0

3 1 0 0 0 0 2 0

0 3 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

예제 출력 1

1

 

예제 입력 2 

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 3 3 0 0 0 0 0

3 0 1 0 3 0 2 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

0 0 0 0 0 0 0 0

예제 출력 2 

 0

 

# 풀이

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
outline = [ [ 3 for _ in range(10) ] for _ in range(10) ]
frame = [ list(map(int, input().split())) for _ in range(8) ]
kingPosRow = 0
kingPosCol = 0
isRisk = 0
 
for i in range(len(frame)):
  for j in range(len(frame[i])):
    outline[i+1][j+1= frame[i][j]
 
for row in range(len(frame)):
  for col in range(len(frame[i])):
    if frame[row][col] == 1:
      kingPosRow = row
      kingPosCol = col
      break
 
# 상 
if outline[kingPosRow][kingPosCol+1!= 3:
  for i in range(kingPosRow, 0-1):
    if outline[i][kingPosCol+1== 2:
      isRisk = 1
      break
    elif outline[i][kingPosCol+1== 3:
      break
# 하 
if outline[kingPosRow+2][kingPosCol+1!= 3:
  for i in range(kingPosRow+2len(outline)):
    if outline[i][kingPosCol+1== 2:
      isRisk = 1
      break
    elif outline[i][kingPosCol+1== 3:
      break
 
# 좌
if outline[kingPosRow+1][kingPosCol] != 3:
  for i in range(kingPosCol, 0-1):
    if outline[kingPosRow+1][i] == 2:
      isRisk = 1
      break
    elif outline[kingPosRow+1][i] == 3:
      break
# 우 
if outline[kingPosRow+1][kingPosCol+2!= 3:
  for i in range(kingPosCol+2len(outline)):
    if outline[kingPosRow+1][i] == 2:
      isRisk = 1
      break
    elif outline[kingPosRow+1][i] == 3:
      break
 
print(isRisk)
cs

 

반응형

'CS > 알고리즘_문제풀이(파이썬)' 카테고리의 다른 글

class president  (0) 2021.05.11
attackrange  (0) 2021.05.11
maxofarr  (0) 2021.05.10
GCD LCM  (0) 2021.05.10
상자 꾸미기  (0) 2021.05.10