본문 바로가기
PS/BOJ&Programmers

[백준/1063] 킹 | 구현 실수 방지를 위한 경우의 수 체크하기

by sebinChu 2024. 3. 31.

 

1063번: 킹

8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는데, 알파벳은 열을 상징하고, 숫자는

www.acmicpc.net

 


알고리즘

킹이 움직인다. 이때 체크해야할 조건은 다음과 같다. 

 

  • 격자 안에서만 움직여야 한다.
  • 돌이 있는 곳으로 움직일 경우, 돌과 함께 움직여야 한다.
  • 이때 돌 또한 격자 안에서 움직여야 한다.
  • 돌이 격자 밖으로 나가는 경우도 체크하되, 이때 킹이 격자 내에서 움직인다면 상관없이 움직인다

 

이를 코드로 나타내면 다음과 같다.

# 격자 내에서 해결해야한다.
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)

 

 


 

알게된 점

  • 경우의 수를 모두 손으로 작성하고, 코드로 어떻게 분기할 것인지를 중점으로 구현하자.

 

 

댓글