2학년 2학기 알고리즘 과제_5주차(백준_1063번:킹)

2024. 11. 13. 13:32Algorithm ( p & swlug )/Baekjoon

1063번: 킹

 

 

 

 

📌문제 풀이 (내생각)

 

입력받은 킹과 돌의 위치를 조건에 맞게 이동하여 킹과 돌의 최종 위치를 구하는 문제인 것 같다.

일단 입력 조건에 따른 위치를 반복하여 계산해 나가면 코드를 구현 할 수 있을 것이다.

 

조건에 따른 R,L,B,T 등을 딕셔너리로 받을 수 있도록 하고,  chess의 행이 알파벳으로 주어졌으므로, 이걸 숫자로 변환할 chess를 리스트로 만들어 주면 될 것 같다.

 

 

📌 코드 분석

import sys
king, stone, N = sys.stdin.readline().split()
#킹의 이동 방향
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)}
chess = ['A', 'B' ,'C', 'D', 'E', 'F', 'G', 'H'] # 가로 위치
k1, k2 = (8-(int(king[1])),chess.index(king[0])) # 킹의 열, 행
s1, s2 = (8-(int(stone[1])),chess.index(stone[0])) # 돌의 열, 행
for _ in range(int(N)):
    a, b = move[sys.stdin.readline().strip()]
    if 0 <= k1+a < 8 and 0 <= k2+b < 8: # 킹이 범위 밖을 벗어나지 않으면
        k1, k2 = k1 + a, k2 + b # 킹 이동해보고
        if k1 == s1 and k2 == s2: #그 때 돌과 킹의 위치가 같아지면
            s1, s2 = s1 + a, s2 + b # 돌도 킹과 같은 방향으로 이동
    if s1 <0 or s1 >= 8 or s2 <0 or s2 >= 8: # 만약 돌을 옮겨서 범위를 벗어나면
        k1, k2 = k1 -a, k2 - b # 킹 원위치
        s1, s2 = s1 -a, s2 - b # 돌도 원위치
print(chess[k2], 8-k1,sep='')
print(chess[s2], 8-s1,sep='')

 

import sys king, stone, N = sys.stdin.readline().split()
 
  • king, stone, N은 각각 킹의 초기 위치, 돌의 초기 위치, 이동 명령의 개수를 나타낸다.
  • king과 stone은 체스판의 위치를 의미하며, 예를 들어 "A1", "B2"와 같은 형식으로 주어진다.
  • N은 이동 명령의 수를 나타내는 정수
 
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) }
 
  • move는 각 명령에 따라 킹이 이동할 방향을 나타내는 딕셔너리이다.
  • 예를들어  'R'은 오른쪽으로, (0, 1)은 열을 1 증가시키는 것을 의미한다.
  • 모든 방향은 (행, 열)의 튜플로 표현되어 있다.

 

chess = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H'] k1, k2 = (8 - int(king[1]), chess.index(king[0])) s1, s2 = (8 - int(stone[1]), chess.index(stone[0]))
 
  • chess 리스트는 체스판의 가로 위치를 A~H로 표현하기 위한 리스트이다.
  • k1, k2는 킹의 초기 위치를 행과 열로 변환한 결과이다.
    • 8 - int(king[1]): 체스판의 숫자를 행으로 변환하기 위해 8에서 숫자를 뺀다.
    • chess.index(king[0]): 킹의 문자 위치를 열로 변환한다.
  • s1, s2는 돌의 초기 위치를 킹과 같은 방식으로 변환한 결과이다.
 
 
  • a, b = move[sys.stdin.readline().strip()]에서 이동 명령을 받아 a, b로 킹의 이동 방향을 구한다.
  • 킹 이동을 위해 0 <= k1 + a < 8 and 0 <= k2 + b < 8 조건은 킹이 체스판 안에 있을 때만 이동하게 한다.
  • 돌과 킹의 위치가 같아지면
    • k1 == s1 and k2 == s2 조건을 통해 킹과 돌이 같은 위치가 되면 돌도 킹과 같은 방향으로 이동시킨다.
  • 돌이 범위를 벗어나면
    • 돌이 체스판 밖으로 나가면 (s1 < 0 or s1 >= 8 or s2 < 0 or s2 >= 8 조건), 킹과 돌을 모두 원래 위치로 되돌린다.
 
print(chess[k2], 8 - k1, sep='') print(chess[s2], 8 - s1, sep='')
 
  • 최종적으로 킹과 돌의 위치를 체스판 형식으로 출력하게된다.
  • chess[k2]와 chess[s2]는 열에 해당하는 문자를, 8 - k1과 8 - s1은 행에 해당하는 숫자를 출력한다.

 

📌 느낀점

 

해당 문제는 그림을 그려놓고 직접 이동하는 것을 시뮬레이션 돌려보면 조금더 수월하게 풀 수 있었을것 같은데, 알고리즘을 짜는 거 자체도 간단하지는 않아서 공부가 더 필요한 것 같다고 다시한번 느꼈다..

화이팅!

 

 

 

[ 참고 자료 ]

 

[백준 1063] 킹 (python)

 

[백준 1063] 킹 (python)

https://www.acmicpc.net/problem/1063 1063번: 킹 8*8크기의 체스판에 왕이 하나 있다. 킹의 현재 위치가 주어진다. 체스판에서 말의 위치는 다음과 같이 주어진다. 알파벳 하나와 숫자 하나로 이루어져 있는

edder773.tistory.com