하루일문

[백준] 1063번 킹 (파이썬) 본문

algorithm/baekjoon

[백준] 1063번 킹 (파이썬)

support_u 2023. 2. 26. 07:00

문제

 

1063번: 킹

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

www.acmicpc.net

체스 판에서 움직이는 문제이다.

포인트는 움직이는 방법을 정의해주고, 체스판의 형태를 잘 이해하여 체스를 움직이는 것이다.

공간을 이해한다면 수월하게 풀 수 있다.

코드

# 움직이는 방향
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)}

k, s, n = map(str, input().split())

# king과 stone의 위치를 정의
k_x = 8 - int(k[1])
k_y = ord(k[0]) - 65

s_x = 8 - int(s[1])
s_y = ord(s[0]) - 65

for _ in range(int(n)):
    m = input()
	# 체스판에 king이 있다면
    if 0 <= k_x + move[m][0] < 8 and 0 <= k_y + move[m][1] < 8:
        if k_x + move[m][0] == s_x and k_y + move[m][1] == s_y:    
        	# stone을 밀어낼때 stone이 체스판에 있다면
            if 0 <= s_x + move[m][0] < 8 and 0 <= s_y + move[m][1] < 8:
                k_x = k_x + move[m][0]
                k_y = k_y + move[m][1]
                s_x = s_x + move[m][0]
                s_y = s_y + move[m][1]
            else:
                continue
        # stone을 밀지 않는다면
        else:
            k_x = k_x + move[m][0]
            k_y = k_y + move[m][1]
    else:
        continue

# 결과 값이 나오게 다시 변환
print(chr(k_y + 65), str(8 - k_x), sep = "")
print(chr(s_y + 65), str(8 - s_x), sep = "")

해설

나는 문자에서 숫자 변환을 유니코드를 반환하거나 보여주는 함수 ord()와 chr()을 써줬다.

체스판에서 떨어지면 continue로 다음 입력을 받으러 가게 설정했고, 그게 아니라면 stone에 따라 조건을 걸어줬다.

 

전에 한번 풀어봤던 문제인데, 그때 시간을 오래써서 다시 풀려고 북마크를 걸어놨던 문제이다. 그땐 graph를 만들어서 옮겨주느라 고생했던 기억이 있다. 이번에는 그래프를 사용하지 않아서 그때에 비해 수월하게 풀수 있었다