킹
알고리즘
킹이 움직인다. 이때 체크해야할 조건은 다음과 같다.
- 격자 안에서만 움직여야 한다.
- 돌이 있는 곳으로 움직일 경우, 돌과 함께 움직여야 한다.
- 이때 돌 또한 격자 안에서 움직여야 한다.
- 돌이 격자 밖으로 나가는 경우도 체크하되, 이때 킹이 격자 내에서 움직인다면 상관없이 움직인다
이를 코드로 나타내면 다음과 같다.
# 격자 내에서 해결해야한다.
if (0 <= king_row+r < 8 and 0 <= king_col+c < 8):
# king이 rock이랑 같은 방향으로 갈 경우
if (king_row+r == rock_row) and (king_col+c == rock_col):
# 돌이 움직일 수 있다면 (격자 내라면 같이 이동)
if (0 <= rock_row+r < 8 and 0 <= rock_col+c < 8):
rock_row += r
rock_col += c
king_row += r
king_col += c
# 돌이 격자 밖으로 움직이는 경우
else:
continue
else:
king_row += r
king_col += c
돌과 킹이 함께 움직이되 킹이 우선순위다. 이 케이스들을 if로 분기해주었다.
전체 코드
# 행: row, 열: col
row = {'8':0, '7':1, '6':2, '5':3, '4':4, '3':5, '2':6, '1':7}
col = {'A':0, 'B':1, 'C':2, 'D':3, 'E':4, 'F':5, 'G':6, 'H':7}
move = {'R':(0,1), 'L':(0,-1), 'B':(1,0), 'T':(-1,0), 'RT':(-1,1), 'LT':(-1,-1), 'RB':(1,1), 'LB':(1,-1)}
king, rock, n = input().split()
n=int(n)
graph = [[0 for _ in range(8)] for _ in range(8)] # 8*8 체스판
king_row, king_col = row[king[1]], col[king[0]]
rock_row, rock_col = row[rock[1]], col[rock[0]]
graph[rock_row][rock_col] = 1
for _ in range(n):
command = input()
r,c = move[command][0], move[command][1]
# 격자 내에서 해결해야한다.
if (0 <= king_row+r < 8 and 0 <= king_col+c < 8):
# king이 rock이랑 같은 방향으로 갈 경우
if (king_row+r == rock_row) and (king_col+c == rock_col):
# 돌이 움직일 수 있다면 (격자 내라면 같이 이동)
if (0 <= rock_row+r < 8 and 0 <= rock_col+c < 8):
rock_row += r
rock_col += c
king_row += r
king_col += c
# 돌이 격자 밖으로 움직이는 경우
else:
continue
else:
king_row += r
king_col += c
king_position=str()
for k,v in col.items():
if v == king_col:
king_position += k
for k,v in row.items():
if v == king_row:
king_position += k
print(king_position)
rock_position=str()
for k,v in col.items():
if v == rock_col:
rock_position += k
for k,v in row.items():
if v == rock_row:
rock_position += k
print(rock_position)
알게된 점
- 경우의 수를 모두 손으로 작성하고, 코드로 어떻게 분기할 것인지를 중점으로 구현하자.
'PS > BOJ&Programmers' 카테고리의 다른 글
[백준/1987] 알파벳 | DFS와 백트래킹 (1) | 2024.10.11 |
---|---|
[백준/1547] 공 | 두 수의 전환 (0) | 2024.07.05 |
[백준/5671] 호텔 방 번호 | 중복값 개수 세기(딕셔너리와 SET) (0) | 2024.03.17 |
[백준/1068] 트리 (0) | 2024.03.06 |
[백준/2606] 바이러스 | 양방향 그래프 정의 | DFS (0) | 2024.03.05 |