킹
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)
알게된 점
- 경우의 수를 모두 손으로 작성하고, 코드로 어떻게 분기할 것인지를 중점으로 구현하자.
'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 |
킹
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)
알게된 점
- 경우의 수를 모두 손으로 작성하고, 코드로 어떻게 분기할 것인지를 중점으로 구현하자.
'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 |