2학년 2학기 알고리즘 과제_5주차(백준_1063번:킹)
2024. 11. 13. 13:32ㆍAlgorithm ( p & swlug )/Baekjoon
📌문제 풀이 (내생각)
입력받은 킹과 돌의 위치를 조건에 맞게 이동하여 킹과 돌의 최종 위치를 구하는 문제인 것 같다.
일단 입력 조건에 따른 위치를 반복하여 계산해 나가면 코드를 구현 할 수 있을 것이다.
조건에 따른 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은 행에 해당하는 숫자를 출력한다.
📌 느낀점
해당 문제는 그림을 그려놓고 직접 이동하는 것을 시뮬레이션 돌려보면 조금더 수월하게 풀 수 있었을것 같은데, 알고리즘을 짜는 거 자체도 간단하지는 않아서 공부가 더 필요한 것 같다고 다시한번 느꼈다..
화이팅!
[ 참고 자료 ]
'Algorithm ( p & swlug ) > Baekjoon' 카테고리의 다른 글
2학년 2학기 알고리즘 과제_5주차(백준_1033번:칵테일) (0) | 2024.11.13 |
---|---|
2학년 2학기 알고리즘 과제_4주차(백준_24511번:queuestack) (2) | 2024.11.06 |
2학년 2학기 알고리즘 과제_4주차(백준_2346번:풍선 터뜨리기) (0) | 2024.11.06 |
2학년 2학기 알고리즘 과제_3주차(백준_1051번:숫자 정사각형) (0) | 2024.10.30 |
2학년 2학기 알고리즘 과제_3주차(백준_1045번:도로) (1) | 2024.10.30 |